2016-07-25 181 views
-1

VS工作室2012網絡快車,ASP.NET,WebForms的,VB,SQLSERVER,有麻煩的DateTime NULL值保存到強類型ROW網頁應用:如何將空日期時間保存到SqlServer數據庫?不工作

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

目前DetailsView控件模板字段文本框是< blank>或空或「」,BLL函數將其顯示爲如下日期:#01/01/0001#。所以我測試傳入變量的YEAR值,如果小於10,則將DBNull.Value保存到oRowVehicles [WElectrical],但由於datatype = Date而失敗,並且無法將DBNull轉換爲Date。

DB字段是Date類型並允許空值。

TableAdapter.xsd視圖顯示默認值爲< DBNULL>。

那麼,爲什麼oRowVehicles不能日期爲空?

如何使WElectrical列可以爲空?

我必須忽略一些東西,因爲我不能將唯一一個將可選DATE值保存到Sql-DB。

歡迎您提出意見和解決方案。謝謝...約翰

編輯 ASPX代碼DATE一個在DetailsView(其它類似)域:在ASPX

   <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> 

DataSource對象的參數定義。

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

BLL代碼:對於上面的代碼

的WElectrical參數進入該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 

編輯評論是用#01 /的值的DATE 01/0001#。
的代碼值放入ROW對象

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

地方沒有什麼作爲行對象的字段值。

Adapter.Update(odtVEHICLES)更新Sql-DB。

那麼是什麼導致#01/01/0001#值被放入Sql-DB?

SQL的數據庫列定義

enter image description here

////////編輯結束///////////

+0

如果您正在處理.net對象,請使用'null'或'Nothing'。只有在直接處理數據庫時才使用'DBNull',比如向查詢或SP發送參數。 'WElectrical'是'DateTime'類型的字段嗎?我沒有進入VB,所以你可能需要做的是在這裏問:http://stackoverflow.com/questions/12595775/how-do-i-set-a-nullable-datetime-to-null-in-vb -net – Andrew

+0

謝謝你的評論。該鏈接非常豐富,非常重要。我將檢查這些更改並通知您。謝謝。 –

+0

看起來你正在使用表格適配器。 YOu需要將該參數設置爲AllowNulls:https://msdn.microsoft.com/en-us/library/ms233762.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1 –

回答

0

感謝上述問題的所有評論者。 解決方法是將Row-column-variable更改爲將句子轉換爲Nothing的句子? (可爲空)如下...

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

和 - 改變了數據集列定義(在的.xsd)如下:

數據類型==> System.Object的(沒有日期)

NullValue屬性==>(沒有)(未拋出異常)

衷心感謝所有貢獻者 - 因爲每個獻計獻策的元素都對這一解決方案做出了貢獻。
這是將可爲空的值發送到DataRow列的解決方案。

謝謝你的一切幫助。

+0

您應該將此標記爲已接受的答案,以便您的問題不會被解決。 – Andrew

+0

謝謝@安德魯 - 我該怎麼做?我將其標記爲綠色複選標記。這可以嗎? –

+0

確實,做得很好。 :) – Andrew

0

做一個事情:

變化DBNull.Value爲Nothing

另外,您可以將數據集中的數據類型更改爲System.Object,並且 轉到該數據colm 的屬性,然後您可以在下拉列表中選擇'(Nothing)'。

設置爲空值>> Nothing

+0

謝謝你的回答。我確實將DBNull.Value更改爲Nothing,這讓我越過了無法轉換爲Date類型的錯誤。然而,其他建議並沒有消除獲得#01/01/0001#的BIND值的問題,實際上可能在我的用戶控制屏幕上的日期輸入。現在真正的問題是爲什麼#01/01/0001#被保存到Sql-DB而不是NULL。我會就此回覆你。謝謝。 –

+0

發佈您的代碼,以便我們可以找到問題所在。在綁定之前,您可能需要檢查該值是否大於「DateTime.MinDate」。 – Andrew

+0

添加代碼片段 - 歡迎您的評論...謝謝。 –

相關問題