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_name
as
begin
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);
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_name
on dbo.tablename
for insert
as
begin
declare @ID int;
select @ID=ID from inserted;
end"></add>
<add
name="trigger_insert"
value="Create trigger trigger_name
on dbo.tablename
for insert
as
begin
declare @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();
}
有错欢迎指正。
Sql语句不能识别Go的解决办法(动态创建表的触发器)的更多相关文章
- SQL Server 2008 r2 输入SQL语句不能自动提示的解决办法
先利用“配置工具-SQL Server 配置管理器”关闭所有MSSQLSERVER服务,利用SQL Server Installation Center,进入Maintenance,选择Repair, ...
- webdav不识别软链接?解决办法?
webdav不识别软链接?解决办法? 在使用webdav实现公网存储共享的时候,发现webdav并不支持软链接的共享,如下源代码可以100%确定这个问题 /* ### for now, only pr ...
- SQL Analysis Services MDX 查询超时 解决办法
当页面有很多MDX语句查询的时候,会发生超时的情况. 解决办法: SQL Analysis Services所在的服务器(OLAP的文件夹下) 找到: msmdpump.ini 将: <Conf ...
- This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法
这是我们开启了bin-log, 我们就必须指定我们的函数是否是1 DETERMINISTIC 不确定的2 NO SQL 没有SQl语句,当然也不会修改数据3 READS SQL DATA 只是读取数据 ...
- SQL SERVER 2014 缺少Business Intelligence 解决办法
SQL SERVER 2014安装完所有的数据库工具后,缺少开发工具 Business Intelligence 之解决办法. https://msdn.microsoft.com/en-us/l ...
- SQL数据库对于保存特殊字符的解决办法
数据库的Char.Vachar类型可以兼容汉字,但特殊字符不行,在保存包含有特殊字符的字符串.正文时,会将特殊符号替换成一个”?”号. 例如: “基础教育课程手机报•特刊” == > “基础教育 ...
- SQL Server 2008 错误 233 的解决办法
问题一.忘记了登录Microsoft SQL Server 2008 的sa的登录密码 解决方法:先用windows身份验证的方式登录进去,然后在‘安全性’-‘登录’-右键单击‘sa’-‘属性’,修改 ...
- PHPcms v9 get标签sql 语句limit无效问题的解决方法
get标签非常好用,自定义模型后get几乎变成万能的了.但是PHPCMS升级到V9后,把2008的很多功能都去掉了,比如get标签中,在后面自动添加了一个LIMIT 0,20,这样你即使写了num=' ...
- Mysql错误: ERROR 1205: Lock wait timeout exceeded解决办法(MySQL锁表、事物锁表的处理方法)
Java执行一个SQL查询未提交,遇到1205错误. java.lang.Exception: ### Error updating database. Cause: java.sql.SQLExc ...
随机推荐
- js中window.print()去除页眉页脚
//jsp打印时去除页眉页页脚 打印前加入下面代码即可 var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER" ...
- Solr中schema.xml的解释
接Solr-4.10.2与Tomcat整合.schema.xml位于D:\solr\data\solr\collection1\conf\中.1.fieldType节点 name: FieldT ...
- win7_64位主机装虚机Linux系统(VMware Workstation10+CentOS6.5)详细步骤图文讲解
第一步:创建新的虚拟机 第二步:选择“典型”安装 第三步:选择映像文件安装—浏览选择iso文件 第四步:选择稍后安装操作系统 第五步:系统选择Linux,版本选择centOS64位 第六步:虚拟机名称 ...
- VS2015打开工程文件卡死
今天偶然遇到VS2015打开某个工程文件卡死,一直等待无响应: 关闭VS,打开另外一个工程文件是正常的: 开始怀疑是工程文件有问题,用VS2013打开是正常的,排除工程文件问题: 删除对应工程文件下的 ...
- C/C++中define的使用
代码: #include <iostream> using namespace std; #define a 10 void foo(); void bar(); void foo(){ ...
- 快速搭建Android 开发环境-使用ADT Bundle
一.搭建Android开发环境 近日要学Android开发基础,就着手搭建Windows下的Android开发环境. 找了一些相关的博文参考,基本上都是要分别下载和安装JDK, Eclipse, An ...
- 火狐下<a>标签里嵌套的<select>不能选的bug
今天遇到了这个问题,网上一找就找到原因了:在狐火下<a>标签里嵌套的<select>不能选 可是我查找这个问题过程中依然饶了一些时间,原因是在<a>标签没有写hre ...
- js prototype之诡异
想必经常写js的人必然会经常性的用到prototype这个属性,我写这篇文章倒不是自己对prototype这个属性理解有多深刻,相反是因为自己理解肤浅,想通过写文章来加深理解.废话不多说.下面总结一下 ...
- BufferedInputStream实现原理分析
原文地址:http://blog.sina.com.cn/s/blog_67f995260101huxz.html BufferedInputStream是一个带有缓冲区的输入流,通常使用它可以提高我 ...
- 重启电脑提示Error:no such partition grub rescue
我的系统是Win7,在使用Ubuntu12.04自带的Wubi.exe安装双系统时,系统提示重新启动计算机,重启后电脑就停留在了黑屏界面并提示: error:no such partition gru ...