【问题标题】:MySQL Parameter must be defined with C#MySQL 参数必须用 C# 定义
【发布时间】:2016-12-26 10:42:34
【问题描述】:

我在 MySQL 数据库上创建了一个存储过程,如果我直接从 Navicat(SGBD)运行它,它工作正常,但如果我尝试从 C# 代码运行存储过程的脚本,我得到一个错误“参数'@ req' 必须被定义”。我的代码如下:

DROP PROCEDURE IF EXISTS SP_GET_EXPERIENCE_RECORD_STATISTICS;

CREATE PROCEDURE SP_GET_EXPERIENCE_RECORD_STATISTICS(IN startTime  VARCHAR(19), IN endTime VARCHAR(19), IN isEquipment INT)
BEGIN
DECLARE req VARCHAR(1000);
SET @req = "SELECT ";

IF(isEquipment = 1) THEN
    SET @req = CONCAT(@req, "ClientName,");
ELSE
    SET @req = CONCAT(@req, "ContentName 'ClientName',");
END IF;

SET req = CONCAT(req, " COUNT(1) 'ConsumeCount',
SUM(Points) 'PointsCount',
SUM(CASE WHEN Mode = 1 THEN 1 ELSE 0 END) 'CardCount',
SUM(CASE WHEN Mode = 1 THEN Points ELSE 0 END) 'CardPoints',
SUM(CASE WHEN Mode = 0 THEN 1 ELSE 0 END) 'WeChatCount',
SUM(CASE WHEN Mode = 0 THEN Points ELSE 0 END) 'WeChatPoints'
FROM experiencerecord
WHERE EndTime BETWEEN '", startTime, "' AND '", endTime, "'");

IF (isEquipment = 1) THEN
    SET @req = CONCAT(@req, " GROUP BY ClientName");
ELSE
    SET req = CONCAT(req, " GROUP BY ContentName");
END IF;

PREPARE stmt FROM @req;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;

 -- CALL SP_GET_EXPERIENCE_RECORD_STATISTICS('2010-01-01 00:00:00', '2016-12-31 23:59:59', 0);
 -- CALL SP_GET_EXPERIENCE_RECORD_STATISTICS('2010-01-01 00:00:00', '2016-12-31 23:59:59', 1);

还有我的 C# 代码:

MySqlConnection conn = new MySqlConnection(Properties.Settings.Default.DatabaseConnectionString);

public bool mysql(string sql)
    {
        try
        {
            MySqlCommand comm = new MySqlCommand(sql, conn);
            MySqlDataAdapter mda = new MySqlDataAdapter(comm);
            DataSet ds = new DataSet();
            mda.Fill(ds);
            return true;
        }
        catch (Exception ex)
        {
            return false;
            throw ex;
        }

    }

非常感谢任何想法。

【问题讨论】:

  • C# 代码中的 sql 是什么

标签: c# mysql parameters


【解决方案1】:

最后我添加了 Allow User Variables=True;到connectionString,现在它工作得非常好。

【讨论】:

    【解决方案2】:

    好像是笔误

    IF (isEquipment = 1) THEN
        SET @req = CONCAT(@req, " GROUP BY ClientName");
    ELSE
        SET @req = CONCAT(@req, " GROUP BY ContentName"); //You forgot @req here!
    END IF;
    

    此外,我在 C# 代码中看不到任何应该存在的 AddWithParameter 行,因为 @req 是一个参数。

    MySqlDataAdapter mda = new MySqlDataAdapter(comm);
    mda.Parameters.AddWithValue("@req",value_goes_here);
    

    【讨论】:

    • 我修复了您发现的丢失的@req,所以它更好,但我仍然有一个错误“必须定义参数'@req'”。奇怪了,req只是一个变量,不是参数……
    • 尝试在SET关键字之后从所有req中删除@
    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多