通过C#代码更新SQL表

本文关键字:SQL 更新 代码 通过 | 更新日期: 2023-09-27 18:23:55

我想通过在c#应用程序中执行的sql代码来更新表。为此,我使用了生成MSSMS的alter数据,并手动将其保存为sql文件。然后,c读取该文件并尝试执行它,但它无法执行。如果我自己使用sql代码,它就可以工作,但当被c函数读取时就不行了。我的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'.

通过C#代码更新SQL表

每个批次(以GO结尾)应在一个command.ExecuteNonQuery()中单独发送。此方法不能用于多个批次。

将查询拆分为多个部分(GO所在的位置)并逐步执行。

您尝试运行的脚本的核心问题是围绕查询批处理包装事务(在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);
        }