2012-03-22 4 views
0

Два следующих образца кода C#, записывающих информацию в базу данных Access, насколько я могу судить, СЛЕДУЕТ производить тот же вывод. Однако первый работает, а второй дает ошибку.C# Form/Access Database row row с полем «autonumber»

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

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, которое я не могу добавить, потому что я не знаю, как сделать код «вставить» или «не вставлять» что-либо в поле autonumbering. Опять же, я, очевидно, нуждаюсь в этом поле. ЛЮБАЯ ПОМОЩЬ ОЦЕНИВАЕТСЯ! Любой код допустим, если у меня есть поле автонабора, которое будет обновляться, когда моя форма отправит новую запись.

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); 
+2

Вам не хватает заполнителей? '{0}'? – MilkyWayJoe

+0

С помощью '" insert "или" not insert "' вы имеете в виду Insert или Update? –

+0

какую базу данных вы используете? вы знаете, что можете просто поставить параметр автоинкремента при создании базы данных. –

ответ

2

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

SELECT @@IDENTITY 

Результат, возвращаемый будет полем AutoNumber, связанный с записью, которая была только что добавили. Ваша исходная команда sql 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 
    ); 
+0

На самом деле обе версии 'string.Format' следует отбрасывать вместо использования параметризованного запроса –

+0

@ConradFrix: я не уверен, что он использует DAO или ADO ... Также не уверен, поддерживает ли DAO параметры. Но в принципе, вы на 100% правы. – code4life

+0

Когда кто-то использует DAO или ADO из C# вместо System.Data.OleDb, поддержка параметризованных запросов является наименьшей из их проблем. –

2

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

Try эволюционировать этот код:

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); 

Примечания: Я гавань» t Редактировать: добавлена ​​пропавшая кома

1

Некоторое время я искал веб-сайт, пытаясь обмануть ответы, полученные мной. Все это были отличные предложения. Это был отличный пример «Бритвы Оккама». Я вставил следующее перед строкой «строка 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;