簡體   English   中英

通過C#代碼更新SQL表

[英]Update SQL table through C# code

我想通過在ac#應用程序中執行的sql代碼更新表。 為此,我使用了生成MSSMS的alter data並將其手動保存為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'.

每一批(以GO結尾)應分別在一個command.ExecuteNonQuery()發送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);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM