【问题标题】:C# Fatal error encountered during command execution在命令执行期间遇到 C# 致命错误
【发布时间】:2016-10-18 05:40:01
【问题描述】:

我尝试通过我的应用程序(C# winapp)执行此命令,但它显示错误,如必须定义参数'@sqlstmt',但我通过 navicat 尝试此命令它运行良好,请帮助我

"DELIMITER $$" +

                " DROP PROCEDURE IF EXISTS " + txtDB.Text + ".`index_startTime` $$" +
                " CREATE PROCEDURE " + txtDB.Text + ".`index_startTime`" +
                " (" +
                    " given_database VARCHAR(64)," +
                    " given_table    VARCHAR(64)," +
                    " given_index    VARCHAR(64)," +
                    " given_columns  VARCHAR(64)" +
                " )" +
                " BEGIN" +

                    " DECLARE IndexIsThere INTEGER;" +

                    " SELECT COUNT(1) INTO IndexIsThere" +
                    " FROM INFORMATION_SCHEMA.STATISTICS" +
                    " WHERE table_schema = given_database" +
                    " AND   table_name   = given_table" +
                    " AND   index_name   = given_index;" +

                    " IF IndexIsThere = 0 THEN" +
                        " SET @sqlstmt = CONCAT('CREATE INDEX ',given_index,' ON '," +
                        " given_database,'.',given_table,' (',given_columns,')');" +
                        " PREPARE st FROM @sqlstmt;" +
                        " EXECUTE st;" +
                        " DEALLOCATE PREPARE st;"+
                    " ELSE" +
                        " SELECT CONCAT('Index ',given_index,' already exists on Table ',"+
                        " given_database,'.',given_table) CreateindexErrorMessage; "+
                    " END IF;"+

                " END $$" +

                " DELIMITER ;"; 

【问题讨论】:

  • 整个事情应该是一个逐字字符串文字@),这样你就不必那样编程了。变量替换可能会发生 concat 或其他创造性。
  • 也许它不需要分隔符包装器。我可以测试一下

标签: c# mysql


【解决方案1】:

该场景需要调整 mysql 连接以支持用户变量。比如

string connString = @"server=localhost;userid=myUser;password=thePassword;database=stackoverflow;Allow User Variables=True";

(注意上面的结尾)。请参阅 MySQL 手册页 here 关于 Allow User Variables=True 。如果您不这样做,它将在 @ 符号与用户变量部分中的字符串一起出现时阻塞 bigtime。

测试:

public void testCreateFunctionOnDB()
{   // http://stackoverflow.com/questions/40100348

    using (MySqlConnection lconn = new MySqlConnection(connString))
    {
        lconn.Open();
        MySqlCommand cmd = new MySqlCommand();
        string sXX = @"DROP PROCEDURE IF EXISTS asdf7; 
        CREATE PROCEDURE asdf7() 
        BEGIN 
        SET @sqlstmt = 'dog';  
        IF 1=1 THEN 
          SET @sqlstmt = CONCAT('qwerty ',1,2); 
        END IF; 
        SELECT @sqlstmt; 
        END";  
        cmd.Connection = lconn;
        cmd.CommandText = sXX;
        cmd.ExecuteNonQuery();
    }
}

并将其成功保存到 proc 到数据库的屏幕截图:

还请注意我在您的问题下的 cmets 中提到的内容。使用 c# 端的简单 CONCAT,将变量插入到像您这样的表名等查询中很容易。

如果存在与 Allow User Variables=True 相关的安全风险(我不怀疑存在),则让此连接字符串调整仅与此例程相关,而不是全局相关。

这里的另一个要点是 DELIMITER 至少在我的测试中不是必需的(类似于 PHPMyAdmin 和 SQLFiddle)。不同于 MySQL Workbench / Navicat / SQLYog(也许)/ Toad(也许)

【讨论】:

    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2014-10-13
    • 1970-01-01
    • 2014-04-25
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多