我一直在从一条线跳到另一条线,但似乎找不到我需要的答案。
我想使用.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个creates)。我在.net中所做的是:
CommandText = <The SQL Statement above stored in a String variable>
Connection.Open()
Command.CommandType = CommandType.Text
Command.ExecuteNonQuery()
Connection.Close()
假设sql语句没有任何语法错误,在运行代码时仍然会出现错误。
我试着切碎(运行一条语句)的sql语句,然后它就成功了。
我是不是应该在里面放些特别的东西?
2条答案
按热度按时间mrzz3bfm1#
所以我设法找到了一个方法来实现这一点:
我使用mysqlclient而不是odbc。
在连接字符串中,包括
allowbatch=true;allowuservariables=true;
.删除
Delimiter $$
或者Delimiter //
它的尾巴$$
或者//
位于END
)把所有的东西都放到一个字符串变量中,然后开火。只要确保你的sql语法是正确的。
这是我使用的测试代码:
我基本上在更新远程独立服务器时使用了这种风格。我会复制我对表、子进程等所做的所有更改的更新脚本,将它们放入一个sql文件中,在线存储(我使用dropbox api),然后让我的应用程序(在客户端)下载它并将更改应用到自己的本地数据库中。
我需要那个
allowuservariables=true;
所以我可以宣布@query
以及查询中的其他变量。我在上面使用的代码段允许我创建动态子脚本——根据需求构建自己的查询。我希望这能帮助别人。
特别感谢o。琼斯。
vlurs2pr2#
这些多个串联查询称为
batch
用.net的说法。您必须告诉mysql连接器(mysql的.net驱动程序)您想在连接字符串中使用批处理。使用
AllowBatch
选项。像这样:
不能在批处理中包含存储过程调用。他们必须单独面对
...CommandType=CommandType.StoredProcedure
.但是,根据服务器和连接器的版本,这可能不起作用。如果它不只是使用你的变通方法“斩断”sql语句。它运行良好,不会以一种可怕的方式破坏性能。