使用 .NET 执行 MySQL 的 SQL 文件



每当我对数据库进行更新(存储过程中的更改、表中的更改和新表等(时,我都会创建一个新的sql文件,并通过TeamViewer在客户端的计算机上运行。

我希望我的应用程序更新自己的数据库。所以我决定让它通过ftp下载sql文件,然后使用ExecuteNonQuery或其他东西更新自己。

不幸的是,我被Delimiters推送错误卡住了。如果我删除了分隔符,则无法运行存储过程更新查询(或者我遗漏了什么?(。

以下是我通常运行的sql文件的示例内容:

USE 'iceberg';
DROP procedure IF EXISTS 'get_unpaidandduetickets';
DELIMITER $$
USE 'iceberg'$$
CREATE DEFINER='root'@'localhost' PROCEDURE 'get_unpaidandduetickets'()
BEGIN
SELECT
(SELECT IFNULL(COUNT(ticketid),0) FROM tickets WHERE balance > 0 AND status = 1) AS unpaidtickets
,(SELECT IFNULL(COUNT(ticketid),0) FROM tickets WHERE balance > 0 AND status = 1 AND DATE(duedate) = DATE(NOW())) AS dueticketstoday
,(SELECT IFNULL(COUNT(ticketid),0) FROM tickets WHERE balance > 0 AND status = 1 AND DATE(duedate) < DATE(NOW())) AS pastduetickets;
END$$
DELIMITER ;    
CALL set_databaseversion('001020181119');

有什么办法我能做到这一点吗?我对其他方式持开放态度。

提前感谢!

假设您有包含数据库名称的连接字符串,则不必在脚本中附加USE 'iceberg';DELIMITER $$,因为MySqlScript实例可以为您控制分隔符。因此,请按照以下示例调整脚本内容:

DROP procedure IF EXISTS 'get_unpaidandduetickets'$$
CREATE DEFINER='root'@'localhost' PROCEDURE 'get_unpaidandduetickets'()
BEGIN
-- procedure contents here
END$$
CALL set_databaseversion('001020181119')$$

然后,使用ReadAllText()以字符串形式读取整个文件内容,并将其传递到MySqlScript实例中的Query属性:

' connection string example
' see connectionstrings.com/mysql-connector-net-mysqlconnection/ for details
Dim connectionString As String = "Server=localhost;Port=3306;Database=iceberg;Uid=UserID;Pwd=Password"
Using con As New MySqlConnection(connectionString)
Dim content As String = System.IO.File.ReadAllText("scriptfilename.sql")
Dim sqlScript As New MySqlScript(con)
sqlScript.Query = content   ' query string
sqlScript.Delimiter = "$$"  ' delimiter setting
sqlScript.Execute()
' other stuff
End Using

注意:您可以创建自定义扩展方法,删除不必要的部分,如DELIMITERUSE关键字。

参考:在MySqlScript 中使用分隔符

最新更新