Concurrency violation: the DeleteCommand affected 0 records

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Concurrency violation: the DeleteCommand affected 0 records

Сообщение Loiste » 15.11.2005 (Вт) 16:11

Как избавиться от этой ошибки? Честно говоря, она уже достала. Возникает при обновлении базы через адаптер после удаления строк.

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 15.11.2005 (Вт) 16:21

Вот что я нашла на одной англоязычном сайте:

Ok, problem resolved. Thank you Miha, for your support.

I figured it out by hooking up the datatable to a datagrid and carefully
looking at the boolean fields checkboxes, and then manually altering the
deleteCommand to verify. Here's what was going on:

When the new record was created in the dataset, there was a field which was
*not getting initialized* (big rule to never forget) by the detail form,
because it was not attatched to a GUI control, and was overlooked. You
wouldn't think this would be a big deal, BUT... This field was a boolean.

Boolean fields can either be True, False, Null or Indeterminate.

The deleteCommand generated by the wizard was looking for a record in the
database table whose field value was either True, False, or NULL. However,
the wizard created dataset did not have a default value for this field, so
it set it to "Indeterminate." Therefore, when the deleteCommand could not
find a matching record the dataAdapter threw the error "Concurrency
violation: the DeleteCommand affected 0 records"

////////////////////////////////////////////////////////////////////////
// Two ways to address the problem //
////////////////////////////////////////////////////////////////////////

Either open the "xsd" file and give the appropriate "xs: element" with a
default value of 0 or 1,
like this:
<xs:element name="IsLoggedIn" type="xs:boolean" minOccurs="0"
default="0" />

OR

Grab a reference to the newly added row, and use it's "item" property to
force the datarow's field value to "True" or "False"
like this:
cm.AddNew()
Dim drNew as DataRow = CType(cm.current, DataRowView).Row
drNew.Item("IsLoggedIn")=True

k

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 15.11.2005 (Вт) 16:36

У меня команды добавления и удаления были сформированы мастером. Может, в них что-то не так?

Код: Выделить всё
'OleDbInsertCommand1
        '
        Me.OleDbInsertCommand1.CommandText = "INSERT INTO Доступ(Группа, Логин, Пароль) VALUES (?, ?, ?)"
        Me.OleDbInsertCommand1.Connection = Me.OleDbConnection1
        Me.OleDbInsertCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Группа", System.Data.OleDb.OleDbType.VarWChar, 50, "Группа"))
        Me.OleDbInsertCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Логин", System.Data.OleDb.OleDbType.VarWChar, 50, "Логин"))
        Me.OleDbInsertCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Пароль", System.Data.OleDb.OleDbType.VarWChar, 50, "Пароль"))
        '



Код: Выделить всё
'OleDbDeleteCommand1
        '
        Me.OleDbDeleteCommand1.CommandText = "DELETE FROM Доступ WHERE (Код = ?) AND (Группа = ? OR ? IS NULL AND Группа IS NUL" & _
        "L) AND (Логин = ? OR ? IS NULL AND Логин IS NULL) AND (Пароль = ? OR ? IS NULL A" & _
        "ND Пароль IS NULL)"
        Me.OleDbDeleteCommand1.Connection = Me.OleDbConnection1
        Me.OleDbDeleteCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Код", System.Data.OleDb.OleDbType.Integer, 0, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Код", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbDeleteCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Группа", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Группа", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbDeleteCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Группа1", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Группа", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbDeleteCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Логин", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Логин", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbDeleteCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Логин1", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Логин", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbDeleteCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Пароль", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Пароль", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbDeleteCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Пароль1", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Пароль", System.Data.DataRowVersion.Original, Nothing))
        '


и обновление соответственно:

