0

我正在开发一个 C# 程序,该程序将读取 DBF 文件并将表导入 MySQL 数据库。我能够获取所有 DBF 文件位置的目录并读取大部分 DBF 文件。问题是 17 个 DBF 文件中有 2 个会抛出 myDataAdapter.Fill(myDataSet); 异常。

这是我的代码:

private void button2_Click(object sender, EventArgs e)
{
    DirectoryInfo dir = new DirectoryInfo(Regex.Replace(textBox1.Text, @"\\", @"\\"));
    string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dir + ";Extended Properties=dBase III";
    DataSet myDataSet = new DataSet();
    OleDbConnection myAccessConn = null;

    try
    {
        myAccessConn = new OleDbConnection(strAccessConn);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message);
        return;
    }

    foreach (FileInfo file in dir.GetFiles())
    {
        MessageBox.Show(file.Name.Substring(0, file.Name.Length - 4));
        string strAccessSelect = "SELECT * FROM " + file.Name.Substring(0, file.Name.Length - 4);
        OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);
        OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);

        myAccessConn.Open();
        myDataAdapter.Fill(myDataSet);

        myAccessConn.Close();

    }
    MessageBox.Show("End");
}

这些是错误消息:

System.Data.dll 中出现“System.Data.OleDb.OleDbException”类型的未处理异常

附加信息:Microsoft Jet 数据库引擎找不到对象“SomeFile”。确保对象存在并且正确拼写其名称和路径名。

这是什么原因造成的?我已经打印出 dir、file.name 和 strAccessSelect,并且所有内容看起来都拼写正确。

任何帮助将不胜感激,谢谢!

- 更新 -

我检查了文件权限,每个用户都拥有完全权限。

不确定这会有多大帮助,但有时当我重命名文件(例如:SomeFile1)时,它会起作用并且我不会收到错误消息......大多数时候这不起作用。

4

2 回答 2

0

问题是strAccessConn。我不得不使用以下代码:

if ((file.Name.Substring(0, file.Name.Length - 4) == "SomeFile1") || (file.Name.Substring(0, file.Name.Length - 4) == "SomeFile2"))
{
    strAccessConn = @"Provider=vfpoledb;Data Source=" + dir + ";Collating Sequence=machine;";
}
else
{
    strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dir + ";Extended Properties=dBase IV";
}

每个文件都需要不同的连接字符串

于 2014-01-24T04:30:28.013 回答
0

我会尝试使用Path.GetFileNameWithoutExtension来确保文件名正确

string strAccessSelect = "SELECT * FROM " + Path.GetFileNameWithoutExtension(file.Name);
OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);

如果这不起作用,唯一可能的原因是文件被其他进程锁定或权限问题

于 2014-01-21T22:56:32.723 回答