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
//////// fin Modifier ///////////
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
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. –
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 –