C# как правильно писать в.dbf (foxpro)
Я пытаюсь вставить новые данные в старую базу данных.dbf, созданную с помощью foxpro. В базе данных много столбцов, и мне не нужно заполнять каждый из них.
Само соединение работает. Но теперь я получаю исключение "Поле XY не допускает нулевые значения" для каждого, которое я не добавляю в своем операторе вставки. Но база данных настроена для разрешения нулевых значений.
Я использую следующий код:
OleDbConnection dbfcon = new OleDbConnection("Provider=VFPOLEDB.1;" +
"Data Source=" + Application.StartupPath + "\\Daten;");
dbfcon.Open();
String query = "INSERT INTO TB_KUVG (KDNR, Kuvg_id) " +
"VALUES(?,?)";
OleDbCommand cmd = new OleDbCommand(query, dbfcon);
cmd.Parameters.AddWithValue("@KDNR", 1);
cmd.Parameters.AddWithValue("@Kuvg_id", 1);
cmd.ExecuteNonQuery();
dbfcon.Close();
Так что я делаю не так? Что лучше использовать другой способ записи в.dbf из C#?
1 ответ
Вы почти все делаете правильно. Обратите внимание, что имена параметров не важны и будут располагаться позиционно (то есть: @KDNR добавляется первым, чтобы он соответствовал first? Placeholder). Что вы пропустили, так это то, что если поля, которые вы не передаете, не принимают значения NULL, то вы должны уведомить соединение, что вместо этого вы хотите "пустые" значения для этих полей ('' для строки, / / для даты, 0 для числовой и наоборот). Чтобы уведомить водителя, вы выполняете "SET NULL OFF" в том же соединении.
Добавляя его, я немного пересмотрел ваш существующий код:
string dataFolder = Path.Combine(Application.StartupPath, "Daten");
String query = @"INSERT INTO TB_KUVG
(KDNR, Kuvg_id)
VALUES
(?,?)";
using (OleDbConnection dbfcon = new OleDbConnection("Provider=VFPOLEDB;Data Source=" + dataFolder))
{
OleDbCommand cmd = new OleDbCommand(query, dbfcon);
cmd.Parameters.AddWithValue("@KDNR", 1);
cmd.Parameters.AddWithValue("@Kuvg_id", 1);
dbfcon.Open();
new OleDbCommand("set null off",dbfcon).ExecuteNonQuery();
cmd.ExecuteNonQuery();
dbfcon.Close();
}
PS: Application.StartupPath не может быть хорошей идеей, так как он может находиться в разделе "Program Files", который доступен только для чтения.
PS2: Было бы лучше, если бы вы добавили тег "VFP" вместо "DBF".