【问题标题】:Error in MySql Query SyntaxMySql 查询语法错误
【发布时间】:2011-08-18 10:47:49
【问题描述】:

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

您的 SQL 语法有错误; 检查对应的手册 您的 MySQL 服务器版本 在 'SET 附近使用正确的语法 变量记录存在 =(选择 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";

我不知道我在哪里犯了错误。可能我在某处或什么地方遗漏了一个分号 ;。如果有人可以帮助我,我将不胜感激。

【问题讨论】:

    标签: c# mysql exception syntax-error


    【解决方案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";
    

    【讨论】:

      【解决方案2】:

      我不知道如何在 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

      【讨论】:

      • 好吧,语法异常/错误与 C# 无关。但无论如何它都不起作用。我尝试更改分隔符但没有进展
      【解决方案3】:

      有点跑题了——但是……

      一般来说,当您只想检查是否存在任何行时,更喜欢“if exists (select...)”而不是“select count(*)...”。这比实际计算所有行要便宜得多。

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

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

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

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

      【讨论】:

        【解决方案4】:

        我的猜测是正确的,我错过了一个“;”。老实说,我花了 2 个小时才搞定。

        **

        SET VariableSetDate= Now(); SET VariableRecordExists = (SELECT COUNT(*) FROM SmartCache_Sync WHERE 机器名称 = 变量机器名);

        **

        这两个语句都没有“;”最后

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-05
          • 2015-09-01
          • 2012-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-21
          • 2015-07-17
          相关资源
          最近更新 更多