【问题标题】:Fill: SelectCommand.Connection property has not been initialized填充:SelectCommand.Connection 属性尚未初始化
【发布时间】:2013-02-25 15:28:08
【问题描述】:

我正在使用以下代码访问 MS Access 数据库。但是我收到一条错误消息 Fill: SelectCommand.Connection property has not been initialized.我该如何解决这个问题。

common.cs
=========
public static bool DBConnectionStatus()
        {
            try
            {
                string conString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|db_admin.mdb; Jet OLEDB:Database Password=admin";
                using (OleDbConnection conn = new OleDbConnection(conString))
                {
                    conn.Open();
                    return (conn.State == ConnectionState.Open);
                }
            }
            catch (OleDbException)
            {
                return false;
            }


protected void btn_general_Click(object sender, EventArgs e)
        {
            try
            {
                bool state = common.DBConnectionStatus();
                if (state == true)
                {
                    cmd = new OleDbCommand("select * from tbl_admin");
                    da = new OleDbDataAdapter(cmd);
                    DataSet ds = new DataSet();

                    da.Fill(ds); // Error Here 
                    if (ds.Tables[0].Rows.Count > 0)
                    {

                    }

                }
            }
            catch (Exception e1)
            {
            }
        }

【问题讨论】:

  • using 将释放/关闭连接,因此DBConnectionStatus 方法毫无意义。
  • 还有一件事是您必须将连接分配给命令对象。

标签: c# asp.net c#-4.0


【解决方案1】:

我确实建议您将代码修改为以下内容:

private DataTable YourData()  
{  
    string conString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|db_admin.mdb; Jet OLEDB:Database Password=admin";  
    DataSet ds = new DataSet();  
    using (SqlConnection conn = new SqlConnection(conString))  
    {  
        try  
        {  
            conn.Open();  
            SqlCommand command = new SqlCommand("select * from tbl_admin", conn);  
            command.CommandType = CommandType.Text;  

            SqlDataAdapter adapter = new SqlDataAdapter(command);  
            adapter.Fill(ds);  

            if (ds.Tables[0].Rows.Count > 0)  
            {  
                // do somethign here  
            }  
        }
        catch (Exception)  
        {
            /*Handle error*/  
        }  
    }  
    return ds.Tables[0];  
}  

然后:

protected void btn_general_Click(object sender, EventArgs e)
{          
     this.YourData(); // you will get the Data here. you can then use it the way you want it         
}

【讨论】:

    【解决方案2】:

    您正在初始化一个 Command,用于构造一个 DataAdapter,但两者都没有设置所需的 Connection 属性:

    cmd = new OleDbCommand("select * from tbl_admin"); // <-- no connectuion assigned
    da = new OleDbDataAdapter(cmd);  // <-- no connectuion assigned
    

    所以你的例外是不言自明的。

    最后一点:usingdispose/close connection,所以 DBConnectionStatus 方法毫无意义。所以不要使用它,而是首先使用using

    try
    {
        using(var con = new OleDbConnection(connectionString))
        using(var da = new OleDbDataAdapter("elect * from tbl_admin", con))
        {
            var table = new DataTable();
            da.Fill(table); // note that you don't need to open the connection with DataAdapter.Fill
            if (table.Rows.Count > 0)
            {
                // ...
            }
        }
    }
    catch (Exception e1)
    {
        // don't catch an exception if you don't handle it in a useful way(at least loggging)
        throw;
    }
    

    【讨论】:

      【解决方案3】:

      根据您的要求,您还可以使用 SqlDataAdapter 代替 ExecuteReader。

      public void ReadMyData(string connectionString)
      {
          string queryString = "SELECT OrderID, CustomerID FROM Orders";
          using (OleDbConnection connection = new OleDbConnection(connectionString))
          {
              OleDbCommand command = new OleDbCommand(queryString, connection);
              connection.Open();
              OleDbDataReader reader = command.ExecuteReader();
      
              while (reader.Read())
              {
                  Console.WriteLine(reader.GetInt32(0) + ", " + reader.GetString(1));
              }
              // always call Close when done reading.
              reader.Close();
          }
      }
      

      【讨论】: