C#: "Ошибка синтаксиса в инструкции INSERT INTO" #321862


#0 by Дуб
Люди! Опять меня колбасит: решил, как умный, хоть раз по книжке пример выполнить (заполнение *.mdb из C#). Всё нарисовал, нужные имена и поля поменял на свои. И тут откуда ни возьмись, на исполнении "daCalls.Update(dsCalls.GetChanges);" (daCalls - OleDbDataAdapter, а dsCalls - DataSet) вылетает ошибка (см. название темы). Пользуюсь строкой подключения "Provider=Microsoft.Jet.OLEDB.4.0;" + @"data source = c:ats.mdb" (если имеет значение). Помогите, кто знает, плз!
#1 by sapphire
Так и покажи текст INSERTа
#2 by Дуб
Нету! По ходу - само генерится
#3 by Дуб
Вот полный код:            DataSet dsCalls = new DataSet("Calls");            try            {                // определение объекта подключения                OleDbConnection dbConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + @"data source = c:ats.mdb");                // создание адаптера данных для выборки записей из БД                OleDbDataAdapter daCalls =                    new OleDbDataAdapter("SELECT ID,EndCall,PeriodCall,Trunk,Number,Abonent" +                    " FROM tBP250", dbConn);                // определение всех отображаемых столбцов                DataColumnMapping dcmCallID = new DataColumnMapping("ID", "ID");                DataColumnMapping dcmCallEndCall = new DataColumnMapping("EndCall", "EndCall");                DataColumnMapping dcmCallPeriodCall = new DataColumnMapping("PeriodCall", "PeriodCall");                DataColumnMapping dcmCallTrunk = new DataColumnMapping("Trunk", "Trunk");                DataColumnMapping dcmCallNumber = new DataColumnMapping("Number", "Number");                DataColumnMapping dcmCallAbonent = new DataColumnMapping("Abonent", "Abonent");                // определение таблицы, содержащей отображаемые столбцы                DataTableMapping dtmCalls = new DataTableMapping("Table", "User");                dtmCalls.ColumnMappings.Add(dcmCallID);                dtmCalls.ColumnMappings.Add(dcmCallEndCall);                dtmCalls.ColumnMappings.Add(dcmCallPeriodCall);                dtmCalls.ColumnMappings.Add(dcmCallTrunk);                dtmCalls.ColumnMappings.Add(dcmCallNumber);                dtmCalls.ColumnMappings.Add(dcmCallAbonent);                // активация механизма отображения                daCalls.TableMappings.Add(dtmCalls);                // заполнение набора данных                daCalls.Fill(dsCalls);                // объявление компонента построения команд для создания                // SQL-инструкций создания и обновления записей                OleDbCommandBuilder cb = new OleDbCommandBuilder(daCalls);                // вставка новой записи в DataSet                DataRow r = dsCalls.Tables["User"].NewRow;                r["ID"] = 2;                r["EndCall"] = 555;                r["PeriodCall"] = 123;                r["Trunk"] = "654";                r["Number"] = "+8995563";                r["Abonent"] = "226";                dsCalls.Tables["User"].Rows.Add(r);                // вставка записи в БД                daCalls.Update(dsCalls.GetChanges);                // выравнивание данных в памяти по данным                // из источника данных                dsCalls.AcceptChanges;                Console.WriteLine("В БД добавлена новая запись");            }            catch (Exception ex)            {                // отмена изменений в DataSet                dsCalls.RejectChanges;                Console.WriteLine(ex.Message);            }
#4 by mikecool
у датаакцеса или датасета должено быть свойство типа запрос на инсерт, упдэйт и делит...
#5 by Дуб
А на каком этапе его пихнуть?
#6 by sapphire
Попробуй закомментарить эту строку понеже dsCalls.AcceptChanges должно сделать commit транзакции.
#7 by mikecool
думаю - должно быть в виде свойств...
#8 by Дуб
Так он до dsCalls.AcceptChanges не доходит
#9 by Дуб
Кстати, dsCalls.Tables["User"].Rows.Add(r) выполняется нормально: в отладчике видна новая строка в довесок к предыдущим..
#10 by Дуб
Разобрался. Хотя, один хрен - не ясно, почему так получилось.. Если посмотреть                OleDbCommandBuilder MyBuilder = new OleDbCommandBuilder(daCalls);                daCalls.InsertCommand = MyBuilder.GetInsertCommand;                Console.WriteLine(@"" + daCalls.UpdateCommand.CommandText);                Console.ReadLine; , то он ничего не покажет. Пришлось в явном виде указать:                OleDbCommand InsertCommand = new OleDbCommand;                InsertCommand.CommandText = @"INSERT INTO [tBP250] ([ID],[EndCall],[PeriodCall],[Trunk],[Number],[Abonent]) VALUES ..";                daCalls.InsertCommand = InsertCommand; , а уж потом                daCalls.Update(dsCalls.GetChanges); Это, кстати, то, что mikecool советовал в . Спасибо! Так, вроде работает, только с подстановкой параметров @p.. разобраться надо.. А так, вроде, ничего. Спасибо всем, кто помогал.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С