2013-03-10 4 views
0

Я использую приведенный ниже код для доступа к базе данных MS Access. Но я получил сообщение об ошибке. Заполнить: свойство SelectCommand.Connection не было инициализировано. Как я могу решить эту проблему.Заполнить: свойство SelectCommand.Connection не было инициализировано

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) 
      { 
      } 
     } 
+3

Параметр 'using' распорядится/закрыть соединение, так что метод' DBConnectionStatus' бессмысленно. –

+0

Еще одна вещь: вам нужно назначить соединение с объектом команды. –

ответ

0

Я предлагаю вам изменить код, чтобы что-то вроде этого:

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   
} 
0

Вы инициализацией Command которые лет и использовать для построения DataAdapter, но и без установки требуемого Connection свойства:

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

Так ваше исключение довольно очевидно.

Одно заключительное примечание: using будет dispose/closeconnection, поэтому метод 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; 
}