Код: Выделить всё
'OleDbUpdateCommand1
        '
        Me.OleDbUpdateCommand1.CommandText = "UPDATE Доступ SET Группа = ?, Логин = ?, Пароль = ? WHERE (Код = ?) AND (Группа =" & _
        " ? OR ? IS NULL AND Группа IS NULL) AND (Логин = ? OR ? IS NULL AND Логин IS NUL" & _
        "L) AND (Пароль = ? OR ? IS NULL AND Пароль IS NULL)"
        Me.OleDbUpdateCommand1.Connection = Me.OleDbConnection1
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Группа", System.Data.OleDb.OleDbType.VarWChar, 50, "Группа"))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Логин", System.Data.OleDb.OleDbType.VarWChar, 50, "Логин"))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Пароль", System.Data.OleDb.OleDbType.VarWChar, 50, "Пароль"))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Код", System.Data.OleDb.OleDbType.Integer, 0, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Код", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Группа", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Группа", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Группа1", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Группа", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Логин", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Логин", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Логин1", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Логин", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Пароль", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Пароль", System.Data.DataRowVersion.Original, Nothing))
        Me.OleDbUpdateCommand1.Parameters.Add(New System.Data.OleDb.OleDbParameter("Original_Пароль1", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, False, CType(0, Byte), CType(0, Byte), "Пароль", System.Data.DataRowVersion.Original, Nothing))
        '



Прошу прощения за такое количество кода :)

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 15.11.2005 (Вт) 17:14

ещё один патриот, руские названи в базе? нуну....

А вообще, ничё не понятно что у тебя есть и что ты хочешь...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

kroskros
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 01.08.2005 (Пн) 6:59

Сообщение kroskros » 16.11.2005 (Ср) 7:02

ммм..
бери русские имена в БД в [квадратные скобки]?
А вообще с русскими именами - ты сам себе злейший Буратина... ;)
Max

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 16.11.2005 (Ср) 8:40

Ну, названия я потом заменю. Сейчас ведь дело не в них, верно? :)

Ну я же написала, что приведенные выше куски кода, это то, что сгенерил мастер. Команды добавления, удаления записей в базу через адаптер.

А нужно мне. Чтобы ошибка эта дурацкая (в теме поста) при удалении строк из dataset не возникала.

Я же делаю все по msdn - добавление записей, удаление записей, обновление базы через адаптер.
Неужели у вас при работе с базой такая ошибка никогда не вылезала?!!

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 16.11.2005 (Ср) 9:51

если OleDB или ODBC может и вних...


Нды, где ошибка то? В каждой строке? В каждой второй строке? Ну, мать, ты объясни по человечески, а то такими вопросами с копипастами только место на сервере забиваешь...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 16.11.2005 (Ср) 14:11

Оки, выкладываю все как есть :)

Вот так строки добавляются (всем знакомый код msdn):

Код: Выделить всё
Dim cRow As DataRow = frm3.DataSet11.Доступ.NewRow()
cRow.BeginEdit()
cRow("Логин") = TextLogin.Text
cRow("Группа") = "Без группы"
cRow.EndEdit()
frm3.DataSet11.Доступ.Rows.Add(cRow)


Вот так удаляются:

Код: Выделить всё
Dim myRow As DataRow
        For Each myRow In frm3.DataSet11.Доступ.Rows
            If Not myRow.RowState = DataRowState.Deleted Then
                If myRow("Логин") = frm6.DataGrid1.Item(frm6.DataGrid1.CurrentRowIndex, 2) Then
                    myRow.Delete()
                    Exit For
                End If
            End If
        Next


А вот так обновляется база:

Код: Выделить всё
If Not frm3.DataSet11.HasChanges() Then
       Exit Sub
End If
frm3.OleDbDataAdapter1.Update(frm3.DataSet11)


Ошибка вылетает как раз на

Код: Выделить всё
frm3.OleDbDataAdapter1.Update(frm3.DataSet11)


Та самая ошибка, что в заголовке темы. Только если я до этого удаляла какие-либо записи. Причем, если я удаляю записи, которые уже давно находились в базе. Все в порядке. Но если я во время сеанса работы добавляю новые записи, а потом удаляю что-то, в какой-то момент работы вылетает эта ошибка.

Фух, ну а сейчас хоть немножко понятней объяснила? Простите, если плохо объясняю :)

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 16.11.2005 (Ср) 15:21

