Необходимо вставить новую пустую запись (строку) в существующий файл DBF (формат dbase III) - PullRequest
0 голосов
/ 26 апреля 2019

Я пишу заявление, которое должно: а.) Откройте существующий файл DBF, затем, б.) Добавить новую пустую запись (строку), затем c.) Добавьте некоторые данные в одно или несколько полей в новой записи, d.) Закройте файл DBF

У меня уже есть код, работающий для открытия и чтения файла dbf и отображения содержимого в виде таблицы данных. Это работает отлично. Но я искал 3 дня, несколько часов в день, и нигде не могу найти никакого руководства или примера, как просто добавить одну пустую запись.

Примечание: новая запись должна быть просто новой пустой записью, добавленной к существующему файлу (файл автоматически создается другим приложением - поэтому все столбцы установлены и не должны определяться моим приложением)

Вот код, который я использую, чтобы открыть и прочитать таблицу, а затем подсчитать строки.

OleDbConnection oConn = new OleDbConnection(
        "Provider=VFPOLEDB.1;SourceType=DBF;Data Source=.\\;");
oConn.Open();
System.Data.OleDb.OleDbCommand oCmd = oConn.CreateCommand();

string dbname = "SELECT * FROM C:\\rmwin\\poslink.dbf";

oCmd.CommandText = dbname;

DataTable emp = new DataTable();
emp.Load(oCmd.ExecuteReader());

oConn.Close();
dg1.DataSource = emp; 
int rowcount = emp.Rows.Count;

Данные отображаются правильно в dg1 (мой элемент управления datagridview). Теперь я хочу просто добавить новую запись в POSLINK.DBF. Любое руководство будет с благодарностью.

1 Ответ

1 голос
/ 26 апреля 2019

Один пример, показывающий обновление SQL, но принципы те же

Для начала ваш источник соединения OleDb должен указывать путь, где находятся данные, а не просто относительный путь. \, Который не всегда может быть хорошим выбором. Затем все ваши запросы на вставку, обновление, удаление выполняются из этой папки, поэтому вам не нужно явно указывать все пути. Просто имя таблицы.

 OleDbConnection oConn = new OleDbConnection(
            "Provider=VFPOLEDB.1;SourceType=DBF;Data Source=C:\\rmwin\\;");

Теперь ваша команда. Чтобы добавить, обновить и удалить, вы можете сделать с помощью довольно распространенных SQL-операторов. Однако не объединяйте значения, которые вы пытаетесь вставить или обновить, что подвергает вас воздействию SQL-инъекции. Вместо этого OleDb использует "?" символ в качестве заполнителя для параметра, добавляемого в команду, и все "?" необходимо добавить параметры в том же порядке.

Итак, чтобы получить выбор, начните с того, что у вас есть

System.Data.OleDb.OleDbCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = "select * from PosLink";

для вставки, создайте команду, определите все поля, которые вы пытаетесь вставить ... очевидно, не знаете содержимого вашей таблицы

oCmd.CommandText = 
@"insert into PosLink
   ( TryColumn1,
     TryColumn2,
     TryColumn3 )
   values
   ( ?,
     ?,
     ? ) ";

Теперь добавьте параметры, которые поступают откуда угодно, с вашего экрана / источника

oCmd.Parameters.AddWithValue( "parmTryColumn1", yourCSharpClassOrPropertyStringField );
oCmd.Parameters.AddWithValue( "parmTryColumn2", DateTime.Now );
oCmd.Parameters.AddWithValue( "parmTryColumn3", 12345 );

Обратите внимание, что для именования параметров у меня есть префикс "parm" только для того, чтобы узнать его параметр, а не фактический столбец вставки. Они должны быть в том же порядке, что и вставка.

Затем вы можете выполнить его ... Так как это INSERT, ничего не возвращается, поэтому считается незапрошенным, но вернет счетчик количества затронутых записей ... будет ожидать 1, если все в порядке, 0 или отрицательный, если отказ для чего-либо еще.

   var recordCountInserted = oCmd.ExecuteNonQuery();

Надеюсь, это поможет вам начать работу и продолжить свой путь.

Что касается добавления пустого поля, для этого потребуется скрипт. В VFP вы бы сделали что-то вроде

use SomeTable
append blank

Итак, создайте строку для этих команд (НЕ ВСЕ КОМАНДЫ поддерживаются в VfpOleDb, но наиболее распространенные, которые вы ожидаете, данные, дата, строка, общие функции работают)

oCmd.CommandText = 
@"execScript('use SomeTable
append blank
use' )";

oCmd.ExecuteNonQuery();

Да, вы можете делать код VFP следующим образом, но не все разрешено

Множество других ссылок из моей истории публикации для VFP, OleDb, параметризованных запросов и т. Д. В этом сообществе также есть и другие сильные разработчики VFP.

...