关于在 C# 中读取多个 .dbf 文件
About reading multiple .dbf files in C#
目前我正在制作一个从多个 dBase 文件 (.dbf) 导入值的程序。我已经有了一个充满字符串的列表,这些字符串具有 dBase 文件的名称。该列表名为 FicheirosParaAnalisar
。 dBase 文件并不总是具有相同的行,但它们的所有相同列都充满了我想要从一个名为 sigla_parametro
的特定列中获取的值。 dBase 文件在 path9
我现在的代码是这样的:
private void button6_Click(object sender, EventArgs e)
{
///*
//Console.WriteLine(sigla_parametro);
try
{
parametro = comboBox12.Text; //Console.WriteLine(parametro);
for (int FA = 0; FA < FicheirosParaAnalisar.Count; FA++)
{
//Console.WriteLine(FicheirosParaAnalisar[FA]+".dbf");
if (importar == true)
{
//........................................................................
string connectionStringTotal = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path9 + ";Extended Properties=dBASE III;";
OleDbConnection connectionsTotal = new OleDbConnection(connectionStringTotal);
connectionsTotal.Open();
// Comando de aquisição dos dados da Base de Dados
string Comand_Strings_Total = "Select * From [" + FicheirosParaAnalisar[FA] + "]";
OleDbDataAdapter DataAdaptersTotal = new OleDbDataAdapter(Comand_Strings_Total, connectionsTotal);
DataSet datasetsTotal = new DataSet();
DataAdaptersTotal.Fill(datasetsTotal);
// Obter os valores dos parâmetros
int count = datasetsTotal.Tables[0].Rows.Count;
for (int i = 0; i < count; i++)
{
try
{
valores_parametro.Add(FicheirosParaAnalisar[FA] + "_" + datasetsTotal.Tables[0].Rows[i][sigla_parametro].ToString());
}
catch (System.Data.OleDb.OleDbException exe)
{
string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + exe.Message + "\n";
System.IO.File.AppendAllText(log, text);
}
catch (Exception lolex)
{
string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + lolex.Message + "\n";
System.IO.File.AppendAllText(log, text);
}
}
count = 0;
}
Console.WriteLine("Ficheiro nº " + FA + " Importado!");
}
}
catch (Exception ex)
{
string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + ex.Message + "\n";
System.IO.File.AppendAllText(log, text);
}
//*/
valores_parametro.ForEach(Console.WriteLine);
button1.Enabled = true;
}
上面的代码仅在我找到所有 dBase 文件时才计算(如果是这样,变量 importar
变为真)。理论上我做的一切都是正确的,因为文件存在并且我已经正确分配了每个变量,但实际上我在这段代码中遇到了问题,因为当我读取所有 dBase 文件时,有些文件无法读取并且正如我在 LogFile.txt
中看到的那样出现异常。出现的消息是:
A first chance exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll
现在想请教各位Whosebug in C#的高手,我哪里做错了?如何将列 sigla_parametro
中的所有数据获取到字符串列表 valores_parametro
中?如何解决我的异常?
注意:
我也试过使用这个 Connection String
string connectionStringTotal = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path9 + ";Extended Properties=dBASE IV;";
字符串 path9
是包含我的所有 dBase 文件的文件夹的路径。
string path9 = "C:\ProgramData\CK electronic\MPA5\Data";
字符串列表 FicheirosParaAnalisar
有这个字符串:
CL-1831-150615-1
CL-1831-150615-2
CL-1831-150615-3
CL-1831-150615-4
CL-1831-150615-5
CL-1832-150611-1
CL-1832-150611-2
CL-1832-150611-3
CL-1832-150611-4
CL-1832-150611-5
CL-1833-150611-1
CL-1833-150611-2
CL-1833-150611-3
CL-1833-150611-4
CL-1833-150611-5
CL-1834-150611-1
CL-1834-150611-2
CL-1834-150611-3
CL-1834-150611-4
CL-1834-150611-5
CL-1835-150611-1
CL-1835-150611-2
CL-1835-150611-3
CL-1835-150611-4
CL-1835-150611-5
CL-1836-150612-1
CL-1836-150612-2
CL-1836-150612-3
CL-1836-150612-4
CL-1836-150612-5
CL-1837-150618-1
CL-1837-150618-2
CL-1837-150618-3
CL-1837-150618-4
CL-1837-150618-5
CL-1838-150611-1
CL-1838-150611-2
CL-1838-150611-3
CL-1838-150611-4
CL-1838-150611-5
CL-1839-150617-1
CL-1839-150617-2
CL-1839-150617-3
CL-1839-150617-4
CL-1839-150617-5
CL-1840-150611-1
CL-1840-150611-2
CL-1840-150611-3
CL-1840-150611-4
CL-1840-150611-5
CL-1841-150611-1
CL-1841-150611-2
CL-1841-150611-3
CL-1841-150611-4
CL-1841-150611-5
CL-1842-150611-1
CL-1842-150611-2
CL-1842-150611-3
CL-1842-150611-4
CL-1842-150611-5
CL-1843-150612-1
CL-1843-150612-2
CL-1843-150612-3
CL-1843-150612-4
CL-1843-150612-5
CL-1844-150616-1
CL-1844-150616-2
CL-1844-150616-3
CL-1844-150616-4
CL-1844-150616-5
CL-1844-150616-6
CL-1845-150615-1
CL-1845-150615-2
CL-1845-150615-3
CL-1845-150615-4
CL-1845-150615-5
CL-1846-150616-1
CL-1846-150616-2
CL-1846-150616-3
CL-1846-150616-4
CL-1847-150612-1
CL-1847-150612-2
CL-1847-150612-3
CL-1847-150612-4
CL-1847-150612-5
CL-1848-150612-1
CL-1848-150612-2
CL-1848-150612-3
CL-1848-150612-4
CL-1848-150612-5
CL-1850-150617-1
CL-1850-150617-2
CL-1850-150617-3
CL-1850-150617-4
CL-1850-150617-5
CL-1851-150616-1
CL-1851-150616-2
CL-1851-150616-3
CL-1851-150616-4
CL-1851-150616-5
CL-1852-150612-1
CL-1852-150612-2
CL-1852-150612-3
CL-1852-150612-4
CL-1852-150612-5
CL-1853-150616-1
CL-1853-150616-2
CL-1853-150616-3
CL-1853-150616-4
CL-1853-150616-5
CL-1854-150615-1
CL-1854-150615-2
CL-1854-150615-3
CL-1854-150615-4
CL-1854-150615-5
CL-1855-150616-1
CL-1855-150616-2
CL-1855-150616-3
CL-1855-150616-4
CL-1855-150616-5
CL-1856-150615-1
CL-1856-150615-2
CL-1856-150615-3
CL-1856-150615-4
CL-1856-150615-5
CL-1857-150616-1
CL-1857-150616-2
CL-1857-150616-3
CL-1857-150616-4
CL-1857-150616-5
CL-1858-150618-1
CL-1858-150618-2
CL-1858-150618-3
CL-1858-150618-4
CL-1858-150618-5
CL-1860-150618-1
CL-1860-150618-2
CL-1860-150618-3
CL-1860-150618-4
CL-1860-150618-5
CL-1861-150618-1
CL-1861-150618-2
CL-1861-150618-3
CL-1861-150618-4
CL-1861-150618-5
CL-1862-150618-1
CL-1862-150618-2
CL-1862-150618-3
CL-1862-150618-4
CL-1862-150618-5
CL-1863-150618-1
CL-1863-150618-2
CL-1863-150618-3
CL-1863-150618-4
CL-1863-150618-5
重要的是告诉你,我有管理员权限,可以读写文件夹中的数据!
没有你实际变量的样本,我会提出这个问题并认为它可能是你的答案。
您的 OleDb 连接字符串应仅指向 table 所在的路径,而不是路径 + TABLE 名称。连接到 PATH 后,您可以查询该路径中的任何 table...
例如:
string connectionStringTotal = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SomePathToYourData;Extended Properties=dBASE III;";
OleDbConnection connectionsTotal = new OleDbConnection(connectionStringTotal);
connectionsTotal.Open();
那么,你可以
string Comand_Strings_Total = "Select * From Table1";
string Comand_Strings_Total = "Select * From Table2";
string Comand_Strings_Total = "Select * From Table3";
(或使用 for 循环构建)
因此,如果您需要加入 tables,您可以
select T1.*, T2.*
from Table1 T1
JOIN Table2 T2
on T1.Key = T2.MatchingKey
两个 table 都位于同一文件夹中。
好的,你的路径变量只是路径...过去有几次,其他人错误地连接到 INCLUDE dbf。
至于您的 table 名称,所有名称中都带有“-”可能是 OleDb 提供程序的问题。是的,table 周围有 [方括号],但这可能还不够好。您可能需要将其更改为 QUOTES,甚至可能将 "alias" 添加到您的查询中......也许类似于..
// This version uses double-quotes around the table name
string Comand_Strings_Total = string.Format( "Select * From \"{0}\" ", FicheirosParaAnalisar[FA] );
或者这为查询添加别名 "tmp" 引用。
string Comand_Strings_Total = string.Format( "Select tmp.* From \"{0}\" tmp", FicheirosParaAnalisar[FA] );
如果仍然有错误,文件是具体的 dBASE,还是只是 .dbf。您可以通过下载 Microsoft 的 Visual Foxpro OleDb Data Provider 使其正常工作。其余的连接、命令、数据适配器的 OleDb 上下文是相同的。它可能会为您提供更好的连接选项。只需要更改提供程序连接字符串。至
@"Provider=VFPOLEDB.1;Data Source=c:\YourDataPath\SomeSubFolder;";
目前我正在制作一个从多个 dBase 文件 (.dbf) 导入值的程序。我已经有了一个充满字符串的列表,这些字符串具有 dBase 文件的名称。该列表名为 FicheirosParaAnalisar
。 dBase 文件并不总是具有相同的行,但它们的所有相同列都充满了我想要从一个名为 sigla_parametro
的特定列中获取的值。 dBase 文件在 path9
我现在的代码是这样的:
private void button6_Click(object sender, EventArgs e)
{
///*
//Console.WriteLine(sigla_parametro);
try
{
parametro = comboBox12.Text; //Console.WriteLine(parametro);
for (int FA = 0; FA < FicheirosParaAnalisar.Count; FA++)
{
//Console.WriteLine(FicheirosParaAnalisar[FA]+".dbf");
if (importar == true)
{
//........................................................................
string connectionStringTotal = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path9 + ";Extended Properties=dBASE III;";
OleDbConnection connectionsTotal = new OleDbConnection(connectionStringTotal);
connectionsTotal.Open();
// Comando de aquisição dos dados da Base de Dados
string Comand_Strings_Total = "Select * From [" + FicheirosParaAnalisar[FA] + "]";
OleDbDataAdapter DataAdaptersTotal = new OleDbDataAdapter(Comand_Strings_Total, connectionsTotal);
DataSet datasetsTotal = new DataSet();
DataAdaptersTotal.Fill(datasetsTotal);
// Obter os valores dos parâmetros
int count = datasetsTotal.Tables[0].Rows.Count;
for (int i = 0; i < count; i++)
{
try
{
valores_parametro.Add(FicheirosParaAnalisar[FA] + "_" + datasetsTotal.Tables[0].Rows[i][sigla_parametro].ToString());
}
catch (System.Data.OleDb.OleDbException exe)
{
string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + exe.Message + "\n";
System.IO.File.AppendAllText(log, text);
}
catch (Exception lolex)
{
string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + lolex.Message + "\n";
System.IO.File.AppendAllText(log, text);
}
}
count = 0;
}
Console.WriteLine("Ficheiro nº " + FA + " Importado!");
}
}
catch (Exception ex)
{
string text = "[MPA5 - " + DateTime.Now.ToString() + "] Excepção encontrada: " + ex.Message + "\n";
System.IO.File.AppendAllText(log, text);
}
//*/
valores_parametro.ForEach(Console.WriteLine);
button1.Enabled = true;
}
上面的代码仅在我找到所有 dBase 文件时才计算(如果是这样,变量 importar
变为真)。理论上我做的一切都是正确的,因为文件存在并且我已经正确分配了每个变量,但实际上我在这段代码中遇到了问题,因为当我读取所有 dBase 文件时,有些文件无法读取并且正如我在 LogFile.txt
中看到的那样出现异常。出现的消息是:
A first chance exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll
现在想请教各位Whosebug in C#的高手,我哪里做错了?如何将列 sigla_parametro
中的所有数据获取到字符串列表 valores_parametro
中?如何解决我的异常?
注意: 我也试过使用这个 Connection String
string connectionStringTotal = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path9 + ";Extended Properties=dBASE IV;";
字符串 path9
是包含我的所有 dBase 文件的文件夹的路径。
string path9 = "C:\ProgramData\CK electronic\MPA5\Data";
字符串列表 FicheirosParaAnalisar
有这个字符串:
CL-1831-150615-1
CL-1831-150615-2
CL-1831-150615-3
CL-1831-150615-4
CL-1831-150615-5
CL-1832-150611-1
CL-1832-150611-2
CL-1832-150611-3
CL-1832-150611-4
CL-1832-150611-5
CL-1833-150611-1
CL-1833-150611-2
CL-1833-150611-3
CL-1833-150611-4
CL-1833-150611-5
CL-1834-150611-1
CL-1834-150611-2
CL-1834-150611-3
CL-1834-150611-4
CL-1834-150611-5
CL-1835-150611-1
CL-1835-150611-2
CL-1835-150611-3
CL-1835-150611-4
CL-1835-150611-5
CL-1836-150612-1
CL-1836-150612-2
CL-1836-150612-3
CL-1836-150612-4
CL-1836-150612-5
CL-1837-150618-1
CL-1837-150618-2
CL-1837-150618-3
CL-1837-150618-4
CL-1837-150618-5
CL-1838-150611-1
CL-1838-150611-2
CL-1838-150611-3
CL-1838-150611-4
CL-1838-150611-5
CL-1839-150617-1
CL-1839-150617-2
CL-1839-150617-3
CL-1839-150617-4
CL-1839-150617-5
CL-1840-150611-1
CL-1840-150611-2
CL-1840-150611-3
CL-1840-150611-4
CL-1840-150611-5
CL-1841-150611-1
CL-1841-150611-2
CL-1841-150611-3
CL-1841-150611-4
CL-1841-150611-5
CL-1842-150611-1
CL-1842-150611-2
CL-1842-150611-3
CL-1842-150611-4
CL-1842-150611-5
CL-1843-150612-1
CL-1843-150612-2
CL-1843-150612-3
CL-1843-150612-4
CL-1843-150612-5
CL-1844-150616-1
CL-1844-150616-2
CL-1844-150616-3
CL-1844-150616-4
CL-1844-150616-5
CL-1844-150616-6
CL-1845-150615-1
CL-1845-150615-2
CL-1845-150615-3
CL-1845-150615-4
CL-1845-150615-5
CL-1846-150616-1
CL-1846-150616-2
CL-1846-150616-3
CL-1846-150616-4
CL-1847-150612-1
CL-1847-150612-2
CL-1847-150612-3
CL-1847-150612-4
CL-1847-150612-5
CL-1848-150612-1
CL-1848-150612-2
CL-1848-150612-3
CL-1848-150612-4
CL-1848-150612-5
CL-1850-150617-1
CL-1850-150617-2
CL-1850-150617-3
CL-1850-150617-4
CL-1850-150617-5
CL-1851-150616-1
CL-1851-150616-2
CL-1851-150616-3
CL-1851-150616-4
CL-1851-150616-5
CL-1852-150612-1
CL-1852-150612-2
CL-1852-150612-3
CL-1852-150612-4
CL-1852-150612-5
CL-1853-150616-1
CL-1853-150616-2
CL-1853-150616-3
CL-1853-150616-4
CL-1853-150616-5
CL-1854-150615-1
CL-1854-150615-2
CL-1854-150615-3
CL-1854-150615-4
CL-1854-150615-5
CL-1855-150616-1
CL-1855-150616-2
CL-1855-150616-3
CL-1855-150616-4
CL-1855-150616-5
CL-1856-150615-1
CL-1856-150615-2
CL-1856-150615-3
CL-1856-150615-4
CL-1856-150615-5
CL-1857-150616-1
CL-1857-150616-2
CL-1857-150616-3
CL-1857-150616-4
CL-1857-150616-5
CL-1858-150618-1
CL-1858-150618-2
CL-1858-150618-3
CL-1858-150618-4
CL-1858-150618-5
CL-1860-150618-1
CL-1860-150618-2
CL-1860-150618-3
CL-1860-150618-4
CL-1860-150618-5
CL-1861-150618-1
CL-1861-150618-2
CL-1861-150618-3
CL-1861-150618-4
CL-1861-150618-5
CL-1862-150618-1
CL-1862-150618-2
CL-1862-150618-3
CL-1862-150618-4
CL-1862-150618-5
CL-1863-150618-1
CL-1863-150618-2
CL-1863-150618-3
CL-1863-150618-4
CL-1863-150618-5
重要的是告诉你,我有管理员权限,可以读写文件夹中的数据!
没有你实际变量的样本,我会提出这个问题并认为它可能是你的答案。
您的 OleDb 连接字符串应仅指向 table 所在的路径,而不是路径 + TABLE 名称。连接到 PATH 后,您可以查询该路径中的任何 table...
例如:
string connectionStringTotal = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SomePathToYourData;Extended Properties=dBASE III;";
OleDbConnection connectionsTotal = new OleDbConnection(connectionStringTotal);
connectionsTotal.Open();
那么,你可以
string Comand_Strings_Total = "Select * From Table1";
string Comand_Strings_Total = "Select * From Table2";
string Comand_Strings_Total = "Select * From Table3";
(或使用 for 循环构建)
因此,如果您需要加入 tables,您可以
select T1.*, T2.*
from Table1 T1
JOIN Table2 T2
on T1.Key = T2.MatchingKey
两个 table 都位于同一文件夹中。
好的,你的路径变量只是路径...过去有几次,其他人错误地连接到 INCLUDE dbf。
至于您的 table 名称,所有名称中都带有“-”可能是 OleDb 提供程序的问题。是的,table 周围有 [方括号],但这可能还不够好。您可能需要将其更改为 QUOTES,甚至可能将 "alias" 添加到您的查询中......也许类似于..
// This version uses double-quotes around the table name
string Comand_Strings_Total = string.Format( "Select * From \"{0}\" ", FicheirosParaAnalisar[FA] );
或者这为查询添加别名 "tmp" 引用。
string Comand_Strings_Total = string.Format( "Select tmp.* From \"{0}\" tmp", FicheirosParaAnalisar[FA] );
如果仍然有错误,文件是具体的 dBASE,还是只是 .dbf。您可以通过下载 Microsoft 的 Visual Foxpro OleDb Data Provider 使其正常工作。其余的连接、命令、数据适配器的 OleDb 上下文是相同的。它可能会为您提供更好的连接选项。只需要更改提供程序连接字符串。至
@"Provider=VFPOLEDB.1;Data Source=c:\YourDataPath\SomeSubFolder;";