为啥设置 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 变量会产生错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥#region 会产生编译错误?

C++/openCV - 为啥显示图像会产生 linux 分段错误? (openCV 错误?)

CORBA:它是啥,为啥会产生“GIOP 魔法错误”?

为啥这个看似简单的 C++ 代码会产生分段错误?

为啥在两次调用 promise 时 RSVP Deferred 会产生错误

为啥命令行参数在访问时会产生分段错误?