2011-05-04 149 views
0

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

您的SQL语法错误; 检查对应 你的MySQL服务器版本使用附近的 正确的语法手册 'SET VariableRecordExists =(SELECT COUNT(*)FROM 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"; 

我不知道我犯了一个错误也许我缺少一个分号; somewh还是什么。如果有人能帮助我,我将不胜感激。

回答

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

它不工作,说实话我有一个预感它不会工作 – Omayr 2011-05-04 11:11:27

0

我不知道在C#制作queryies,但通常的;是您的查询的末尾:所以如果你不改变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

+0

以及语法异常/错误与C#无关。但无论如何它不起作用。我试图改变分隔符,但没有进展 – Omayr 2011-05-04 11:20:27

0

稍微题外话 - 但是......

一般情况下,更喜欢 “如果存在(选择...)”当你想要做的是检查是否有行时,选择“count(*)...”。它比实际计算所有行要便宜得多。

其次,它看起来好像你正在尝试做一个“更新插入”,这在MySQL中是

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

,然后你也不需要明确的交易。

这当然假定MachineName是一个主键,我猜测它是。

0

我的猜测是对的我错过了一个“;”。说实话,这花了我2个小时。

**

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

**

双方的陈述没有 “;”在末尾