2016-12-26 49 views
0

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

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; 
     } 

    } 

任何想法,它来自将非常感激。

+0

什么是你的C#代码中的'sql' – e4c5

回答

0

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

0

似乎是一个错字错误

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); 
+0

我修复了你找不到的@req所以它更好,但我仍然有一个错误“参数'@req'必须被定义”。这很奇怪,req只是一个变量,而不是一个参数... – Hans

+0

尝试从'SET'关键字后的所有'req'中删除'@'。 –

相关问题