Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: проблема с командой insert для бд  (Прочитано 12147 раз)
0 Пользователей и 1 Гость смотрят эту тему.
xelos
Гость
« : 23-08-2004 08:21 » 

доброго всем.
есть программа, работающая с MS Access. с бд выполняются 4 простейших операции: Delete, Update, Select, Insert.
проблема в том, что все операции работают как надо, за исключением INSERT.

бд заполняю так:
Код:
string connectionString="provider=Microsoft.JET.OLEDB.4.0; data source = c:\\Program files\\my\\codebar\\codebar.mdb";
string commandString = "Select * from Maint";

myConnection = new System.Data.OleDb.OleDbConnection(connectionString);

myConnection.Open();
DataSetDS = new DataSet();
myAdapterDS = new System.Data.OleDb.OleDbDataAdapter();

System.Data.OleDb.OleDbCommand command=new System.Data.OleDb.OleDbCommand();

command.CommandText=commandString;
command.Connection=myConnection;

myAdapterDS.SelectCommand=command;

myAdapterDS.TableMappings.Add("Table","Maint");

myAdapterDS.Fill(DataSetDS,"Maint");

System.Data.OleDb.OleDbCommandBuilder com = new System.Data.OleDb.OleDbCommandBuilder(myAdapterDS);

dataTableDS = new DataTable();
dataTableDS = DataSetDS.Tables["Maint"];

при добавлении новой записи:
Код:
DataRow dr=dataTableDS.NewRow();
try
{
dr["ref"]=index;
if (tb_Date.Text.Length>0)
{
dr["date"]=Convert.ToDateTime(tb_Date.Text);
}
dr["technicien"]=tb_Technicien.Text;

dr["operation"]=tb_Operation.Text;

dataTableDS.Rows.Add(dr);

myAdapterDS.Update(dataTableDS);
DataSetDS.AcceptChanges();
MessageBox.Show("Donnees sont ajoutees");
dataRow=dr;
PopulateLB();

         }
catch (System.Data.OleDb.OleDbException ex)
{
DataSetDS.RejectChanges();
MessageBox.Show(ex.Message);
}
на команде myAdapterDS.Update() вылетает ошибка неправильно задана команда INSERT INTO.

самое интересное, что в dataTableDS строка заносится без проблем. Правда ключевое поле (в коде его не видно) равно null.

Может кто подскажет что дельное?
« Последнее редактирование: 30-11-2007 22:58 от Алексей1153++ » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-08-2004 09:40 » 

вот в ключевом поле и заключается баг. Ключевое поле: 1) должно самостоятельно заполняться при вставке (у тебя, судя по всему, Access - тогда autoincrement тип поля установи (если связка целыми числами)), 2) при вставке из ADO .NET ты его не можешь заполнить вручную.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
xelos
Гость
« Ответ #2 : 23-08-2004 12:02 » 

в Access autoincrement стоит на ключевое поле... из VB.NET аналогичная программа работает без проблем (в смысле, там тоже заполнение ключевого поля производится самой Access)...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 23-08-2004 12:58 » 

ты в Insert ключевое поле передаёшь? Точнее, делает ли это билдер - проверь. Я, вообще говоря, этим билдером не пользуюсь, так что наверняка не знаю - смотреть надо.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
xelos
Гость
« Ответ #4 : 23-08-2004 14:28 » 

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

у меня есть подозрение... в приложении две формы. в первой, я открываю таблицу и создаю все объекты (глобальные для формы) для отображения информации...
потом открываю вторую форму и создаю такие же объекты, глобальные для второй формы...

может из-за этого не хочет писать???
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 23-08-2004 16:24 » 

может блокировка таблицы движком Jet, когда вторая форма пытается открыть её же. Ты 2 коннекта к базе делаешь, или общим пользуешься?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
xelos
Гость
« Ответ #6 : 23-08-2004 17:14 » 

раньше было 2 коннекта, теперь один общий.  все равно не работает. странно, что DELETE или UPDATE работают. лана, разберусь как-нить.
Записан
xelos
Гость
« Ответ #7 : 24-08-2004 07:55 » 

разобрался... в общем из серии думайте перед тем как делать... ошибка была в строке:

dr["date"]=Convert.ToDateTime(tb_Date.Text);

угадайте где?

в названии столбца!!! вернее столбец так и называется "date", проблема решается сменой имени столбца на "dateoper", например   Вот такой я вот
Записан
EUGIX
Гость
« Ответ #8 : 07-09-2004 08:37 » 

Цитата: xelos
разобрался... в общем из серии думайте перед тем как делать... ошибка была в строке:

dr["date"]=Convert.ToDateTime(tb_Date.Text);

угадайте где?

в названии столбца!!! вернее столбец так и называется "date", проблема решается сменой имени столбца на "dateoper", например   Вот такой я вот

Распрастраненная ошибка в принципе просто date это зарезервированное слово во многих СУБД. Хотя насколько я помню этого можно было избежать при помощи 'date' (апострофов).
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 07-09-2004 10:16 » 

Для SQL Server квадратные скобки dr["[date]"] или двойные кавычки dr["\"date\""]. Апострофы - это строка. Впрочем, применительно к массиву в DataRow не знаю.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines