2010-04-18 42 views
2

我使用帶有Insert語句的Typed DataSet;我有一個表中有一個smalldatetime字段被定義爲接受空值。當我從.NET 2.0 FormView插入時,出現「SqlDateTime溢出,必須在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之間。」現在Typed DataSet引發的SqlDateTime溢出插入

,我讀過this post,並且發送到類的構造函數的參數定義爲

global::System.Nullable<global::System.DateTime> DoB 

因此,它看起來像它應該接受一個可空的obj。此外,生成的代碼正在測試發送的值。

 try { 
      returnValue = command.ExecuteScalar(); 
     } 

所以,我想我的問題是:我怎麼使用強類型DataSet將一個空的

 if ((DoB.HasValue == true)) { 
      command.Parameters[6].Value = ((System.DateTime)(DoB.Value)); 
     } 
     else { 
      command.Parameters[6].Value = global::System.DBNull.Value; 
     } 

具體而言,當產生SqlClient.SqlCommand.ExecuteScalar()運行在錯誤發生值(從CommandView = Insert上的FormView傳遞)到數據庫中的空值?

+0

其他跟進:這裏的部分問題是我無法調試。作爲解決方法,我複製了該對象並創建了自己的對象。由於類型化數據集爲他們的表適配器創建了部分類,我點擊它並添加了Insert對象的副本。這讓我在它上面放置了一個斷點,看看這些值是什麼。 第二部分:如果您查看FormViewInsertEventArgs,日期被髮送爲空。但是,當您將其與Insert方法進行比較時,您會發現它已更改爲{1/1/0001 12:00:00 AM} ...需要更多工作... – 2010-04-18 19:50:15

+0

好的,必須有一個錯誤MS實施其反射例程的方式。如果我將我的方法中的參數類型更改爲字符串,它會以空白形式出現。如果我評估Nullable nix =「」;我*做*得到空。在ObjectDataSourceMethod GetResolvedMethodData()調用中,必須有*錯誤,因爲它創建了一個參數列表來調用該方法。在某處,我認爲它只是在做一個新的DateTime(),而不是一個新的Nullable ()。我只是沒有更多時間去尋找它。 – 2010-04-18 21:16:39

回答

1

好吧,所以這裏是我的工作。首先,重申一下,我有一個帶有DataAdapters的Typed DataSet,用於生成ADO對象。因此,在我的頁面上,我可以創建一個指向我的適配器的類型的ObjectDataSource,然後命名其中的不同訪問方法。

不,我有一個基本上所有列都可以爲空的表格插入;一些varchar,一些smalldatetime。

當我提交一個空的表單時,我希望輸入空值。他們沒有和很多種各樣的錯誤被拋出。我最終做的是繼承ObjectDataSource以訪問Inserting事件。 (可重用的子類)在Inserting事件中,我通過InputParameters循環,如果它是一個字符串和==「」,我將它設置爲null。此外,您不能將ConvertNullToDBNull設置爲true;導致字符串失敗。這成功地允許Nullable保持爲空。