我一直在从一个线程跳到另一个线程,但是我似乎找不到所需的答案。
我想使用.NET在单个ExecuteNonQuery函数中执行非SELECT MySQL语句。
这是我要运行的一组SQL语句示例:
DROP procedure IF EXISTS `SubProcA`;
DROP procedure IF EXISTS `SubProcB`;
DROP procedure IF EXISTS `SubProcC`;
CREATE PROCEDURE 'SubProcD'()
BEGIN
SELECT
(<Subselect Statement>) AS A
,(<Subselect Statement>) AS B
,(<Subselect Statement>) AS C;
END;
CREATE PROCEDURE 'SubProcE'(
VarA TEXT,
VarB VARCHAR(255),
VarC VARCHAR(255),
VarD tinyint(1)
)
BEGIN
SET @Query = "";
SET @Query = <Select Statement>;
PREPARE Statement FROM @Query;
EXECUTE Statement;
DEALLOCATE PREPARE Statement;
END;
如您所见,其中有五个语句(3个DROP和2个CREATE)。我在.NET中所做的是:
CommandText = <The SQL Statement above stored in a String variable>
Connection.Open()
Command.CommandType = CommandType.Text
Command.ExecuteNonQuery()
Connection.Close()
假设sql语句没有语法错误,运行代码时我仍然会收到错误消息。
我尝试砍掉(运行一条语句)的sql语句,并且将其推送通过。
我想在其中放一些特殊字符吗?
答案 0 :(得分:4)
在.net中,这些多个串联查询被称为batch
。
必须在连接字符串中告诉MySQL连接器(用于MySQL的.net驱动程序)。使用AllowBatch
option。
类似这样的东西:
var connectionString = Server=host;Database=db;Uid=user;Pwd=pass;AllowBatch=True;
您不能在批处理中包括存储过程调用。他们必须与...CommandType=CommandType.StoredProcedure
一起站立。
但是,这可能不起作用,具体取决于服务器和连接器的版本。如果不只是使用“切掉” SQL语句的解决方法。它工作正常,不会以可怕的方式破坏性能。
答案 1 :(得分:0)
所以我设法找到一种方法来完成这项工作:
allowbatch=true;allowuservariables=true;
。Delimiter $$
或Delimiter //
及其尾部(位于$$
的{{1}}或//
)这是我使用的测试代码:
END
我基本上在更新远程独立服务器时使用了这种样式。我将复制对表,子proc等进行的所有更改的更新脚本。将它们放入一个sql文件中,将其在线存储(我使用Dropbox API),然后让我的应用程序(在客户端上)下载并应用在自己的本地数据库中进行更改。
Try
Dim CONN = New MySql.Data.MySqlClient.MySqlConnection("server=localhost;user=<user>;database=<database>;port=3306;password=<password>;allowbatch=true;allowuservariables=true;")
Dim CMDTXT =
<sql>
DROP procedure IF EXISTS `sample`;
CREATE PROCEDURE `sample`(
in_varA int(11),
in_varB int(11),
in_varC int(11)
)
BEGIN
SET @query = CONCAT("SELECT ",in_varA + in_varB + in_varC);
PREPARE Statement FROM @Query;
EXECUTE Statement;
DEALLOCATE PREPARE Statement;
END;
</sql>
CONN.Open()
Using TRAN = CONN.BeginTransaction
Using CMD = CONN.CreateCommand
CMD.CommandText = CMDTXT.Value
CMD.CommandType = CommandType.Text
CMD.ExecuteNonQuery()
TRAN.Commit()
End Using
End Using
CONN.Close()
Catch ex As Exception
MsgBox(ex.Message)
Exit Sub
End Try
MsgBox("success")
我需要SET @query = CONCAT("SELECT ",in_varA + in_varB + in_varC);
PREPARE Statement FROM @Query;
EXECUTE Statement;
DEALLOCATE PREPARE Statement;
,因此可以在查询中声明allowuservariables=true;
和其他变量。我上面使用的代码段允许我创建动态子过程-根据需求建立一个自己的查询。
我希望这会对其他人有所帮助。
特别感谢O. Jones。