我一直在从一个线程跳到另一个线程,但似乎找不到我需要的答案。
我想使用.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语句,并且将其推送通过。
我是否应该在其中放置一些特殊字符?
这些多个串联的查询batch在.net中被称为。
batch
您必须告诉MySQL连接器(MySQL的.net驱动程序)要在连接字符串中使用批处理。使用AllowBatch选项。
AllowBatch
像这样的东西:
var connectionString = Server=host;Database=db;Uid=user;Pwd=pass;AllowBatch=True;
您不能在批处理中包括存储过程调用。他们必须与之站在一起...CommandType=CommandType.StoredProcedure。
...CommandType=CommandType.StoredProcedure
但是,这可能不起作用,具体取决于服务器和连接器的版本。如果不只是使用您的“切掉” SQL语句的解决方法。它工作正常,并且不会以可怕的方式破坏性能。