带有 Convert 语句的 SqlCommandBuilder

Posted

技术标签:

【中文标题】带有 Convert 语句的 SqlCommandBuilder【英文标题】:SqlCommandBuilder With Convert Statement 【发布时间】:2015-07-10 14:17:12 【问题描述】:

我有一个使用 .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");

【问题讨论】:

【参考方案1】:

这行代码很奇怪:

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

它可以编译吗?具体来说:

.Rows[0].["DateTime"] 

我认为应该是:

.Rows[0]["DateTime"] 

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

既然您说更改所有内容需要一周时间,我假设您有很多类似的代码需要修复。 我看到了三种可能的解决方案,都需要一些工作:

    创建数据库触发器

https://msdn.microsoft.com/en-us/library/ms189799.aspx

    向数据库中的 DateTime 字段添加默认值,并从选择查询中删除 DateTime。

http://www.w3schools.com/sql/sql_default.asp

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

    您可以编写一个函数来进行实际的文本替换,但它可能会变得很棘手:

作为

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,因为它似乎更少工作。但我不知道这是否能解决你的问题..

【讨论】:

以上是关于带有 Convert 语句的 SqlCommandBuilder的主要内容,如果未能解决你的问题,请参考以下文章

在 vb.net 中将“字符串”转换为“SQlCommand”

使用SqlCommand 执行SQL语句

如何编写一个SqlCommand,在ASP.NET中的列中选择前3个最重复的值

SqlCommand的四大方法

积累——SQLCommand命令

ADO.NET_SqlCommand类