2016-07-25 3 views
-1

VS-Studio 2012 Web Express, ASP.NET, WebForms, VB, SQL Server, application WebSite des difficultés pour enregistrer une valeur NULL pour DateTime à la ligne fortement typé:Comment enregistrer une date-heure nulle dans SqlServer DB? ne fonctionne pas

 Dim oRowVEHICLES As Main_TblAdap.tVEHICLESRow = odtVEHICLES.Rows(0) ' (0) is the first row. 
     oRowVEHICLES.[WElectrical] = If(WElectrical.Year < 10, DBNull.Value, WElectrical) 
...etc... 

Actuellement, le champ de saisie de champ de modèle DetailsView est < vide> ou vide ou "" et la fonction BLL le montre comme une date comme: # 01/01/0001 #. Donc, je teste la valeur YEAR de la variable passée si moins de 10 puis enregistrer DBNull.Value dans les oRowVehicles. [WElectrical] mais échoue depuis datatype = Date et ne peut pas convertir DBNull en date.

Le champ DB est de type Date et autorise les valeurs NULL.

La vue TableAdapter.xsd montre que la valeur par défaut est < DBNULL>. Alors, pourquoi les oRowVehicles ne sont-ils pas valables pour la date?

Comment rendre la colonne WElectrical nullable DATE?

Je dois être en train de négliger quelque chose, car je ne peux pas être le seul à enregistrer une valeur DATE optionnelle pour la Sql-DB.

Vos commentaires et solutions sont les bienvenus. Merci ... John

EDIT Code ASPX un champ de date dans le DetailsView (autres sont similaires):

   <asp:TemplateField HeaderText="Electrical End Date" SortExpression="WElectrical"> 
       <EditItemTemplate> 
        <TGADate:GADate ID="ucdtWElectrical" runat="server" Enabled="True" MinDate="01/01/1980" MaxDate="12/31/2050" 
         Caption="Electrical End Date" HideCaption="True" Width="100" 
         IsRequired="false" 
         UpdateMode="Conditional" 
         Text='<%# Bind("WElectrical")%>' /> 
       </EditItemTemplate> 
       <InsertItemTemplate> 
        <TGADate:GADate ID="ucdtWElectrical2" runat="server" Enabled="True" MinDate="01/01/1980" MaxDate="12/31/2050" 
         Caption="Electrical End Date" HideCaption="True" Width="100" 
         IsRequired="false" 
         UpdateMode="Conditional" 
         Text='<%# Bind("WElectrical")%>' /> 
       </InsertItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="lblWElectrical" runat="server" Text='<%# clsGA_Lib1.fnGetDateTextFromObject(Eval("WElectrical"))%>' Style="font-weight: bold;"></asp:Label> 
       </ItemTemplate> 
       <ItemStyle Font-Bold="true" /> 
       </asp:TemplateField> 

objet définition du paramètre DataSource dans le ASPX.

<asp:Parameter Name="WElectrical" Type="DateTime" /> 

Code de BLL:

<System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, False)> _ 
Public Function UpdateFromDetailsView(ByVal original_UID_VEHICLE As Int32, _ 
            ByVal VehicleNbr As String, _ 
...other function parameter variables...  
            ByVal WElectrical As Date, _ 
...other function parameter variables...  
            ) As Boolean 

    ' Get the new VEHICLE-row instance to be updated. 
    Dim odtVEHICLES As Main_TblAdap.tVEHICLESDataTable = Adapter.GetVhclByVhclID(original_UID_VEHICLE) 

    If odtVEHICLES.Count <> 1 Then 
    ' no matching record found, return false 
    Return False 
    End If 

    ' Populate the values of the ROW. 
    Dim oRowVEHICLES As Main_TblAdap.tVEHICLESRow = odtVEHICLES.Rows(0) ' (0) is the first row. 
    With oRowVEHICLES 
    ...setting row-field values... 
    .[WElectrical] = If(WElectrical.Year < 10, Nothing, WElectrical) 
    ...etc... 
    End With 

    ' Update the oRowVEHICLES. 
    Dim rowsAffected As Integer = Adapter.Update(odtVEHICLES) 

    ' Return TRUE if precisely one row was INSERTED, otherwise false. 
    Return CBool(rowsAffected = 1) 