Public NotInheritable Class OleDbCommandBuilder
Inherits System.Data.Common.DbCommandBuilder
Member of System.Data.OleDb

Summary:
Automatically generates single-table commands that are used to reconcile changes made to a System.Data.DataSet with the associated database. This class cannot be inherited.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 17.11.2005 (Чт) 16:23

Исправила так:

Код: Выделить всё
Dim cRow As DataRow = frm3.DataSet11.Доступ.NewRow()
cRow.BeginEdit()
cRow("Логин") = TextLogin.Text
cRow("Группа") = "Без группы"
cRow("Пароль") = " "
cRow.EndEdit()
frm3.DataSet11.Доступ.Rows.Add(cRow)
Dim sqlSB As OleDb.OleDbCommandBuilder
sqlSB = New OleDb.OleDbCommandBuilder(frm3.OleDbDataAdapter1)
frm3.OleDbDataAdapter1.InsertCommand = sqlSB.GetInsertCommand
frm3.OleDbDataAdapter1.Update(frm3.DataSet11, frm3.DataSet11.Tables("Доступ").TableName)
frm3.DataSet11.AcceptChanges()


и так:

Код: Выделить всё
myRow.Delete()
Dim sqlSB As OleDb.OleDbCommandBuilder
sqlSB = New OleDb.OleDbCommandBuilder(frm3.OleDbDataAdapter1)
frm3.OleDbDataAdapter1.DeleteCommand = sqlSB.GetDeleteCommand
frm3.OleDbDataAdapter1.Update(frm3.DataSet11, frm3.DataSet11.Tables("Доступ").TableName)
frm3.DataSet11.AcceptChanges()


Но выскакивает та же самая ошибка на том же самом месте!
Ребят, ну подскажите, как сделать все правильно..пожалуйста :)

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 17.11.2005 (Чт) 17:53

вот так достаточно
sqlSB = New OleDb.OleDbCommandBuilder(frm3.OleDbDataAdapter1)
присваивать команды не нужно, но боюсь, это от русского языка(((
какая база? если Акссес, то переделывай базу))))
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 17.11.2005 (Чт) 18:01

Есть предположение.

Наверняка в таблице есть первичный ключ (допустим, это поле с громким именем ID), у которого тип Autonumber.

Тогда при добавлении запись успешно добавляется, но в таблице датасета нет значения для поля ID, потому что Access его сам сгенерил, а мы его не подобрали. Поэтому при удалении строки нет значения для этого поля, не понятно ему, какую строку удалять, вот и ругается.

Как рассказать добавленной записи в датасете, какой она получила ID:
1) Добавить обработчик RowUpdated для DataAdapter (da):
Код: Выделить всё
        AddHandler da.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)

2) Написать код обработчика:
Код: Выделить всё
    Private Sub OnRowUpdated(ByVal sender As Object, ByVal args As OleDbRowUpdatedEventArgs)
        Dim newID As Integer = 0
        Dim idCMD As OleDbCommand = New OleDbCommand("SELECT @@IDENTITY", conn)
        If args.StatementType = StatementType.Insert Then
            newID = CInt(idCMD.ExecuteScalar())
            args.Row("id") = newID
        End If

    End Sub
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 18.11.2005 (Пт) 10:29

Такс, проверяю ваши предположения :)

1. Сменила все названия на английские
2. Чуть подправила OleDBCommandBuilder как советовал Sebas

Вот что получилось:

Добавление строки:

Код: Выделить всё
Dim cRow As DataRow = frm3.DataSet11.Access.NewRow()
cRow.BeginEdit()
cRow("Login") = TextLogin.Text
cRow("Group") = "Без группы"
cRow("Pass") = " "
cRow.EndEdit()
frm3.DataSet11.Access.Rows.Add(cRow)
Dim sqlSB As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(frm3.OleDbDataAdapter1)
frm3.OleDbDataAdapter1.Update(frm3.DataSet11, frm3.DataSet11.Tables("Access").TableName)
frm3.DataSet11.AcceptChanges()


