我正在尝试通过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";
我不知道我在哪里弄错了。可能我错过了一个半结肠 ;
某处或什么。如果有人能帮助我,我将不得不承担责任。
答案 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";