EXECUTE 后的预期查询名称

Posted

技术标签:

【中文标题】EXECUTE 后的预期查询名称【英文标题】:Expected query name after EXECUTE 【发布时间】:2012-08-06 10:36:05 【问题描述】:

我在我的 asp.net 项目中使用 .mdb 数据库执行存储过程时遇到问题。我想使用存储过程,但是在执行代码之后......

using (OleDbConnection conn = new OleDbConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString.ToString()))
                
                    conn.Open();
                    using (OleDbCommand com = new OleDbCommand("Insert", conn))
                    
                        com.CommandType = CommandType.StoredProcedure;
                        com.Parameters.AddWithValue("@Login", UserName0.Text);
                        com.Parameters.AddWithValue("@Password", Hashing.Hash(ConfirmPassword0.Text));
                        com.Parameters.AddWithValue("@Role", RoleList1.SelectedValue);
                        com.ExecuteNonQuery();
                    
                    conn.Close();

我有例外:

System.Data.OleDb.OleDbException:。

但是当我使用下面的代码时,一切正常。 我也改变了:CommandType.StoredProcedure 到 CommandType.Text 但它仍然不起作用。有人可以帮我吗?

using (OleDbConnection conn = new OleDbConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString.ToString()))
                
                    conn.Open();
                    using (OleDbCommand com = new OleDbCommand("INSERT INTO Workers ( st_login, st_password, st_role ) VALUES (login, password, role);", conn))
                    
                        com.Parameters.AddWithValue("@Login", UserName0.Text);
                        com.Parameters.AddWithValue("@Password", Hashing.Hash(ConfirmPassword0.Text));
                        com.Parameters.AddWithValue("@Role", RoleList1.SelectedValue);
                        com.ExecuteNonQuery();
                    
                    conn.Close();

【问题讨论】:

你有一个名为Insert的存储过程? 对于带参数的简单插入,在查询中的每个参数名称前添加@:INSERT INTO Workers (st_login, st_password, st_role) VALUES (@Login, @Password, @Role); 【参考方案1】:

如果您的代码清单准确无误,您似乎有一个名为Insert 的存储过程,这是不可取的。尝试使用不是保留关键字的名称创建过程,看看是否有帮助。

【讨论】:

【参考方案2】:
using (OleDbConnection conn = new OleDbConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString.ToString()))
                
                    conn.Open();
                    using (OleDbCommand com = new OleDbCommand("INSERT INTO Workers ( st_login, st_password, st_role ) VALUES (?, ?, ?);", conn))
                    
                        com.Parameters.AddWithValue("@Login", UserName0.Text);
                        com.Parameters.AddWithValue("@Password", Hashing.Hash(ConfirmPassword0.Text));
                        com.Parameters.AddWithValue("@Role", RoleList1.SelectedValue);
                        com.ExecuteNonQuery();
                    
                    conn.Close();

请注意 Ms-Access 不支持存储过程。如果您需要这样或复杂的查询,请使用 Sql Server。由于您的应用程序正在使用 asp.net。我会推荐使用 Sql Server 作为后端的 ASP.Net。无论如何,对于您的答案,将参数替换为?使用 MS-Access 时。见上文。

【讨论】:

当您拥有? 时,您认为@Login 是否相关? @V4Vendetta: 另一个同样场景的问题...***.com/questions/10941284/… 是的,它会起作用,因为只需要订单(如果你对所有这些都说@Login,它仍然可以工作),只是想突出显示那部分,它也应该接受@Login in插入使其更具可读性而不是计算? 然后是参数! 随便,但我更喜欢?在 oledb 或任何需要的情况下,而不是命名参数

以上是关于EXECUTE 后的预期查询名称的主要内容,如果未能解决你的问题,请参考以下文章

Oracle EXECUTE IMMEDIATE 未执行存储过程中的预期操作

Doctrine DBAL ->execute() 和 Hydration,DB2 字段名称包括“#”

使用java语句类的单个execute()方法执行多个hive查询

SQLStatement.execute() - 一条语句中的多个查询

强制 Hibernate 不使用 sp_execute 进行非查询

JDBC中 execute 与 executeUpdate的区别