admin

在.NET中将多个非SELECT MySQL语句作为单个命令文本执行

sql

我一直在从一个线程跳到另一个线程,但似乎找不到我需要的答案。

我想使用.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语句,并且将其推送通过。

我是否应该在其中放置一些特殊字符?


阅读 187

收藏
2021-07-01

共1个答案

admin

这些多个串联的查询batch在.net中被称为。

您必须告诉MySQL连接器(MySQL的.net驱动程序)要在连接字符串中使用批处理。使用AllowBatch选项

像这样的东西:

var connectionString = Server=host;Database=db;Uid=user;Pwd=pass;AllowBatch=True;

您不能在批处理中包括存储过程调用。他们必须与之站在一起...CommandType=CommandType.StoredProcedure

但是,这可能不起作用,具体取决于服务器和连接器的版本。如果不只是使用您的“切掉” SQL语句的解决方法。它工作正常,并且不会以可怕的方式破坏性能。

2021-07-01