2011-05-04 9 views
0

MySql 저장 프로 시저를 C# 통해 만들려고합니다. 나는 다른 것을 만들었지 만, MySqlCommand.ExecuteNonQuery을 통해 쿼리를 실행하려고하면 쿼리 구문이 호환되지 않는 예외가 발생합니다. 다음은 예외 메시지입니다.MySql 쿼리 구문 오류

SQL 구문에 오류가 있습니다. 근처에서 사용하는 올바른 구문 MySQL 서버 버전에 해당하는 설명서를 확인 '= (SmartCache_Sync FROM COUNT (*)를 선택 VariableRecordExists을 SET 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

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

0

약간 오프 주제 -하지만 ... 일반적으로

선호 "가있는 경우 (선택을 ...)" "select count (*) ..."를하려면 행이 있는지 확인하십시오. 실제로 모든 행을 세는 것보다 훨씬 저렴합니다. 당신이 MySQL의에서

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

될 것이며, 다음 중 하나를 명시 적 트랜잭션이 필요하지 않습니다에 "upsert"을 수행하려고하는 것처럼

그리고 둘째로, 그것은 보인다.

물론 이것은 MachineName이 기본 키이고 추측하고있는 것으로 가정합니다.

0

제 추측은 맞았습니다. ";"가 빠졌습니다. 솔직히 말하면 2 시간이 걸렸습니다.

**

SET VariableSetDate = NOW(); SET VariableRecordExists = (SELECT COUNT (*) from SmartCache_Sync WHERE MachineName = VariableMachineName); **

모두 진술하지 않았다

";" 결국