2010-04-18 27 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保持为空。

相关问题