Удаление:

Код: Выделить всё
myRow.Delete()
Dim sqlSB As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(frm3.OleDbDataAdapter1)
frm3.OleDbDataAdapter1.Update(frm3.DataSet11, frm3.DataSet11.Tables("Access").TableName)
frm3.DataSet11.AcceptChanges()


Результат...выдает ту же самую ошибку на той же строчке :(

Да, база на Access 2000.
Сейчас приведу структуру таблицы Access (бывшая Доступ)

ID тип Счетчик
Login тип Текстовый
Pass тип Текстовый
Group тип Текстовый

И еще я заметила, что при добавлении новой строки в базу в Access-е первичный ключ имеет одно значение, а в самом DataSet11 другое.

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 18.11.2005 (Пт) 10:50

У меня почему-то на OleDbCommand ругается. Пишет, что не определен. Может, надо референс подключить какой-то?

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 18.11.2005 (Пт) 11:26

1. OleDBCommand находится в System.Data.OleDB (вроде там же, где и все остальные)

2.
Такс, проверяю ваши предположения
....
Результат...выдает ту же самую ошибку на той же строчке

Не вижу AddHandler... В этом же вся соль была.

3.
И еще я заметила, что при добавлении новой строки в базу в Access-е первичный ключ имеет одно значение, а в самом DataSet11 другое.

Какое оно в DataSet11? У меня оно оставалось Null, пока я не прикрутила обработчик OnRowUpdate
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 18.11.2005 (Пт) 11:37

Не вижу AddHandler... В этом же вся соль была.


У меня адаптер сгенерен мастером. Где нужно прописать эту строку. Хотя, для других событий я никогда не добавляла ничего. Они всегда работали без AddHandler.

Какое оно в DataSet11? У меня оно оставалось Null, пока я не прикрутила обработчик OnRowUpdate


В датасет ему присваевается значение. Оно уникально для датасета, но оно отличается от значения в базе. Например, в базе строке присваевается значение 24, а в датасете 1 (если это первая добавленная строка после загрузки приложения)...

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 18.11.2005 (Пт) 11:42

Не вижу AddHandler... В этом же вся соль была.


У меня адаптер сгенерен мастером. Где нужно прописать эту строку. Хотя, для других событий я никогда не добавляла ничего. Они всегда работали без AddHandler.

Какое оно в DataSet11? У меня оно оставалось Null, пока я не прикрутила обработчик OnRowUpdate


В датасет ему присваевается значение. Оно уникально для датасета, но оно отличается от значения в базе. Например, в базе строке присваевается значение 24, а в датасете 1 (если это первая добавленная строка после загрузки приложения)...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 18.11.2005 (Пт) 12:29

У меня адаптер сгенерен мастером. Где нужно прописать эту строку.

Ммм... В принципе, более или менее все равно где. Был бы объект создан. Единственное что - не стоит это делать на повторяющихся обработчиках типа Button_Click. На Form_Load он у тебя уже есть? Добавь туда...

Хотя, для других событий я никогда не добавляла ничего. Они всегда работали без AddHandler.

Они всегда работают с AddHandler. Просто писала его не сама, а визард. Вот поиши по проекту AddHandler - узнаешь много нового...

Например, в базе строке присваевается значение 24, а в датасете 1 (если это первая добавленная строка после загрузки приложения)...

Ммм... Интересно. Видимо, в датасете он тоже как счетчик и датасет ему сам дает значение при добавлении...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 18.11.2005 (Пт) 13:55

А вот что в датасете:

Group String
ID Int (ключ..также как ID - ключ в базе)
Login String
Pass String

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 18.11.2005 (Пт) 14:05

System.Data.OleDB должно быть в референсах? У меня его там нет. Когда открываю окно для добавления - там тоже нет. У меня только System.Data есть.

Хэндлер добавила (в form_load). Но и в хэндлере и в процедуре отладчик пишет, что OleDbCommand и OleDbRowUpdatedEventHandler не определены :shock:

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 18.11.2005 (Пт) 14:37

Loiste писал(а):System.Data.OleDB должно быть в референсах? У меня его там нет. Когда открываю окно для добавления - там тоже нет. У меня только System.Data есть.


неймспейс system.data.oledb находится в System.Data.dll, где и все остальные, поэтому тут все в порядке.

Во-первых: приведи описание ошибки
Во-вторых: а в таблице есть ключ вообще или нету (у меня один раз такое было - долго парился)

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 18.11.2005 (Пт) 14:49

System.Data.OleDB должно быть в референсах? У меня его там нет. Когда открываю окно для добавления - там тоже нет. У меня только System.Data есть

Насколько я вижу по твоему коду ("OleDb.OleDbCommandBuilder"), у тебя в файле включен namespace System.Data ()наверху написано Imports System.Data).

