【问题标题】:OleDbConnection - ExecuteNonQuery requires an open and available Connection. The connection's current state is closedOleDbConnection - ExecuteNonQuery 需要一个打开且可用的连接。连接的当前状态为关闭
【发布时间】:2011-12-03 21:12:05
【问题描述】:

我在这里做错了什么?

using System.Data;
using System.Data.OleDb;

namespace myProject.Account
{
    public class DbManager
    {

        private OleDbConnection OpenDbConnection()
        {
            string connectionString = GetConnectionString();
            return new OleDbConnection {ConnectionString = connectionString};
        }

        private string GetConnectionString()
        {
            return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\myDataBase.accdb";
        }

       public void InsertUser(string name, string loginName, string password)
       {
            OleDbConnection conn = OpenDbConnection();

            OleDbCommand command = new OleDbCommand(
                 "INSERT INTO tblUser (UserName, LoginName, Password) VALUES (@name,@login,@pwd)",
                 Conn);

            command.Parameters.Add("@name", OleDbType.VarChar).Value = name;
            command.Parameters.Add("@login", OleDbType.VarChar).Value = loginName;
            command.Parameters.Add("@pwd", OleDbType.VarChar).Value = password;
            command.ExecuteNonQuery();
       }
   }
}

.

我收到了这个错误:

ExecuteNonQuery 需要一个开放且可用的连接。连接的当前状态为关闭。
说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.InvalidOperationException:ExecuteNonQuery 需要打开且可用的连接。连接的当前状态为关闭。

来源错误:

第 31 行:command.ExecuteNonQuery();

我曾尝试查看其他一些线程,但没有任何帮助:

ExecuteNonQuery requires an open and available Connection. The connection's current state is closed

MS Access DB doesnt save changes after execution (C#)

【问题讨论】:

  • 我建议将连接放在using 块内以释放资源。
  • 调用一个方法 OpenDbConnection 对我来说似乎非常“危险”,而它实际上只创建了数据库连接,但 并没有实际上 打开 吧! Kind 违背了“最不意外原则”......要么实际上在该方法中打开连接,要么称之为CreateDbConnection 或其他什么......
  • 感谢 Uwe Keim - 我是 C# 的新手 对于其他对为什么使用“使用”感兴趣的人,请参阅线程:stackoverflow.com/questions/75401/uses-of-using-in-c-sharp
  • 嗯.. 看来我没有正确阅读教程。当您执行“SELECT”语句时,网络上的一些示例没有使用 Conn.Open() 。我认为这只是糟糕的编程风格。所以感谢大家的帮助:-)

标签: c# oledbconnection oledbcommand


【解决方案1】:

您似乎忘记打开连接(并且为命令分配了错误的连接)。试试:

       using(OleDbConnection conn = OpenDbConnection())
        {
          using(OleDbCommand command = new OleDbCommand( 
               "INSERT INTO tblUser (UserName, LoginName, Password) VALUES (@name,@login,@pwd)")) 
          {
          command.CommandType = CommandType.Text;
          command.Parameters.Add("@name", OleDbType.VarChar).Value = name; 
          command.Parameters.Add("@login", OleDbType.VarChar).Value = loginName; 
          command.Parameters.Add("@pwd", OleDbType.VarChar).Value = password; 
          command.Connection = conn; 

          conn.Open();

          command.ExecuteNonQuery();
          } 
        }

相反。我也建议使用 using 语句。它将为您管理您的连接。关闭。

【讨论】:

  • 感谢您的回答。我使用了主管技术,但这也是一个很好的例子:-)
  • 那么一定要接受他们的回答!就个人而言,我会将您的方法的名称更改为 GetDbConnection,并且只有在我将按照上述方法使用它时才打开()连接。我还将它包装在 using 语句中,以确保即使出现异常,连接也会被关闭和处理。
【解决方案2】:

之后

OleDbConnection conn = OpenDbConnection();

添加

conn.Open();

或者,修改OpenDbConnection如下:

    private OleDbConnection OpenDbConnection()
    {
        string connectionString = GetConnectionString();

        OleDbConnection conn = new OleDbConnection {ConnectionString = connectionString};

        conn.Open();

        return conn;
    }

【讨论】:

  • 经过一些调试后,我发现我的 INSERT 语句中的“密码”是 SQL 或 ACCESS 中的保留字。执行语句时出现语法错误。当我将“密码”更改为“用户密码”时,该语句通过了:-)
  • @Jedi:这是个好消息!请记住,如果某个答案已解决或帮助您解决问题,单击问题旁边的复选标记和向上箭头会很有帮助,以便将来访问该问题的人知道这就是解决您的问题的原因。
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 2015-04-17
  • 1970-01-01
  • 2012-12-26
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多