0

我正在尝试在 .NET 4.0 之上编写一个 Windows 窗体程序并访问 Microsoft Access 数据库。我可以毫无问题地读写,但有时会出现以下错误:

无法使用已与其底层 RCW 分离的 COM 对象。

我尝试使用不同的输入两次(在同一线程上)调用此方法(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 TeamName=@teamName";
            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(); 发生异常。

调用这个方法的方法里面有这 2 行:

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

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

谢谢,郭红

4

2 回答 2

2

基于 Martin 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
            }
        }
    }
}
于 2013-05-18T22:08:40.183 回答
1

与其只创建一次对象并将它们存储在类中的字段中,不如在方法中创建、使用和关闭对象。最终可能是Close您调用释放底层 COM 对象的方法,从而在第二次调用时为您提供异常。

于 2013-05-18T11:56:20.170 回答