【问题标题】:c# application holding file even I've finished work with itc# 应用程序保存文件,即使我已经完成了它的工作
【发布时间】:2023-12-23 22:59:02
【问题描述】:

我有一个 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 文件仍由程序保存?如果有人想打开它,错误消息是“文件访问被拒绝”。只有当我关闭应用程序时,另一个才能访问

【问题讨论】:

  • 如果某处抛出异常,您实际上并没有关闭连接。在代码中使用 using 语句来清理实现 IDisposable 的资源。 msdn.microsoft.com/en-us/library/yh598w02.aspx
  • 你试过oconn.Dispose() (insead of Close) 吗?
  • 像 Heinzi 建议的那样使用 using
  • 没有抛出异常 - 所有行都顺利通过。当我想从外部应用程序访问 dbf 文件时,会显示文件访问被拒绝。我使用 using 和 dispose - 它不起作用

标签: c# .net ado.net connection dbf


【解决方案1】:

您没有关闭 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

【讨论】:

  • 我正在使用它 - 仍然显示文件访问被拒绝。也许是打开文件的一种方式不独占?
  • @BKI:你能缩小范围吗?您能否生成一个重现问题的最小示例(例如,仅打开连接、仅执行单个命令等)?
  • 您的代码运行良好,但也使用此 dbf 文件的第二个应用程序在我关闭主应用程序之前无法访问该文件。也许这是垃圾收集器的问题?我会尝试使用非独占连接
  • @BKI:我明白这一点。不过,你能给出一个minimal的例子吗?
  • 我不确定我是否理解你,但是: ConnectionString: Provider=vfpoledb.1;Data Source=D:\\transmisja\\nch2\\konta.dbf;Collat​​ing Sequence=机器查询:插入 D:\\transmisja\\nch2\\konta.dbf (rk, Na,Ks) 值 (0,'Jankowicz Józefa','200 23 010e4')
【解决方案2】:

我已经解决了我的问题,我执行了两点:
- 我已经更改了所有 ado.net 代码,就像 Heinzi 写的那样
- 我使用了来自support.microsoft.com/kb/260856的信息

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

【讨论】:

    最近更新 更多