【问题标题】:Execute MySQL's SQL files using .NET使用 .NET 执行 MySQL 的 SQL 文件
【发布时间】:2018-11-24 14:20:09
【问题描述】:

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

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

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

下面是我经常运行的一个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');

有什么办法可以解决这个问题吗?我愿意接受其他方式。

提前致谢!

【问题讨论】:

    标签: mysql sql .net vb.net


    【解决方案1】:

    假设您有包含数据库名称的连接字符串,则无需在脚本中附加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 关键字。

    参考:Using Delimiters with MySqlScript

    【讨论】:

    • 非常感谢!我的印象是,当工作台专门使用分隔符时,通过 .net 执行命令文本时我仍然需要使用分隔符。您的回答很有帮助!
    • 能否请您更新答案中的链接!!!?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2015-01-29
    • 2011-05-23
    • 1970-01-01
    • 2017-05-04
    • 2012-06-09
    相关资源
    最近更新 更多