2011-05-04 156 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);

**

雙方的陳述沒有 「;」在末尾