SqlCommandBuilder与转换语句



我有一个用。net语言构建的应用程序。

在这个应用程序中,我们主要读/写数据库(SQL Server 2005)。有时(对于单个输入)我只使用SQL查询,例如:

commandText = "INSERT INTO Test_Table (Number) VALUES ('10')";
command = new System.Data.SqlClient.SqlCommand(commandText, connection);
command.ExecuteNonQuery();

如果我想更新数据库中的一堆记录,我使用SqlCommandBuilder类,如下例所示:

adapter = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Test_Table WHERE Number = '9'",connection);
commandbuilder = new System.Data.SqlClient.SqlCommandBuilder(adapter);
dataset = new System.Data.DataSet();
adapter.Fill(dataset,"Example");
dataset.Tables["Example"].Rows[0].["Number"] = 10;
adapter.update(dataset,"Example");

这些工作很好。但是现在,由于某种原因,我需要插入/更新日期时间并在其上使用CONVERT函数。

单个SQL查询工作得很好:

t = System.DateTime.Now;
commandText = "INSERT INTO Test_Table (DateTime) VALUES (datetime, 't.toString()', 103)";
command = new System.Data.SqlClient.SqlCommand(commandText, connection);
command.ExecuteNonQuery();

这工作没有问题,但我不知道如何实现同样的事情使用我的SqlCommandBuilder脚本。我可以将所有内容更改为单个查询,但这将花费一周的时间。

我已经尝试了以下操作,但没有成功:

t = System.DateTime.Now;
adapter = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Test_Table WHERE Number = '9'", connection);
commandbuilder = new System.Data.SqlClient.SqlCommandBuilder(adapter);
dataset = new System.Data.DataSet();
adapter.Fill(dataset, "Example");
dataset.Tables["Example"].Rows[0].["DateTime"] = "CONVERT(datetime,'" + t.toString() + "',103);
adapter.update(dataset, "Example");

这行代码很奇怪:

dataset.Tables["Example"].Rows[0].["DateTime"] = "CONVERT(datetime,'" + t.toString() + "',103);

可以编译吗?具体来说,这样的:

.Rows[0].["DateTime"] 

我认为应该是:

.Rows[0]["DateTime"] 

但是不考虑语法…我不认为这是正确的做法。数据表(在数据集中)期望一个datetime对象(顺便说一句,不要按数据类型命名属性,这会导致混淆),并且您正在为它提供不兼容的东西。system .DateTime. now返回一个DateTime对象,然后您将它与字符串连接(再次,这是否编译?),我假设您希望它被注入到INSERT语句中?

既然你说要花一周的时间来修改所有的东西,我猜你有很多类似的代码需要修复。我看到三个可能的解决方案,都需要一些工作:

    创建数据库触发器
https://msdn.microsoft.com/en-us/library/ms189799.aspx

  • 为数据库中的DateTime字段添加一个默认值,并从select查询中删除DateTime。
  • http://www.w3schools.com/sql/sql_default.asp

    https://www.youtube.com/watch?v=INfi7jkdXC8(2:00左右开始观看)

  • 你可以写一个函数来做实际的文本替换,但它可能会很棘手:
  • dasdas

    private string ChangeDate(string insertQuery)
        {
        // find the location of the date column
        // replace the actual value with the "CONVERT(datetime,'" + actualValue + "',103)"
        // return the new value and store it in the sqlcommandbuilder.insertstatement
        }
    

    无可否认,这三种方法都需要工作,而且并不真正"优雅"。我会选择选项2,因为它看起来更省事。但我不知道这是否能解决你的问题。

    最新更新