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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ADO.NET и Access  (Прочитано 11697 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 02-10-2005 03:16 » 

Никак не могу справиться с проблемой и заставить из датасета добавлять записи в базу данных

Вылетает следующая ошибка при вызвове Update у адаптера
Цитата
Unhandled Exception: System.Data.OleDb.OleDbException: Несоответствие типов данн
ых в выражении условия отбора.
at System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArg
s rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
at System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowU
pdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMappi
ng tableMapping)
at System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable,
DataTableMapping tableMapping)
at System.Data.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable)
Используется типизированный датасет, вылетает все из — за 3 строчке кода, где добавляется message, если эту строчку убрать то все нормально

Код:
Data.Users.AddUsersRow(1, "Vasya", "Pupkin");
Data.Categories.AddCategoriesRow(1, "Notes");
Data.Messages.AddMessagesRow(1, knowledge.Data.Categories[0],
                                knowledge.Data.Users[0],
                );

Сама Access база данных строиться из следующего скрипта
Код:
CREATE TABLE Categories
(
    ID INT,
    Name STRING NOT NULL,
   
    PRIMARY KEY (ID)
);

CREATE TABLE Users
(
    ID INT,
    FirstName STRING,
    LastName STRING,

    PRIMARY KEY (ID)
);

CREATE TABLE Messages
(
    ID INT,
    CategoryID INT,
    UserID INT,
   
    PRIMARY KEY (ID),
    FOREIGN KEY (CategoryID) REFERENCES Categories (ID),
    FOREIGN KEY (UserID) REFERENCES Users (ID)
);
 
Записан
Alf
Гость
« Ответ #1 : 02-10-2005 18:53 » 

Уточни тип knowledge.Data.Categories[0] и knowledge.Data.Users[0]. Они оба действительно int, как ожидает таблица Messages?
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #2 : 02-10-2005 21:27 » 

Классы MessageRow и CategoryRow мне сгенерировала VS 2005 Beta 2
поэтому по knowledge.Data.Categories[0] будет возвращен объект CategoryRow
а по knowledge.Data.Users[0] будет возвращен CategoryRow

а в AddMessagesRow уже выбирается из них id'ы
... не знаю в чем ошибка
пробовал также запустить
вот так
Код:
this.m_adapter.InsertCommand.Connection = this.Connection;
this.m_adapter.InsertCommand.CommandText = @"INSERT INTO `Messages` (`ID`, `CategoryID`, `UserID`" +
                ") VALUES (?, ?, ?)";
this.m_adapter.InsertCommand.CommandType = System.Data.CommandType.Text;
this.m_adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("p1", System.Data.OleDb.OleDbType.Integer, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "ID", System.Data.DataRowVersion.Current, false, null));
this.m_adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("p2", System.Data.OleDb.OleDbType.Integer, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "CategoryID", System.Data.DataRowVersion.Current, false, null));
this.m_adapter.InsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("p3", System.Data.OleDb.OleDbType.Integer, 0, System.Data.ParameterDirection.Input, ((byte)(0)), ((byte)(0)), "UserID", System.Data.DataRowVersion.Current, false, null));

Но вылетело
Цитата
Unhandled Exception: System.Data.OleDb.OleDbException: Несоответствие типов данн
ых в выражении условия отбора.
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARA
MS dbParams, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Ob
ject& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behav
ior, String method)
   at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   at Knowledge.KnowledgeDataSetTableAdapters.MessagesTableAdapter.Insert(Nullab
le`1 p1, Nullable`1 p2, Nullable`1 p3, String p4, String p5, String p6, DateTime
 p7)
« Последнее редактирование: 20-12-2007 16:16 от Алексей1153++ » Записан
Alf
Гость
« Ответ #3 : 02-10-2005 21:43 » 

Поставь точку останова в строке, в которой вылетает ошибка, и погляди в отладчике значения knowledge.Data.Categories[0] и knowledge.Data.Users[0] перед выполнением этой строки.
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #4 : 02-10-2005 22:12 » 

самое интересное что все равно тому чему надо Улыбаюсь,
но вылетает иключение

скорее всего ошибка где то в 3000 строчном типизированном датасете
который нагенерировала vs Жаль
Записан
xelos
Гость
« Ответ #5 : 03-10-2005 15:11 » 

я билдером команд обычно пользуюсь для построения команд:
на VB.NET:
Код:
        Dim autogen2 As New OleDbCommandBuilder(DataAdapterTaux)
а при добавлении строки действую через объект DataRow, типа:

Код:
            Dim datr As DataRow
            Try
                datr = myDataTable.NewRow
                datr("Nom") = tbNom.Text
                datr("Prenom") = tbPrenom.Text
                datr("Num_ss") = tbNumSS.Text
                datr("Adr1") = tbAdr1.Text
                datr("Adr2") = tbAdr2.Text
                datr("Ville") = tbVille.Text
                datr("CP") = tbCP.Text
                datr("TPort") = tbTPort.Text
                datr("TDom") = tbTDom.Text
                datr("Fax") = tbFax.Text
                datr("NbEnf") = CByte(tbNbEnf.Text)
                datr("Rend") = cbRend.Checked
                datr("Cadre") = cbCadre.Checked
                datr("Fonction") = tbFonction.Text
                datr("PrimeAnc") = cmbPrimeAnc.Text
                datr("DateEmb") = CDate(tbDateEmb.Text)
                datr("Niveau") = cmbNiveau.Text
                datr("Ech") = CByte(tbEch.Text)
                datr("Coef") = CInt(tbCoef.Text)
                datr("RMH") = CSng(tbRMH.Text)
                datr("CodeAn") = cmbCodeAn.SelectedItem.ToString
                datr("DateNaiss") = CDate("01/01/" & tbAnNaiss.Text)

                'ajouter un enregistrement au tableau en cours
                myDataTable.Rows.Add(datr)

                'modifier la base
                myDataAdapter.Update(myDataSet)
                myDataSet.AcceptChanges()
все это с Access 2000 работает на ура
« Последнее редактирование: 20-12-2007 16:18 от Алексей1153++ » Записан
Alf
Гость
« Ответ #6 : 03-10-2005 20:22 » new

Мне, конечно, не видно, чего там Студия нагенерила на свое усмотрение. Но я бы все же заподозрил, что knowledge.Data.Categories[0] - это первая строка таблицы, и что из нее еще нужно вытащить значение столбца (а возможно, еще и привести тип к требуемому).

Попробуй еще для верности заменить

Код:
Data.Messages.AddMessagesRow(1, knowledge.Data.Categories[0],
                                knowledge.Data.Users[0],
                );

на

Код:
Data.Messages.AddMessagesRow(1, 1, 1);

Если сработает, то 100% дело в неправильном типе knowledge.Data.Categories[0] и knowledge.Data.Users[0].
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines