2013-06-13 3 views
2

Я пытаюсь вставить данные в базу данных Access с использованием пространства имен System.Data.OleDb и метода OleDbCommandObject.ExecuteNonQuery(), но я получаю ошибки в строках :Добавить пустую строку в список параметров для вставки в AccessDB

OleDbParameterCollection принимает только ненулевой типа OleDbParameter объектов. Имя параметра: значение

и

Параметр? _ [#] не имеет значения по умолчанию

Большинство моих параметров являются строковыми объектами, которые отлично работают, когда значение присваивается им через форму. Однако, когда необязательное поле остается пустым (т.е. someString = "") и форма отправляется, возникает ошибка. Я просмотрел ответы на этом сайте и другие, в которых упоминаются возможные решения, такие как:

  • OleDb использует? вместо имен значений
  • Убедитесь, что количество параметров соответствует количеству символов? и что они вставлены в правильном порядке.
  • Используйте команду.Parameters.Add (новый OleDbParameter («Имя», OleDbType.VarChar, 50, «Столбец»). Value = someString); Или что-то вдоль этих линий.
  • Использовать команду.Parameters.AddWithValue ("parameterName", someString);

Я могу установить значение строки в «[пробел]», но затем это удаляет местозаполнитель в форме, которая не идеальна, и я не считаю, что это необходимо. Если мне нужно проверить пустую строку и добавить пробел перед добавлением значения в список параметров, тогда я буду, но я надеюсь избежать дополнительного кода, если это возможно.

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

Customer.cs

public class Customer 
    { 
    [Required] 
    public string ContactFirstName { get; set; } 

    [Required] 
    public string ContactLastName { get; set; } 

    public string Email {get; set; } 
    public string Phone {get; set; } 

    public Customer() 
    { 
     this.ContactFirstName = ""; 
     this.ContactLastName = ""; 
     this.Email = ""; 
     this.Phone = ""; 
    } 
    } 

Метод используется для вставки данных

public int InsertValues(Customer customer) 
{ 
this.dbConn.Open(); //System.Data.OleDb.OleDbConnection 

this.query = "INSERT INTO someTable (ContactFirstName, ContactLastName, Email, Phone) VALUES (?,?,?,?)"; 
this.dbComm = new OleDbCommand(this.query, this.dbConn); //System.Data.OleDb.OleDbCommand 

//Add parameters 
this.dbComm.Parameters.AddWithValue("ContactFirstName", customer.ContactFirstName); 
this.dbComm.Parameters.AddWithValue("ContactLastName", customer.ContactLastName); 
this.dbComm.Parameters.AddWithValue("Email", customer.Email); 
this.dbComm.Parameters.AddWithValue("Phone", customer.Phone); 

this.dbComm.ExecuteNonQuery(); 

//--Snip-- 
} 

Драйвер ODBC Я используется Microsoft.OleDb.ACE.12.0. Будет с благодарностью оценена любая помощь или информация, которые могут привести меня в правильном направлении.

ответ

0

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

Как указано в OP и в ответ GÖKHAN Girgin, метод AddWithValue должен выглядеть подобно:

OleDbCommandObject.Parameters.AddWithValue("Whatever you want here", Value); 

Сейчас мой основной акцент делается на добавление значения строки списка параметров, который не содержит никакого значения (т.е.в форме, когда пользователь оставил поле пустым). Строка просто пустая, как в «[no_space]». То, что, по-видимому, происходит, заключается в том, что при представлении формы это значение изменяется с «[no_space]» на null. При попытке ввести тип значение в тип строки не решает проблему. Решение, которое я нашел, включало конкатенирование другой пустой строки в значение.

Любая из приведенных ниже комбинаций я нашел работу, хотя этот список, скорее всего, не является исчерпывающим. Убедитесь, что при добавлении параметров с OleDb он находится в том же порядке, что и оператор INSERT.

OleDbCommandObject.Parameters.AddWithValue("@Phone", "" + customer.Phone); 
OleDbCommandObject.Parameters.AddWithValue("@Phone", customer.Phone + ""); 
OleDbCommandObject.Parameters.AddWithValue("@Phone", "" + customer.Phone + ""); 

Еще раз, для меня это не имеет смысла, что это должно быть сделано, если значение не изменяется в нуль на форме представления, поскольку строка уже установлена ​​на «[no_space]» в конструкторе. Я не вижу, как добавление другого «[no_space]» ничего не меняет, но оно принимается и ошибки не возникает. Будет очень признателен, если кто-нибудь сможет пролить свет на то, почему это работает.

Другим, кто столкнулся с этой проблемой, я надеюсь, что это поможет.

0

изменить это

public int InsertValues(Customer customer) 
{ 
this.dbConn.Open(); //System.Data.OleDb.OleDbConnection 

this.query = "INSERT INTO someTable (ContactFirstName, ContactLastName, Email, Phone) VALUES (@ContactFirstName,@ContactLastName,@Email,@Phone)"; 
this.dbComm = new OleDbCommand(this.query, this.dbConn); //System.Data.OleDb.OleDbCommand 

//Add parameters 
this.dbComm.Parameters.AddWithValue("@ContactFirstName", customer.ContactFirstName); 
this.dbComm.Parameters.AddWithValue("@ContactLastName", customer.ContactLastName); 
this.dbComm.Parameters.AddWithValue("@Email", customer.Email); 
this.dbComm.Parameters.AddWithValue("@Phone", customer.Phone); 

this.dbComm.ExecuteNonQuery(); 

//--Snip-- 
} 
+0

Благодарим вас за ответ Gökhan Girgin. К сожалению, я уже пробовал это, но я пошел вперед и попробовал снова, чтобы дважды проверить и получить ту же ошибку. Параметр @Phone не имеет значения по умолчанию. Я читал, что драйвер JET не заботится об именах параметров, просто порядок и тесты пока показывают, что ACE аналогичен. Я нашел решение, которое я опубликую здесь в ближайшее время. Я не знаю, почему это необходимо, поскольку оно действительно не добавляет или не изменяет значение значения, переданного в метод AddWithValue. – jtgaut17

+0

Я добавил свое решение в качестве одного из ответов. – jtgaut17

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