Как запросить файл Foxpro .DBF с индексным файлом.NDX, используя драйвер OLEDB в C#
У меня есть файл Foxpro .DBF. Я использую драйвер OLEDB для чтения файла.DBF. Я могу запросить DBF и использовать его индексный файл.CDX (потому что он открывается автоматически). Моя проблема в том, что я хочу запросить его с помощью файла индекса.NDX (который не открывается автоматически при открытии.DBF). Как я могу открыть файл.NDX в C# с помощью драйвера OLEDB, потому что 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);
}
}
2 ответа
Файлы 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();
}
Строка подключения должна указывать только путь PATH, в котором находятся файлы.dbf.
Тогда ваш запрос только по имени таблицы.
new OleDbConnection("Provider=VFPOLEDB.1;Data Source=P:\\Test\\;Exclusive=No"))
selectCmd = @"select * from DSPC-1 where dp_file = '860003'";
Что касается использования.NDX, как / где это было создано... Это старый файл dBASE, для которого вы используете драйвер Visual Foxpro?
Если это отдельное, как описано, вам, возможно, потребуется сделать это через ExecScript(), чтобы явно открыть файл сначала С помощью индекса, затем запустите ваш запрос. Это просто ОБРАЗЕЦ С ВАШИМ ИСПРАВЛЕННЫМ значением. Вам, вероятно, придется ПАРАМЕТРИРОВАТЬ его, иначе вы будете открыты для sql-инъекции.
cmd.CommandText = string.Format(
@"EXECSCRIPT('
USE DSPC-1 INDEX YourDSPC-1.NDX
SELECT * from DSPC-1 where dp_file = '860003'" );
Кроме того, у вас могут возникнуть проблемы с переносом имен таблиц, вам может потребоваться заключить их в [квадратные скобки], но не положительно, если это проблема.