2013-05-18 54 views
0

我想在.NET 4.0之上编写一个Windows Form程序并访问Microsoft Access数据库。我可以阅读和使用没有问题,写,但有时,我得到这个错误:打“已经从其底层RCW分离的COM对象不能使用”错误

COM object that has been separated from its underlying RCW cannot be used.

我试图调用此方法(GetIDBasedonTeamName)与不同的输入两次(在同一个线程)。第二次运行时,我得到了这个错误。

OleDbConnection conn = new OleDbConnection(); 
    OleDbConnection mDB = new OleDbConnection(); 
    OleDbCommand comm = new OleDbCommand(); 
    OleDbCommand cmd; 
    OleDbDataReader dr; 

    public void OpenConnection(string name) // always call this method first in other methods to initialise connection 
    { 
     conn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data source=" 
      + Application.StartupPath + "\\AppData\\" + name + ".mdb;"; 
     conn.Open(); 
     comm.Connection = conn; 
     comm.Parameters.Clear(); 
    } 

public string GetIDBasedonTeamName(string teamName) 
    { 
     string toReturn = ""; 

     try 
     { 
      OpenConnection("form"); 
      comm.CommandText = "Select ID from TeamDetails WHERE [email protected]"; 
      comm.Parameters.AddWithValue("TeamName", teamName); 

      dr = comm.ExecuteReader(); 

      while (dr.Read()) 
      { 
       toReturn = dr[0].ToString(); 
      } 
     } 
     catch (OleDbException e) 
     { 
      string err = e.Message.ToString(); 
      return null; 
     } 
     finally 
     { 
     } 
     conn.Close(); 
     dr.Close(); 
     return toReturn; 
    } 

dr = comm.ExecuteReader();发生异常。

这是调用此方法,该方法有这样两行内:

InfoConfig.team1id = Convert.ToInt32(dbm.GetIDBasedonTeamName(cbxTeam1.Text)); 
InfoConfig.team2id = Convert.ToInt32(dbm.GetIDBasedonTeamName(cbxTeam2.Text)); 

可能是什么原因?我四处阅读,他们提到不使用不同的线程,但它在这里是相同的线程。

感谢, 郭宏

回答

1

而不是创建的对象只有一次,并将它们存储在你的类,你应该创建,使用和在你的方法关闭对象的字段。这可能是你到底叫释放给你的第二个电话异常的基础COM对象的方法Close

+0

那么,你是说我应该做的“OleDbConnection的康恩=新的OleDbConnection(); OleDbConnection的MDB =新的OleDbConnection(); OleDbCommand的通讯=新的OleDbCommand(); OleDbCommand的cmd; OleDbDataReader dr;“并在每种方法中开放连接? –

+1

@GuoHongLim:是的,在浏览'OleDbConnection'文件表明,连接池使用。然后,正确的模式就是在'using'语句中临时创建必要的对象,就像在[示例]中所做的那样(http://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbconnection( v = vs.110)的.aspx)。 –

2

大厦马丁Liversage的回答是:

public string GetIDBasedonTeamName(string teamName) { 
    var connString = "Provider = Microsoft.Jet.OLEDB.4.0;Data source=" 
     + Application.StartupPath + "\\AppData\\" + name + ".mdb;"; 
    using (var conn = new OleDbConnection(connString)) { 
     conn.Open(); 
     using (var cmd = conn.CreateCommand()) { 
      cmd.CommandText="Select ID from TeamDetails WHERE TeamName = @teamName"; 
      cmd.Parameters.AddWithValue("TeamName", teamName); 
      using (var rdr = cmd.ExecuteReader()) { 
       if (rdr.Read()) { 
        return (string)rdr["TeamName"]; 
       } 
       //if no valid results will return null 
      } 
     } 
    } 
} 
相关问题