我用SQLCOMMAND执行这条语句
SELECT 12;
GO
会出现错误,那我要执行上面的SQL语句怎么执行?语句不能改。谁用NET类库或自定义类运行了上面的SQL,
300分(过几天会+分或者开贴点名)全部给没人能回答的话,100分全给
SELECT 12;
GO
会出现错误,那我要执行上面的SQL语句怎么执行?语句不能改。谁用NET类库或自定义类运行了上面的SQL,
300分(过几天会+分或者开贴点名)全部给没人能回答的话,100分全给
using System.Data.SqlClient;
using System.Text.RegularExpressions;namespace Skyiv
{
class SqlObject
{
protected SqlConnection conn; // 构造函数,参数为连接串。
protected SqlObject(string strConn)
{
conn = new SqlConnection(strConn);
} // 执行SQL,并返回查询所返回的结果集中第一行的第一列。
public object ScalarQuery(string sql, params SqlParameter [] paras)
{
sql = Regex.Replace(sql, @"(?i)\bgo\b", "");
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
cmd.Connection.Open();
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
return cmd.ExecuteScalar();
}
finally
{
cmd.Connection.Close();
}
}
}
}
{
static void Main()
{
string conn = "server=(local);Trusted_Connection=True";
string sql = "SELECT 12;\r\nGO";
int i = (int)new Skyiv.SqlObject(conn).ScalarQuery(sql);
Console.WriteLine(i); // 输出 12
}
}
1. 注释中包含的GO去掉是不会出现错误的。
2. 我去掉的是 \bgo\b,其中\b表示单词边界,也就是说GO前后都是非单词字符才会被去掉。
这样就不会把 SQL 语句中的列名 [GO] 之类的误去掉了。
在查询分析器中,也是要求 GO 必须在单独的一行,否则就出错,所以只要去掉单独一行的 GO 就行了。
GO
12';
GO--SELECT '12
--GO
--12';
--GO
查询分析器还不一样的先判断该数据库,然后读取相应的
内容..虽然还没明白你那意思..
在2000数据库的MASTER里面
你的语句完全没有任何问题..
我想数据库里面没问题,你传递进去的值只要没问题就OK的
..
我是要用.NET来运行上面的sql
那就用两个正则: // 第一步:先去掉所有注释(--comment 或 /*comment*/),防止注释中有单引号干扰下一步。
sql = Regex.Replace(sql, @"(?m)('(?:''|[^']*)')|--.*?$|/\*.*?\*/", "$1");
// 第二步:去掉所有不在单引号中的单独一行的 GO。
sql = Regex.Replace(sql, @"(?mi)('(?:''|[^']*)')|^\s*go\s*$", "$1");LZ看看还有什么特殊情况没考虑到?
因为 /\*.?\*/ 要能匹配多行注释,
这个 . 需要可以匹配换行符,所以加上 (?s)。 // 第一步:先去掉所有注释(--comment 或 /*comment*/),防止注释中有单引号干扰下一步。
sql = Regex.Replace(sql, @"(?ms)('(?:''|[^']*)')|--.*?$|/\*.*?\*/", "$1");
// 第二步:去掉所有不在单引号中的单独一行的 GO。
sql = Regex.Replace(sql, @"(?mi)('(?:''|[^']*)')|^\s*go\s*$", "$1");
呵呵,拆分sql执行总是不太好吧?
begin transaction ;
select 1;
go
select 2;
go
commit transaction;
using System.Data.SqlClient;
using System.Text.RegularExpressions;namespace Skyiv
{
public class SqlObject
{
protected SqlConnection conn; // 构造函数,参数为连接串。
public SqlObject(string strConn)
{
conn = new SqlConnection(strConn);
} // 执行SQL,并返回查询所返回的结果集中第一行的第一列。
public object ScalarQuery(string sql, params SqlParameter [] paras)
{
// 第一步:先去掉所有注释(--comment 或 /*comment*/),防止注释中有单引号干扰下一步。
sql = Regex.Replace(sql, @"(?ms)('(?:''|[^']*)')|--.*?$|/\*.*?\*/", "$1");
// 第二步:去掉所有不在单引号中的单独一行的 GO。
sql = Regex.Replace(sql, @"(?mi)('(?:''|[^']*)')|^\s*go\s*$", "$1");
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
cmd.Connection.Open();
foreach (SqlParameter para in paras)
{
cmd.Parameters.Add(para);
}
return cmd.ExecuteScalar();
}
finally
{
cmd.Connection.Close();
}
}
}
}测试:class Test
{
static void Main()
{
string conn = @"server=(local)\SQLEXPRESS;Trusted_Connection=True";
string sql = @"/*e'
*/SELECT '12''yy
--GO/*
12';
GO --r";
string s = (string)new Skyiv.SqlObject(conn).ScalarQuery(sql);
Console.WriteLine(s);
}
}/* 程序输出:
12'yy
--GO/*
12
*/
所以想,.NET有没有执行批处理的类或方法?
或这自己如何实现一个自定义的类。
.NET恐怕没有现成的类。自己定义的类,我想到的最简单的就是如上面所说的“去掉所有不在单引号中的单独一行的 GO”。或者可以考虑调用一个“微型的查询分析器”去执行SQL语句,并且要求能返回查询结果给调用它的程序。
不知对不对,顺便帮你顶上去
参考下这个
http://publish.it168.com/2005/0803/20050803071701.shtml
编程实现方法如下: System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand();
sqlCommand.Connection = this.Connection;//这里的 this.Connection 替换成你的SQL数据库连接 System.Collections.ArrayList al = new System.Collections.ArrayList();
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex( @"^(\s*)go(\s*)$", System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline | System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.ExplicitCapture );
al.AddRange( reg.Split(SQLString) );//SQLString是你的原始SQL批量语句,在这里通过上面的正则表达式进行分割,然后添加到集合(al实例)中。
foreach( string tmp in al )//循环执行每一个SQL代码块
{
sqlCommand.CommandText = tmp.Trim();
if( sqlCommand.CommandText.Length > 0 )
{
sqlCommand.ExecuteNonQuery();
}
}
呵呵,拆分sql执行总是不太好吧? begin transaction ;
select 1;
go
select 2;
go
commit transaction;
而且结果一样,什么事务啊,会话信息啊,结果统统一样,有没人弄过?