Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 09:27   #1
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
Вопрос параметризированный запрос access 2007

всем алоха!

ребят, нарисовалась неприятная проблема. срочно понадобилось сделать базу на аксэсе и клиента на шарпе. накидал базу, через шарп подключился к ней:
Код:
OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=base.accdb;Persist Security Info=False;");
con.Open();
далее для теста сделал запрос на выборку. всё работает. сделал форму добавления данных в БД. написал простейший код:

Код:
OleDbCommand cmd = new OleDbCommand("INSERT INTO users(u_id, u_name) VALUES(@u_id, @u_name);", con);
cmd.Parameters.AddWithValue("@u_id", 1);
cmd.Parameters.AddWithValue("@u_name", "name");
далее выполнил запрос
Код:
cmd.ExecuteNonQuery();
в ответ на что получил ошибку:
Цитата:
Несоответствие типов данных в выражении условия отбора.
начал разбираться. оказалось что OleDbCommand не знает какого типа значение 1. ок. проверил без параметров, т.е.:
Код:
OleDbCommand cmd = new OleDbCommand("INSERT INTO users(u_id, u_name) VALUES(1, 'name');", con);
cmd.ExecuteNonQuery();
всё сработало и добавилось в базу.

начал экспеременетировать и явно задавать тип параметра:
Код:
cmd.Parameters.AddWithValue("@u_id", OleDbType.Integer).Value = 1;
Код:
cmd.Parameters.AddWithValue("@u_id", SqlDbType.Int).Value = 1;
всё безуспешно. та же ситуация и с датами.

буду благодарен за любую помощь
Life if about choices
Make the right choice

Последний раз редактировалось TaTT DoGG; 01.11.2012 в 10:59.
TaTT DoGG вне форума Ответить с цитированием
Старый 01.11.2012, 09:59   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Если хочется указать тип, то нужно использовать Add, а не AddWithValue (второй параметр не тип параметра, а значение). Типы, соответственно, должны быть OleDbType. u_id не инкремент (счетчик) случайно? Счетчики так же идут как длинное целое (BigInt, а не Integer). Даты в акцесе помоему нет (только дата + время) и, возможно, есть необходимость в использовании DBTimeStamp.
pu4koff вне форума Ответить с цитированием
Старый 01.11.2012, 10:44   #3
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

u_id не счетчик

Код:
cmd.Parameters.Add("@u_id", OleDbType.Integer).Value = 1;
не пашет
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 01.11.2012, 10:58   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
всё сработало и добавилось в базу.
даже странно
eval вне форума Ответить с цитированием
Старый 01.11.2012, 11:00   #5
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
даже странно
пардон, писал всё от руки без копипаста. уже 3ий день бодаюсь, всё уже путается
исправил
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 01.11.2012, 11:08   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Структура таблицы какая?
eval вне форума Ответить с цитированием
Старый 01.11.2012, 11:09   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Попробовал создать базу с одной табличкой и сделать запрос на вставку.
u_id - числовое (длинное целое, как по умолчанию выставляется)
u_name - текстовое (строка длиной 255 как по умолчанию)
u_date - Дата/Время
запрос выглядит так:
Код:
                com.CommandText = "INSERT INTO Table1 (u_id, u_name, u_date) VALUES(@u_id, @u_name, @u_date)";
                com.Parameters.Add("@u_id", OleDbType.BigInt).Value = 1;
                com.Parameters.Add("@u_name", OleDbType.VarChar, 255).Value = "Name";
                com.Parameters.Add("@u_date", OleDbType.Date).Value = DateTime.Now;
                com.ExecuteNonQuery();
Всё добавляется и функционирует. С Integer и OleDbType.DBTimeStamp таки не работало.
pu4koff вне форума Ответить с цитированием
Старый 01.11.2012, 11:17   #8
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

странно, сейчас попробую базу пересоздать
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 01.11.2012, 11:21   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
попробую базу пересоздать
и переформатировать диски не помешает.
eval вне форума Ответить с цитированием
Старый 01.11.2012, 12:40   #10
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

пересоздал базу, всё заработало. странно. поля те же, типы те же... хз чо за глюк. теперь и мой способ работает.
спасибо
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из Access 2010 в Access 2007 Radzhab Microsoft Office Access 3 10.05.2011 22:13
Запрос с датами и временем к Access [D7, Access] alexandr2010 БД в Delphi 3 26.07.2010 22:19
ACCESS 2007 Mango Помощь студентам 4 13.12.2009 09:04
Access 2007 Михаил Юрьевич БД в Delphi 1 31.07.2009 16:15
динамический запрос access 2007 Тупой Microsoft Office Access 3 26.06.2009 17:52