Можно обойтись либо как с OleDbCommandBuilder - то есть писать OleDB.OleDBCommand, либо написать вверху "Imports System.Data.OleDB" и писать прямо "OleDbCommandBuilder", "OleDbCommand" и другие "OleDb..."
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 18.11.2005 (Пт) 14:56

Такс...Хендлер из загрузки формы я убрала вообще..в нем в скобках выражение отладчику ни в каком варианте не нравилось..

Процедуру переписала так:

Код: Выделить всё
Private Sub OleDBDataAdapter1_OnRowUpdated(ByVal sender As Object, ByVal args As System.Data.OleDb.OleDbRowUpdatedEventArgs) Handles OleDbDataAdapter1.RowUpdated
        Dim newID As Integer = 0
        Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTITY", OleDbConnection1)
        If args.StatementType = StatementType.Insert Then
            newID = CInt(idCMD.ExecuteScalar())
            args.Row("ID") = newID
        End If

End Sub



Пару раз пробежалась отладчиком...вроде ошибки нет...сейчас уже убегаю...еще несколько раз прогоню в понедельник..Но если все работает...ребята, я вас расцелую :D

Спасибо!

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 18.11.2005 (Пт) 14:56

Loiste писал(а):System.Data.OleDB должно быть в референсах? У меня его там нет. Когда открываю окно для добавления - там тоже нет. У меня только System.Data есть.


неймспейс system.data.oledb находится в System.Data.dll, где и все остальные, поэтому тут все в порядке.

Во-первых: приведи описание ошибки
Во-вторых: а в таблице есть ключ вообще или нету (у меня один раз такое было - долго парился)

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 18.11.2005 (Пт) 14:57

Такс...Хендлер из загрузки формы я убрала вообще..в нем в скобках выражение отладчику ни в каком варианте не нравилось..

Процедуру переписала так:

Код: Выделить всё
Private Sub OleDBDataAdapter1_OnRowUpdated(ByVal sender As Object, ByVal args As System.Data.OleDb.OleDbRowUpdatedEventArgs) Handles OleDbDataAdapter1.RowUpdated
        Dim newID As Integer = 0
        Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTITY", OleDbConnection1)
        If args.StatementType = StatementType.Insert Then
            newID = CInt(idCMD.ExecuteScalar())
            args.Row("ID") = newID
        End If

End Sub



Пару раз пробежалась отладчиком...вроде ошибки нет...сейчас уже убегаю...еще несколько раз прогоню в понедельник..Но если все работает...ребята, я вас расцелую :D

Спасибо!

Loiste
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 136
Зарегистрирован: 28.09.2005 (Ср) 11:59

Сообщение Loiste » 21.11.2005 (Пн) 14:49

Вроде не выдает ошибки...ну-ка все в очередь..буду расцеловывать))))

dedmakar
Обычный пользователь
Обычный пользователь
 
Сообщения: 71
Зарегистрирован: 08.02.2007 (Чт) 21:16

Сообщение dedmakar » 28.01.2008 (Пн) 23:35

У меня такая же ошибка. Где надо вызывать функцию OleDBDataAdapter1_OnRowUpdated? Или как ёё использовать.
Вот тут, я код кинул:
http://bbs.vbstreets.ru/viewtopic.php?p=6686778#6686778


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 2

    TopList