用sqlserver直接打開sql文本,執行沒問題,但是當用Sqlcommand類執行cmdtext命令文本時總是失敗報錯。
原因分析及解決用數據庫直接執行sql語句沒問題,甚至還可以用Go來進行分批處理,但是當你用鏈接類訪問數據庫,并執行sql語句時就有些限制,如下:
System.Data.SqlClient.SqlCommand cmd;try{ using (System.Data.SqlClient.SqlConnection newconn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=Rfa_LPP3;Integrated Security=True")) { cmd = new System.Data.SqlClient.SqlCommand("Create trigger triggerName on dbo.tableName for insert as begin declare @ID int; select @ID=ID from inserted; PRint @ID end", conn); cmd.ExecuteNonQuery(); cmd.Dispose(); }}cath(Exception ex){ throw;//會拋出異常}
會“go附近有語法錯誤”“'CREATE TRIGGER' 必須是查詢批次中的第一個語句”等錯誤
首先來看下GO的用法:
SQL Server 實用工具將 GO 解釋為應將當前的 Transact-SQL 批處理語句發送給 SQL Server 的信號。SQL Server 應用程序可將多條 Transact-SQL 語句作為一個批處理發給 SQL Server 去執行。在此批處理中的語句編譯成一個執行計劃。程序員在 SQL Server 實用工具中執行特定語句,或生成 Transact-SQL 語句腳本在 SQL Server 實用工具中運行,用 GO 來標識批處理的結束
注意:1.GO 命令和Transact-SQL 語句不可在同一行上。但在 GO 命令行中可包含注釋。2.CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER 和 CREATE VIEW 語句不能在批處理中與其它語句組合使用。批處理必須以 CREATE 語句開始。所有跟在該批處理后的其它語句將被解釋為第一個 CREATE 語句定義的一部分
再來看看SqlCommand類的解釋:表示要對 SQL Server 數據庫執行的一個 Transact-SQL 語句或存儲過程。所以用SqlCommand去執行的文本內容可以是多條sql語句,或者是一個存儲過程,或者觸發器創建等,但是不能與觸發器創建等組合使用,且不能使用Go批結束命令。
但是,我又想在一個MySQL.sql文本中一起執行,該怎么辦呢?
提供三種思路:
1.將創建觸發器的sql當字符串放到變量里面,然后exec執行變量。
2.將創建觸發器的sql放在存儲過程,然后exec存儲過程執行。
3.將創建觸發器的sql單獨執行一次。每個創建的sql單獨取出來執行。
最后貼上代碼.
1.方法1可執行的sql
USE [LPP12] declare @sql nvarchar(max);set @sql='Create trigger triggerName on dbo.tableName for insert as begin declare @ID int; select @ID=ID from inserted; print @ID end';exec(@sql);
2.方法2的sql
create procedure proc_nameasbegindeclare @sql nvarchar(max);set @sql='Create trigger triggerName on dbo.tableName for insert as begin declare @ID int; select @ID=ID from inserted; print @ID end';exec(@sql); end
3.方法3:將sql存放在xml里面,每次取出執行一次。
//xml內容<?xml version="1.0" encoding="utf-8" ?><TR> <add name="trigger_insert" value="trigger_familyContent_insert" value="Create trigger trigger_nameon dbo.tablenamefor insertas begindeclare @ID int;select @ID=ID from inserted; end"></add> <add name="trigger_insert" value="Create trigger trigger_nameon dbo.tablenamefor insertas begindeclare @ID int;select @ID=ID from inserted; end"></add> </TR> //c#代碼 System.Data.SqlClient.SqlCommand cmdnew; try { string _XmlPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"/SqlCreateTrggers.xml"; XmlDocument doc = new XmlDocument(); doc.Load(_XmlPath); XmlNodeList nodes = doc.SelectSingleNode("TR").ChildNodes; using (System.Data.SqlClient.SqlConnection newconn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=Rfa_LPP3;Integrated Security=True")) { newconn.Open(); cmdnew = new System.Data.SqlClient.SqlCommand(); foreach (XmlElement node in nodes) { string value = node.Attributes["value"].Value; cmdnew = new System.Data.SqlClient.SqlCommand(value.Replace("/r", " ").Replace("/n", " ").Replace("/t", " "), newconn); int count = cmdnew.ExecuteNonQuery(); } cmdnew.Dispose(); newconn.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadKey(); }
有錯歡迎指正。
新聞熱點
疑難解答