我准备好的陈述有什么问题?

What is wrong with my prepared statement?

我的 SQL 语法在使用我似乎无法追踪的准备好的语句时有错误。我大大简化了代码,但错误仍然存​​在。这是我第一次使用准备好的语句,所以它可能是相当基础的东西,但 google-ing 仍然没有帮助我。我想要做的是用一组参数更新 table,我在变量中传递这些参数(在给定的示例中,我用一个简单的“4”(不在变量中)替换了这组参数,并且只手在参数上选择行作为变量)。代码如下:

SQLcommand.CommandText = "PREPARE my_prep_statement FROM 'UPDATE tbl1 SET status = 4 WHERE Number =  ?';"
SQLcommand.ExecuteNonQuery()
SQLcommand.Parameters.AddWithValue("@DosiNr", "123")
SQLcommand.CommandText = "EXECUTE my_prep_statement USING @DosiNr;"
SQLcommand.ExecuteNonQuery()

Number 列的类型为 varchar(8)。 错误消息是“您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的 ''123'' 附近使用的正确语法”和我的 table 没有更新。

我正在使用 mySQL 数据库,服务器版本 5.1.41

我有一种强烈的感觉,好像在这里看不到一些非常简单的东西,但我需要帮助来发现它:-(

非常感谢!!

您不能提供文字作为准备好的语句参数,只允许使用 UDV,请参阅 EXECUTE Statement。将您的值设置为用户定义的变量,然后使用该变量执行语句。 在 SQL 中看起来像

PREPARE my_prep_statement FROM 'UPDATE tbl1 SET status = 4 WHERE Number =  ?';
SET @var := 123;
EXECUTE my_prep_statement USING @var;

所以你需要像

这样的东西
SQLcommand.CommandText = "PREPARE my_prep_statement FROM 'UPDATE tbl1 SET status = 4 WHERE Number =  ?';"
SQLcommand.ExecuteNonQuery()
SQLcommand.CommandText = "SET @var := @DosiNr;"
SQLcommand.Parameters.AddWithValue("@DosiNr", "123")
SQLcommand.ExecuteNonQuery()
SQLcommand.CommandText = "EXECUTE my_prep_statement USING @var;"
SQLcommand.ExecuteNonQuery()

@var 可能会被 VB.Net 视为未设置值的查询参数,并出现相应的错误...如果是这样,我不知道该怎么办这个问题。

使用 API 中的准备语句时,您不使用 SQL PREPARE 语法,而是使用特定的 API 函数。对于 .Net,它是 SqlCommand.Prepare.

documentation 提供了一个很好的例子。