2014-09-22 48 views
0

我想通過在c#應用程序中執行的sql代碼更新表。爲此,我使用生成的MSSMS生成的數據並手動將其保存爲一個sql文件。然後c#讀取文件並嘗試執行它,但它不能。如果我單獨使用sql代碼,它會起作用,但不能在用c#函數讀取時使用。我的C#代碼有什麼問題?通過C#代碼更新SQL表

的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

每個批次(以GO結尾)應分開發送一個command.ExecuteNonQuery()。此方法不適用於多批次。

將您的查詢拆分爲幾個部分(其中GO是)並逐步執行。

+0

你的先生,是一個天才要比! – Dave 2014-09-22 07:27:02

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); 
     } 
+0

我的SQL代碼是從MSSQL自動生成的,我不希望人們爲每次更新數據庫都編輯它 – Dave 2014-09-22 13:03:52