C # Form / Access Database вставить строку с полем «автонумерация» - PullRequest
0 голосов
/ 23 марта 2012

Два следующих примера кода C #, записывающих информацию в базу данных Access, насколько я могу судить, ДОЛЖНЫ выдавать один и тот же результат.Однако первый работает, а второй выдает ошибку.

Первый код: Без поля первичного ключа AutoNumber работает отлично.Но только до тех пор, пока я не попытаюсь добавить строку, где любое поле не отличается.У меня должен быть уникальный идентификатор AUTONUMBER (по очевидной причине отсутствия разногласий)

string vsql = string.Format("insert into Log values " +
    "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}')",
    comboBox1.Text,
    comboBox2.Text,
    int.Parse(textBox1.Text),
    int.Parse(textBox1.Text),
    textBox3.Text,
    textBox2.Text,
    addRemove
    );

Второй код: возвращает сообщение об ошибке:

"Дополнительная информация: количество значений запроса и полей назначения не совпадают."

Насколько я вижу, они оба имеют одинаковое количество полей.И все же, ни у одного из них нет уникального поля AUTONUMBER ID, которое я не могу добавить, потому что я не знаю, как заставить код «вставлять» или «не вставлять» что-либо в поле автонумерации.Опять же, мне явно нужно поле.ЛЮБАЯ ПОМОЩЬ ЦЕНИТСЯ!Любой код является приемлемым, если у меня есть поле autonumber, которое будет обновляться само по себе, когда моя форма отправляет новую запись.

string vsql = string.Format("INSERT INTO Log (" +
    "Location, " +
    "Drug, " +
    "Quantity, " +
    "Strength, " +
    "Initials, " +
    "'Date'," +
    "add_Remove" +
    ") VALUES (" +
    comboBox1.Text,
    comboBox2.Text,
    int.Parse(textBox1.Text),
    int.Parse(textBox1.Text),
    textBox3.Text,
    textBox2.Text,
    addRemove);

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Я не уверен, правильно ли вы используете String.Format

Попробуйте развить этот код:

string vsql = string.Format(
    "INSERT INTO Log ( Location, Drug, Quantity, Strength, Initials, [Date], add_Remove) "   +
    "VALUES ('{0}', '{1}', {2}, {3}, '{4}', '{5}', '{6}')",
    comboBox1.Text, comboBox2.Text, int.Parse(textBox1.Text), int.Parse(textBox1.Text),
    textBox3.Text, textBox2.Text, addRemove);

Примечание : я не тестировал Редактировать : добавлена ​​пропущенная кома

2 голосов
/ 23 марта 2012

Попробуйте это: сразу после команды вставки sql выполните еще один вызов sql:

SELECT @@IDENTITY

Возвращенным результатом будет поле autonumber, связанное с только что добавленной записью. Ваша исходная команда вставки sql НЕ должна пытаться вставить значение поля autonumber. Просто опустите это.

Кроме того, ваш второй текст sql имеет проблему. Переформатируйте его так, чтобы он выглядел так:

string vsql = string.Format("insert into Log (Location,Drug,Quantity,"+
   "Strength,Initials,Date,add_Remove values" +
   "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}')",
     comboBox1.Text,
     comboBox2.Text,
     int.Parse(textBox1.Text),
     int.Parse(textBox1.Text),
     textBox3.Text,
     textBox2.Text,
     addRemove
     );
1 голос
/ 02 апреля 2012

Я некоторое время искал в Интернете, пытаясь обернуть голову вокруг полученных ответов.Все из которых были отличными предложениями.Это был отличный пример "Бритвы Оккама".Я вставил следующую строку перед строкой "string vsql", и она работает как шарм.

Спасибо всем, кто ответил!

OleDbCommand dbCommand;
OleDbDataReader dbReader;
new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\MyDatabase.accdb");
dbCommand = new OleDbCommand("select count(*) as Record_Count from Log", vcon);
dbReader = dbCommand.ExecuteReader();
if (dbReader.Read() == true)
    rowCount = dbReader["Record_Count"].ToString();
else
    return;
...