国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Sql語句不能識別Go的解決辦法(動態創建表的觸發器)

2024-07-21 02:49:42
字體:
來源:轉載
供稿:網友
Sql語句不能識別Go的解決辦法(動態創建表的觸發器)問題來源

用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();                        }

有錯歡迎指正。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤城市| 江川县| 灵石县| 北宁市| 太仆寺旗| 栾川县| 子长县| 克拉玛依市| 鄂州市| 和政县| 如皋市| 梅州市| 祁连县| 安国市| 青铜峡市| 高邮市| 台江县| 双桥区| 临夏市| 霞浦县| 高阳县| 武穴市| 宜兰县| 陈巴尔虎旗| 防城港市| 元氏县| 莒南县| 台湾省| 怀来县| 深州市| 宁城县| 永安市| 虹口区| 朔州市| 元江| 昭觉县| 运城市| 吴旗县| 霞浦县| 清远市| 轮台县|