2

我有一个 ado.net 代码清单:

OleDbConnection oconn = new OleDbConnection();
                //   oconn.ConnectionString ="Driver={Microsoft Visual FoxPro Driver};Provider=vfpoledb.1;SourceType=DBF;SourceDB=" + pelna_sciezka + ";Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
                oconn.ConnectionString = "Provider=vfpoledb.1;Data Source=" + pelna_sciezka + ";Collating Sequence=machine";
                oconn.Open();
                OleDbCommand ocmd = oconn.CreateCommand();
                string na = TBNazwaKonta.Text.Replace("\n","");
                na = na.Replace("\r","") ;
                string ks2 = ks.Replace("\n","");
                ks2 = ks2.Replace("\r", "");
                 OleDbCommand dbCmdNull = oconn.CreateCommand();
                dbCmdNull.CommandText = "SET NULL OFF";
                dbCmdNull.ExecuteNonQuery();                
                string zapytanie = @"insert into " + @pelna_sciezka + @" (rk, Na,Ks) values (0,'" + na + "','" + ks2 +"')";
                ocmd.CommandText = zapytanie;
                ocmd.ExecuteNonQuery();
                oconn.Close();

它运行良好,没有任何问题。但是我使用的 dbf 文件正在被另一个程序使用。为什么如果我执行查询并关闭连接,dbf 文件仍由程序保存?如果有人想打开它,错误消息是“文件访问被拒绝”。只有当我关闭应用程序时,另一个才能访问

4

2 回答 2

5

您没有关闭 OleDbCommands。与实际上是可选的 SqlCommands 不同,这确实对 OleDb 产生了影响。

我建议使用using关键字;这确保了所有资源在块结束时自动释放。作为额外的奖励,它确保在发生异常时也会释放资源,因此Close永远不会到达您的手动命令。

using (OleDbConnection oconn = new OleDbConnection()) {
    oconn.ConnectionString = "Provider=vfpoledb.1;Data Source=" + pelna_sciezka + ";Collating Sequence=machine"; 
    oconn.Open(); 

    using (OleDbCommand ocmd = oconn.CreateCommand()) {
        string na = TBNazwaKonta.Text.Replace("\n",""); 
        na = na.Replace("\r","") ; 
        string ks2 = ks.Replace("\n",""); 
        ks2 = ks2.Replace("\r", ""); 

        using (OleDbCommand dbCmdNull = oconn.CreateCommand()) {
            dbCmdNull.CommandText = "SET NULL OFF"; 
            dbCmdNull.ExecuteNonQuery();
        } // closes dbCmdNull

        string zapytanie = @"insert into " + @pelna_sciezka + @" (rk, Na,Ks) values (0,'" + na + "','" + ks2 +"')"; 
        ocmd.CommandText = zapytanie; 
        ocmd.ExecuteNonQuery(); 
    }  // closes ocmd
} // closes connection
于 2012-06-28T08:17:46.533 回答
1

我已经解决了我的问题,我执行了两点:
- 我已经更改了ado.netHeinzi 编写的所有代码
- 我使用了来自support.microsoft.com/kb/260856

并跟着他们,问题现在已经消失了。谢谢大家的帮助!

于 2012-06-28T12:24:39.097 回答