我想通过在c#应用程序中执行的sql代码更新表。为此,我使用了生成我的MSSMS的alter data并手动将其保存为sql文件。然后c#读取文件并尝试执行它,但它不能。如果我自己使用sql代码它可以工作,但不是在c#funtion读取时。我的c#代码出了什么问题?
sql代码生成了我的MSSMS:
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.tTest ADD
NewColumn int NULL
GO
ALTER TABLE dbo.tTest SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
读取它的c#代码:
string content = string.Empty;
try
{
content = File.ReadAllText(string.Format(@"C:\temp\{0}.sql", name));
SqlConnection conn = new SqlConnection(ConnectionString);
SqlCommand command = new SqlCommand(content, conn);
command.Connection.Open();
command.ExecuteNonQuery();
command.Connection.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
来自c#功能的输出(控制台消息):
A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
答案 0 :(得分:2)
每个批次(以GO
结尾)应在一个command.ExecuteNonQuery()
中单独发送。此方法不能用于多个批次。
将您的查询拆分为多个部分(GO
为)并逐步执行。
答案 1 :(得分:0)
您尝试运行的脚本的核心问题是围绕查询批处理包装事务(查询批处理在SQL Server Management Studio中以GO
语句终止。)
要在C#中执行操作,您可以在一个查询批处理中执行这两个语句。它们不需要分开。如果将它们包装在SqlCommand
对象中的一个查询中,则不需要处理事务,因为创建了“隐式”事务。
要注意的最后一点是正确处理实现IDisposable
的对象。在C#中执行此操作的最简单方法是将它们包装在using
子句中。完成后,不再需要在命令/连接对象上调用Close
方法。
结合所有这些评论可以得到以下代码:
try
{
using(var conn = new SqlConnection(ConnectionString))
using(var command = new SqlCommand(
@"ALTER TABLE dbo.tTest ADD NewColumn int NULL;
ALTER TABLE dbo.tTest SET (LOCK_ESCALATION = TABLE);", conn))
{
conn.Open();
command.ExecuteNonQuery();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}