MySql查询语法出错

时间:2011-05-04 11:01:46

标签: c# mysql exception syntax-error

我正在尝试通过C#创建 MySql存储过程。我也创建了一些其他的但当我尝试通过MySqlCommand.ExecuteNonQuery执行查询时,它会抛出一个异常,即查询语法不兼容。以下是异常消息:

  

您的SQL语法有错误;   检查对应的手册   您的MySQL服务器版本   正确的语法在'SET附近使用   VariableRecordExists =(SELECT   COUNT(*)来自SmartCache_Sync WHERE   MachineNa'在第10行

在这里,我正在尝试构建查询字符串:

string sql = @"CREATE PROCEDURE SmartCache_UpdateSync
(
VariableMachineName varchar(50)
)
BEGIN
    DECLARE VariableRecordExists int;
    DECLARE VariableSetDate datetime;
    START TRANSACTION;
        SET VariableSetDate= Now()
        SET VariableRecordExists = (SELECT COUNT(*) FROM SmartCache_Sync WHERE MachineName = VariableMachineName)
        IF VariableRecordExists = 1
        THEN
            UPDATE SmartCache_Sync 
            SET LastUpdate = VariableSetDate
            WHERE MachineName= VariableMachineName;
        ELSE
            INSERT INTO SmartCache_Sync 
            (MachineName,LastUpdate)
            VALUES (VariableMachineName,VariableSetDate);
        END IF;
    COMMIT; 

    SELECT VariableSetDate;
END";

我不知道我在哪里弄错了。可能我错过了一个半结肠 ; 某处或什么。如果有人能帮助我,我将不得不承担责任。

4 个答案:

答案 0 :(得分:0)

我不知道在c#中进行查询,但通常;是您查询的结尾:所以如果您不更改delimiter,则提前结束命令。通常你会做这样的事情:

delimiter //

CREATE PROCEDURE simpleproc (OUT param1 INT)
 BEGIN
  SELECT COUNT(*) INTO param1 FROM t;
 END//

delimiter ;

自: http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

答案 1 :(得分:0)

稍微偏离主题 - 但是......

一般情况下,当你想要做的就是检查是否存在任何行时,更喜欢“if exists(select ...)”到“select count(*)...”。它比实际计算所有行便宜得多。

其次,看起来好像你正试图做一个“upsert”,这在MySQL中会是

INSERT INTO SmartCache_Sync(MachineName,LastUpdate)
    VALUES (VariableMachineName,VariableSetDate)
    ON DUPLICATE KEY UPDATE LastUpdate = VariableSetDate

然后您也不需要显式事务。

这当然假设MachineName是主键,我猜它是。

答案 2 :(得分:0)

我的猜测是对的,我错过了一个“;”。老实说,我花了2个小时才完成。

**

  

SET VariableSetDate = Now();           SET VariableRecordExists =(SELECT COUNT(*)FROM SmartCache_Sync   WHERE MachineName =   VariableMachineName);

**

这两个陈述都没有“;”最后

答案 3 :(得分:-1)

CREATE PROCEDURE SmartCache_UpdateSync
 (
    VariableMachineName varchar(50)
)
    BEGIN
        DECLARE VariableRecordExists int;
        DECLARE VariableSetDate datetime;
        START TRANSACTION;
            SET VariableSetDate= Now()            

(SELECT VariableRecordExists = COUNT(*) FROM SmartCache_Sync WHERE MachineName = VariableMachineName)


            IF VariableRecordExists = 1
            THEN
                UPDATE SmartCache_Sync 
                SET LastUpdate = VariableSetDate
                WHERE MachineName= VariableMachineName;
            ELSE
                INSERT INTO SmartCache_Sync 
                (MachineName,LastUpdate)
                VALUES (VariableMachineName,VariableSetDate);
            END IF;
        COMMIT; 

        SELECT VariableSetDate;
    END";