如何使用 C# 中的 OLEDB 驱动程序查询带有 .NDX 索引文件的 Foxpro .DBF 文件
How to query a Foxpro .DBF file with .NDX index file using the OLEDB driver in C#
我有一个 Foxpro .DBF 文件。我正在使用 OLEDB 驱动程序读取 .DBF 文件。我可以查询 DBF 并利用其 .CDX 索引文件(因为它是自动打开的)。我的问题是我想用 .NDX 索引文件(打开 .DBF 时不会自动打开)查询它。我如何使用 OLEDB 驱动程序在 C# 中打开 .NDX 文件,因为 DBF 真的很大,无法在没有索引的情况下搜索记录?谢谢大家!这是我用来读取 DBF 的代码。
OleDbConnection oleDbConnection = null;
try
{
DataTable resultTable = new DataTable();
using (oleDbConnection = new OleDbConnection("Provider=VFPOLEDB.1;Data Source=P:\Test\DSPC-1.DBF;Exclusive=No"))
{
oleDbConnection.Open();
if (oleDbConnection.State == ConnectionState.Open)
{
OleDbDataAdapter dataApdapter = new OleDbDataAdapter();
OleDbCommand command = oleDbConnection.CreateCommand();
string selectCmd = @"select * from P:\Test\DSPC-1 where dp_file = '860003'";
command.CommandType = CommandType.Text;
command.CommandText = selectCmd;
dataApdapter.SelectCommand = command;
dataApdapter.Fill(resultTable);
foreach(DataRow row in resultTable.Rows)
{
//Write the data of each record
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
try
{
oleDbConnection.Close();
}
catch (Exception e)
{
Console.WriteLine("Failed to close Oledb connection: " + e.Message);
}
}
您的连接字符串应仅引用指向 .dbf 文件所在位置的路径。
那么,您的查询只是 table 名称。
new OleDbConnection("Provider=VFPOLEDB.1;Data Source=P:\Test\;Exclusive=No"))
selectCmd = @"select * from DSPC-1 where dp_file = '860003'";
至于使用 .NDX,它是如何/在何处创建的...这是您使用 Visual Foxpro 驱动程序的旧 dBASE 文件吗?
如果它是一个单独的描述,您可能需要通过 ExecScript() 来显式打开文件,首先使用索引,然后 运行 您的查询。这只是您的固定值的示例。您可能必须对其进行参数化,否则您将接受 sql-injection.
cmd.CommandText = string.Format(
@"EXECSCRIPT('
USE DSPC-1 INDEX YourDSPC-1.NDX
SELECT * from DSPC-1 where dp_file = '860003'" );
此外,您的 table 名称可能有连字符问题,您可能需要将其括在 [方括号] 中,但如果这是一个问题则不是肯定的。
ndx 文件默认情况下不会打开,那些真的已经成为过去,为什么不简单地将索引添加到 CDX。如果这不是一个选项,那么 DRapp 的 ExecScript 建议就是您可以做的。他非常接近。以下是您可以如何做到这一点:
string myCommand = @"Use ('P:\Test\DSPC-1') alias myData
Set Index To ('P:\Test\DSPC-1_Custom.NDX')
select * from myData ;
where dp_file = '860003' ;
into cursor crsResult ;
nofilter
SetResultset('crsResult')";
DataTable resultTable = new DataTable();
using (oleDbConnection = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=P:\Test"))
{
oleDbConnection.Open();
OleDbCommand command = new OleDbCommand("ExecScript", oleDbConnection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("code", myCommand);
resultTable.Load(cmd.ExecuteReader());
oleDbConnection.Close();
}
我有一个 Foxpro .DBF 文件。我正在使用 OLEDB 驱动程序读取 .DBF 文件。我可以查询 DBF 并利用其 .CDX 索引文件(因为它是自动打开的)。我的问题是我想用 .NDX 索引文件(打开 .DBF 时不会自动打开)查询它。我如何使用 OLEDB 驱动程序在 C# 中打开 .NDX 文件,因为 DBF 真的很大,无法在没有索引的情况下搜索记录?谢谢大家!这是我用来读取 DBF 的代码。
OleDbConnection oleDbConnection = null;
try
{
DataTable resultTable = new DataTable();
using (oleDbConnection = new OleDbConnection("Provider=VFPOLEDB.1;Data Source=P:\Test\DSPC-1.DBF;Exclusive=No"))
{
oleDbConnection.Open();
if (oleDbConnection.State == ConnectionState.Open)
{
OleDbDataAdapter dataApdapter = new OleDbDataAdapter();
OleDbCommand command = oleDbConnection.CreateCommand();
string selectCmd = @"select * from P:\Test\DSPC-1 where dp_file = '860003'";
command.CommandType = CommandType.Text;
command.CommandText = selectCmd;
dataApdapter.SelectCommand = command;
dataApdapter.Fill(resultTable);
foreach(DataRow row in resultTable.Rows)
{
//Write the data of each record
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
try
{
oleDbConnection.Close();
}
catch (Exception e)
{
Console.WriteLine("Failed to close Oledb connection: " + e.Message);
}
}
您的连接字符串应仅引用指向 .dbf 文件所在位置的路径。
那么,您的查询只是 table 名称。
new OleDbConnection("Provider=VFPOLEDB.1;Data Source=P:\Test\;Exclusive=No"))
selectCmd = @"select * from DSPC-1 where dp_file = '860003'";
至于使用 .NDX,它是如何/在何处创建的...这是您使用 Visual Foxpro 驱动程序的旧 dBASE 文件吗?
如果它是一个单独的描述,您可能需要通过 ExecScript() 来显式打开文件,首先使用索引,然后 运行 您的查询。这只是您的固定值的示例。您可能必须对其进行参数化,否则您将接受 sql-injection.
cmd.CommandText = string.Format(
@"EXECSCRIPT('
USE DSPC-1 INDEX YourDSPC-1.NDX
SELECT * from DSPC-1 where dp_file = '860003'" );
此外,您的 table 名称可能有连字符问题,您可能需要将其括在 [方括号] 中,但如果这是一个问题则不是肯定的。
ndx 文件默认情况下不会打开,那些真的已经成为过去,为什么不简单地将索引添加到 CDX。如果这不是一个选项,那么 DRapp 的 ExecScript 建议就是您可以做的。他非常接近。以下是您可以如何做到这一点:
string myCommand = @"Use ('P:\Test\DSPC-1') alias myData
Set Index To ('P:\Test\DSPC-1_Custom.NDX')
select * from myData ;
where dp_file = '860003' ;
into cursor crsResult ;
nofilter
SetResultset('crsResult')";
DataTable resultTable = new DataTable();
using (oleDbConnection = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=P:\Test"))
{
oleDbConnection.Open();
OleDbCommand command = new OleDbCommand("ExecScript", oleDbConnection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("code", myCommand);
resultTable.Load(cmd.ExecuteReader());
oleDbConnection.Close();
}