使用.NET执行MySQL的SQL文件

时间:2018-11-24 14:20:10

标签: mysql sql .net vb.net

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

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

不幸的是,我被定界符推入了错误。如果删除定界符,则无法运行存储的proc更新查询(或者我丢失了什么?)。

这是我通常运行的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');

有什么办法可以实现这一目标?我愿意接受其他方式。

谢谢!

1 个答案:

答案 0 :(得分:0)

假定您具有包含数据库名称的连接字符串,则无需在脚本中附加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()以字符串形式读取整个文件内容,并将其传递到Query实例内的MySqlScript属性中:

' 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关键字。

参考:Using Delimiters with MySqlScript