End Function 

Modifier commentaire pour le code ci-dessus

Le paramètre WElectrical entrant dans la BLL-fonction est une date avec une valeur de # 01/01/0001 #.
Le code pour placer la valeur dans l'emprise objet

.[WElectrical] = If(WElectrical.Year < 10, Nothing, WElectrical) 

lieux Rien que la valeur de champ ligne objet.

L'adaptateur Adapter.Update (odtVEHICLES) met à jour le Sql-DB.

Alors, qu'est-ce qui cause la valeur # 01/01/0001 # à placer dans la Sql-DB?

définition de la colonne Sql-DB

enter image description here

//////// fin Modifier ///////////

+0

Si vous utilisez des objets .net, utilisez 'null' ou' Nothing'. N'utilisez 'DBNull' que lorsque vous travaillez directement avec la base de données, par exemple en envoyant un paramètre à une requête ou à un SP. 'WElectrical' est-il un champ de type' DateTime? '? Je ne suis pas dans VB, donc vous devrez peut-être faire ce qui est demandé ici: http://stackoverflow.com/questions/12595775/how-do-i-set-a-nullable-datetime-to-null-in-vb -net – Andrew

+0

Merci pour ce commentaire. Le lien est très informatif et très important. Je vais vérifier ces changements et vous le faire savoir. THX. –

+0

Il semble que vous utilisez un adaptateur de table. Vous devez définir le paramètre sur AllowNulls: https://msdn.microsoft.com/en-us/library/ms233762.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1 –

Répondre

0

de Merci à tous les commentateurs à la question ci-dessus. La solution est de changer la variable de colonne de ligne à cette phrase qui jette le Nothing to Date? (Annulable) comme suit ...

.[WElectrical] = If(WElectrical.Year < 10, CType(Nothing, Date?), WElectrical) 

ET - Changé le jeu de données-définition_colonne (dans le .xsd) comme suit:

DataType ==> System.Object (non Date)

NullValue ==> (Nothing) (non Exception Throw)

Mes sincères remerciements à tous les collaborateurs - puisque les éléments de chacun de leurs suggestions ont contribué à cette solution.
C'est la solution pour envoyer une valeur NULL dans la colonne DataRow.

Merci pour votre aide.

+0

Vous devriez marquer ceci comme réponse acceptée, ainsi votre question ne reste pas non résolue. – Andrew

+0

Merci @Andrew - comment je fais ça?Je l'ai marqué comme une coche verte. Est-ce correct? –

+0

Exactement, bien fait. :) – Andrew

0

faire un chose:

changement DBNull.Value Nothing

Sinon, vous peut changer le type de données dans le jeu de données à System.Object, et aller aux propriétés de cette colonne de données puis vous pouvez sélectionner '(Nothing)' dans la liste déroulante.

Définir la valeur NULL à >> Rien

+0

Merci pour votre réponse. J'ai changé DBNull.Value en Nothing et cela m'a permis de dépasser l'erreur de ne pas pouvoir convertir en Date-type. Cependant l'autre suggestion n'a pas enlevé le problème d'obtenir une valeur BIND de # 01/01/0001 #, qui peut être dans mon contrôle d'utilisateur pour la date-entrée sur l'écran. Le vrai problème est maintenant de savoir pourquoi # 01/01/0001 # est enregistré dans la base Sql-DB et non NULL. Je reviendrai à vous à ce sujet. THX. –

+0

Postez votre code afin que nous puissions trouver où le problème est. Vous devrez peut-être vérifier que la valeur est supérieure à 'DateTime.MinDate' avant la liaison. – Andrew

+0

extraits de code ajoutés - vos commentaires sont les bienvenus ... merci. –