2015-01-28 4 views
0

мой код вставляет некоторые данные в БД доступа. Код был сбой в том, что (код использует библиотеку для загрузки электронной почты, но ошибка не по-видимому, связанные с этим):Вставка строки в MS Access с C#

foreach (MimeData mime in email.Attachments) 
{ 

    string name = NumEmail + mime.SafeFileName; 
    string path = (@"\\pathrandom" + name); 
    mime.Save(path); 
    long length = new System.IO.FileInfo(path).Length; 

    String my_querry2 = "INSERT INTO Table(id, field1, field2, field3, field4)VALUES('" + path + "','" + length + "','" + name+ "','" + value3 + "','" + date + "')"; 
    MessageBox.Show(my_querry2); 
    OleDbCommand cmd2 = new OleDbCommand(my_querry, conn); 
    cmd.ExecuteNonQuery();      
} 

(идентификатор, дата и value3 переменные, определенные из Еогеасп с строка foo, дата сегодняшнего дня и строка foo).

Когда я запускаю этот код, вставка не возникает, и ExecutedNonQuery() возвращает ошибку. Он говорит, что запрос не выполнялся, потому что он создавал бы повторяющиеся значения. Но таблица полностью пуста, поэтому «id» не может быть повторен. Я пытался сделать запрос доступа и делать это:

INSERT INTO AchivosAdjuntos(id, field1, field2, field3, field4)VALUES('\\path','171','x.png','random','28/01/2015')

И она прекрасно работает (значения те же, что в C# попытаться вставить), вставив значения.

Соединение с БД кажется прекрасным, потому что перед этим вставкой я сделал другие, которые хорошо работали.

Итак ... что я делаю неправильно? : S

+0

Пожалуйста, не используйте конкатенацию строить свои заявления SQL, как вы оставляете себя широко открыты для инъекции SQL. Вместо этого используйте параметры. – Matt

+0

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

+0

Как я уже сказал, единственным полем с ключом является «id», и таблица полностью пуста, поэтому это не может быть проблемой. Кроме того, я могу вставить те же данные с sql, поэтому я не могу думать, что это действительно проблема дублирования. Я собираюсь попробовать, что сказал Мэтт, и сделать это с параметрами. – Nimrrod

ответ

1

Используйте параметры

 string my_querry2 = "INSERT INTO Table(id, field1, field2, field3, field4)VALUES(@paramPath,@paramLength,@paramName,@paramValue3,@paramDate)"; 
     OleDbCommand cmd2 = new OleDbCommand(my_querry2, conn); 
     cmd2.Parameters.Add(new OleDbParameter("@paramPath", path)); 
     cmd2.Parameters.Add(new OleDbParameter("@paramLength", length)); 
     cmd2.Parameters.Add(new OleDbParameter("@paramName", name)); 
     cmd2.Parameters.Add(new OleDbParameter("@paramValue3", value3)); 
     cmd2.Parameters.Add(new OleDbParameter("@paramDate", date)); 
     cmd2.ExecuteNonQuery(); 
+0

Не знаете, почему, но с параметрами работали! спасибо вам и матушкам, и другим людям, которые сказали это: P – Nimrrod

Смежные вопросы