[英]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.