Что не так с этими параметрами?

У меня есть файл Access с 7 полями:

DocID - text - primary
SourceID - text
ReceivedDay - Date/Time
Summary - text
DueDay - Date/Time
Person - text
Status - Yes/No

Теперь я хочу обновить этот файл следующим кодом:

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\DocMan.mdb;Persist Security Info=True";
const string InsertQuery = "INSERT Into Docs(DocID,ReceivedDay,Summary,Person,DueDay,Status,SourceID) Values(@DocID,@ReceivedDay,@Summary,@Person,@DueDay,@Status,@SourceID)";

string DocID = textBox1.Text;
string SourceID = comboBox1.SelectedIndex.ToString();
DateTime ReceivedDay = dateTimePicker1.Value;
string Summary = richTextBox1.Text;
string Person = textBox2.Text;
DateTime DueDay = dateTimePicker2.Value;
bool Status = false;

OleDbConnection cnn = new OleDbConnection(ConnectionString);
cnn.Open();
OleDbCommand cmd = new OleDbCommand(InsertQuery, cnn);
cmd.Parameters.AddWithValue("@DocID", DocID);
cmd.Parameters.AddWithValue("@SourceID", SourceID);
cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay);
cmd.Parameters.AddWithValue("@Summary", Summary);
cmd.Parameters.AddWithValue("@Person", Person);
cmd.Parameters.AddWithValue("@DueDay", DueDay);
cmd.Parameters.AddWithValue("@Status", Status);
cmd.ExecuteNonQuery();
cnn.Close();

Но я получаю исключение:

Data type mismatch in criteria expression.

Как я могу это исправить?

РЕДАКТИРОВАТЬ: я исправил это, используя другой подход:

Я построил такой запрос:

INSERT INTO Docs
   (DocID, SourceID, ReceivedDay, Summary, Person, DueDay, Status)
VALUES (?, ?, ?, ?, ?, ?, ?)

а затем использовал TableAdapter для его вызова:

string DocID = textBox1.Text;

string SourceID = comboBox1.SelectedIndex.ToString();
DateTime ReceivedDay = dateTimePicker1.Value.Date;
string Summary = richTextBox1.Text;
string Person = textBox2.Text;
DateTime DueDay = dateTimePicker2.Value.Date;
bool Status = false;

DocManDataSetTableAdapters.DocsTableAdapter  docsTableAdapter = new DocManDataSetTableAdapters.DocsTableAdapter();
docsTableAdapter.InsertQuery(DocID,SourceID,ReceivedDay,Summary,Person,DueDay,false);

Гораздо проще, и теперь все работает нормально. Спасибо вам всем


person Quan Mai    schedule 01.08.2009    source источник
comment
Не могли бы вы показать текст InsertQuery?   -  person Henk Holterman    schedule 01.08.2009
comment
Есть ли ограничения на любой из столбцов?   -  person Henk Holterman    schedule 01.08.2009
comment
SourceID имеет внешнее ограничение, но даже когда я его удаляю, ошибка все равно появляется   -  person Quan Mai    schedule 01.08.2009
comment
Похоже, пришло время поэкспериментировать: 1) запустить вставку в интерактивном режиме с аналогичными данными. 2) удалить из вставки все столбцы, допускающие значение NULL.   -  person Henk Holterman    schedule 01.08.2009


Ответы (3)


Просто спросите Google, думаю, более 10000 хиты впечатляют. Ваш аргумент Я не думаю, что... недействителен, пока вы его не доказали.

Вот что сообщает MSDN:

Поставщик OLE DB.NET не поддерживает именованные параметры для передачи параметров в инструкцию SQL или хранимую процедуру, вызываемую OleDbCommand, когда для параметра CommandType задано значение Text. В этом случае необходимо использовать знак вопроса (?). Например:

SELECT * FROM Customers WHERE
CustomerID = ?

Следовательно, порядок, в котором OleDbParameter объектов добавляются к OleDbParameterCollection, должен напрямую соответствовать положению заполнителя вопросительного знака для параметра в тексте команды.

person devio    schedule 02.08.2009

Проблема в том, что параметры находятся в другом порядке при их добавлении.

Например, в вашей закомментированной строке (//adapter.InsertQuery...) у вас есть DocID, а затем RecievedDay... но когда вы их добавляете, вы сначала добавляете DocID, а затем добавляете SourceID.

Убедитесь, что они находятся в том же порядке... и это относится как к операторам sql, так и к хранимым процедурам.

Это связано с тем, что ADO.NET не поддерживает именованные параметры при использовании поставщика OLEDB, и, поскольку вы подключаетесь к базе данных Access, вы фактически используете поставщика OLEDB... поэтому порядок параметров имеет значение.


Если они в порядке, а он все еще не работает, то я думаю, что это может быть проблема с DateTimes;
Попробуйте преобразовать его в строку перед добавлением в качестве параметра:

cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay.ToShortDateString());
cmd.Parameters.AddWithValue("@DueDay", DueDay.ToShortDateString());

А также убедитесь, что формат даты соответствует формату США (m/d/yyyy) или формату ISO (yyyy-mm-dd).

person Andreas Grech    schedule 01.08.2009
comment
@Dreas: DocID и SourceID являются строками, я не думаю, что их синтаксический анализ в целое число необходим! - person Quan Mai; 02.08.2009

OleDb не поддерживает именованные параметры, поэтому ответ Дреаса правильный.

Когда вы используете OleDb, вы должны добавлять параметры в том же порядке, в котором они появляются в запросе, поскольку имена, которые вы им даете, не используются.

person Frederik Gheysels    schedule 02.08.2009
comment
@Coops Я знаю, что это древнее, но это ограничение, если CommandType имеет значение Text. Поддерживается для других перечислений CommandType. - person Mad Myche; 22.06.2018