为啥设置 SQL 变量会产生错误?
Posted
技术标签:
【中文标题】为啥设置 SQL 变量会产生错误?【英文标题】:Why is setting SQL variable is creating an error?为什么设置 SQL 变量会产生错误? 【发布时间】:2018-08-23 06:41:27 【问题描述】:以下 SQL 语句正在创建带有消息的错误: “消息:命令执行期间遇到致命错误。” "内部异常:必须定义参数'@LastUserID'。"
如果我直接使用 LAST_INSERT_ID() 而不是 LastUserID,则在这样执行时它总是返回零(因此在第二次插入时失败)。
我没有看到我的语法与 mysql 文档中的不同。
有人可以帮我吗?
string Query = @"INSERT INTO login (" +
"LOGIN_EMAIL," +
"LOGIN_PASSWORD," +
"LOGIN_SALT," +
"LOGIN_LAST_LOGIN_DATE," +
// "LOGIN_LAST_LOGIN_LOCATION," +
"LOGIN_ACCOUNT_STATUS," +
"LOGIN_LOGIN_ATTEMPTS," +
"LOGIN_CREATED_DATE) " +
"VALUES (" +
"@Parameter2," +
"@Parameter3," +
"@Parameter4," +
"@Parameter5," +
// "@Parameter6," +
"@Parameter6," +
"@Parameter7," +
"@Parameter8); " +
"SET @LastUserID = LAST_INSERT_ID(); " +
"INSERT INTO user_role (" +
"USER_ROLE_USER_ID," +
"USER_ROLE_ROLE," +
"USER_ROLE_STATUS," +
"USER_ROLE_CREATED_DATE) " +
"SELECT " +
"@LastUserID," +
"@Parameter9," +
"@Parameter10," +
"@Parameter11 " +
"FROM dual WHERE NOT EXISTS (SELECT USER_ROLE_USER_ID FROM user_role " +
"WHERE USER_ROLE_USER_ID = @LastUserID AND USER_ROLE_ROLE = @Parameter9)";
MySqlCommand oCommand = new MySqlCommand(Query, oMySQLConnecion);
oCommand.Transaction = tr;
【问题讨论】:
"如果前面的语句返回错误,则 LAST_INSERT_ID() 的值未定义。"来源:dev.mysql.com/doc/refman/8.0/en/…你确定你的第一个查询实例正确执行并实际插入数据,所以last_insert_id()
实际上有一个值吗?
是的,第一部分正在正确执行。通过从第一个插入读取用户 ID 并发送到第二个插入单独执行时,两个插入都可以正常工作。我正在尝试将它们与 lastinsertid() 结合起来。错误消息显示 @LastUserID 未定义。为什么会这样?
尝试子查询它来检索值,即SET @LastUserID = (SELECT last_insert_id() FROM table_name);
这应该只是检索表的最后插入的 ID 的值。
不,它也不起作用。我刚刚检查了“SET @LastUserID = (SELECT last_insert_id() FROM user_role);”注释掉所有插入。还使用整数而不是函数进行检查。仍然是完全相同的错误:“内部异常:必须定义参数'@LastUserID'。”
那么我不知道它是如何真正忽略 last_insert_id() 的,因为如果之前的插入实际上做了一个完美的插入,它应该 100% 工作。一个问题可能是数据库连接丢失或其他原因,因此 last_insert_id() 函数无法检索 id,但这很奇怪。
【参考方案1】:
创建一个过程,在该过程中您首先执行插入,缓存最后插入的 id,执行另一个插入,如果您的最后一个插入有效或无效,则让它用布尔值打印出您的参数。这样就可以正常调试了。
一般而言,您应该避免连接字符串来生成 sql 命令,否则您可能会遇到包含意外字符的参数或被injection 击中的问题。
【讨论】:
处理长 SQL 查询的最佳方法是什么? 取决于你打算用它做什么。有时我使用程序,有时我创建视图。如果可以选择,您可以使用后端框架来处理抽象层。【参考方案2】:简单修复:将“$LastUserID”替换为“$'LastUserID'”。 ephostophy 与众不同。
【讨论】:
以上是关于为啥设置 SQL 变量会产生错误?的主要内容,如果未能解决你的问题,请参考以下文章
C++/openCV - 为啥显示图像会产生 linux 分段错误? (openCV 错误?)