【问题标题】:SqlDateTime overflow thrown by Typed DataSet Insert类型化数据集插入引发的 SqlDateTime 溢出
【发布时间】:2011-02-09 10:33:30
【问题描述】:

我正在使用带有插入语句的类型化数据集;我有一个表,其中定义了一个 smalldatetime 字段以接受空值。当我从 .NET 2.0 FormView 插入时,出现“SqlDateTime 溢出。必须在 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。”

现在,我阅读了this post,发送给类构造函数的参数定义为

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

所以,它看起来应该接受一个 Nullable obj。此外,生成的代码正在测试发送的值。

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

具体来说,生成的SqlClient.SqlCommand.ExecuteScalar() 运行时出现错误:

        try {
            returnValue = command.ExecuteScalar();
        }

所以,我想我的问题是:如何使用 Typed DataSet 将空值(从 CommandName=Insert 上的 FormView 传递)设置为数据库中的空值?

【问题讨论】:

  • 附加跟进:这里的部分问题是我无法调试它。作为一种变通方法,我复制了对象并制作了自己的对象。由于类型化的数据集为其表格适配器创建了部分类,因此我利用它并添加了 Insert 对象的副本。这使我可以在其上放置断点并查看值是什么。第二部分:如果您查看 FormViewInsertEventArgs,日期被发送为空。但是,当您将其与 Insert 方法进行比较时,您会发现它已更改为 {1/1/0001 12:00:00 AM}...需要更多工作...
  • 好的,MS 实现其反射例程的方式肯定有一个错误。如果我将方法中的参数类型更改为字符串,它会显示为空白。如果我评估 Nullable nix = "";我确实得到一个空值。 必须 ObjectDataSourceMethod GetResolvedMethodData() 调用中有问题,因为它正在创建一个参数列表来调用该方法。在某个地方,我认为它只是在做一个新的 DateTime(),而不是一个新的 Nullable()。我只是没有更多的时间去寻找它。

标签: strongly-typed-dataset


【解决方案1】:

好的,这就是对我有用的方法。首先,重申一下,我有一个带有生成 ADO 对象的 DataAdapters 的 Typed DataSet。因此,在我的页面上,我可以使用指向我的适配器的类型创建一个 ObjectDataSource,然后命名其中包含的不同访问方法。

不,我有一个插入到基本上所有列都可以为空的表中;一些 varchar,一些 smalldatetime。

当我提交空表单时,我希望输入空值。它们不是,并且会引发许多各种错误。我最终做的是继承 ObjectDataSource 以获得对 Inserting 事件的访问权限。 (为可重用性子类化) 在 Inserting 事件中,我循环了 InputParameters,如果它是字符串和 == "",我将其设置为 null。此外,您不能将 ConvertNullToDBNull 设置为 true;这会导致字符串失败。这成功地允许 Nullable 保持为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多