我想在.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));
可能是什么原因?我四处阅读,他们提到不使用不同的线程,但它在这里是相同的线程。
感谢, 郭宏
那么,你是说我应该做的“OleDbConnection的康恩=新的OleDbConnection(); OleDbConnection的MDB =新的OleDbConnection(); OleDbCommand的通讯=新的OleDbCommand(); OleDbCommand的cmd; OleDbDataReader dr;“并在每种方法中开放连接? –
@GuoHongLim:是的,在浏览'OleDbConnection'文件表明,连接池使用。然后,正确的模式就是在'using'语句中临时创建必要的对象,就像在[示例]中所做的那样(http://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbconnection( v = vs.110)的.aspx)。 –