通过C#代码更新SQL表

时间:2014-09-22 07:02:32

标签: c# sql sql-server

我想通过在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'.

2 个答案:

答案 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);
        }