Как автоинкрементировать поле "счетчик" из VB.Net?
От: bulkoed  
Дата: 04.04.03 16:07
Оценка:
Приветствую Всех.

Есть у меня небольшая база данных на Access, в этой базе есть таблица со полем типа "Счетчик".
Использую я эту базу данных из программы на VB.Net.
Но когда происходит добавление новой записи (пока что это делается из DataGrid), то поле типа "Счетчик" не изменяется.
Подскажите пожалуйста, как сделать так чтобы оно автоинкрементировалось.

Заранее премного благодарен.
С уважением,
Денис.
Re: Как автоинкрементировать поле "счетчик" из VB.Net?
От: ВованЯ  
Дата: 04.04.03 16:30
Оценка:
Здравствуйте, bulkoed, Вы писали:

B> Есть у меня небольшая база данных на Access, в этой базе есть таблица со полем типа "Счетчик".

B> Подскажите пожалуйста, как сделать так чтобы оно автоинкрементировалось.

через
OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);

в обработчике события RowUpdated от адаптера
подробнее в MSDN ms-help://MS.VSCC/MS.MSDNVS/cpguide/html/cpconretrievingidentityorautonumbervalues.htm
С уважением, Владимир
Re[2]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: bulkoed  
Дата: 06.04.03 14:27
Оценка:
Здравствуйте, ВованЯ, Вы писали:

ВЯ>Здравствуйте, bulkoed, Вы писали:


B>> Есть у меня небольшая база данных на Access, в этой базе есть таблица со полем типа "Счетчик".

B>> Подскажите пожалуйста, как сделать так чтобы оно автоинкрементировалось.

ВЯ>через

ВЯ>
ВЯ>OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);
ВЯ>

ВЯ>в обработчике события RowUpdated от адаптера
ВЯ>подробнее в MSDN ms-help://MS.VSCC/MS.MSDNVS/cpguide/html/cpconretrievingidentityorautonumbervalues.htm

Благодарю. Но Вы не могли бы дать ссылку на документацию в MSDN online, а то у меня нет пока MSDN'на на дисках.
Или может приведете небольшой примерчик кода чтобы модны было видеть как получить из такой команды данные в переменную?

Заранее премного благодарен!
С уважением,
Денис.
Re[3]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: ВованЯ  
Дата: 06.04.03 15:00
Оценка:
Здравствуйте, bulkoed, Вы писали:

B> Благодарю. Но Вы не могли бы дать ссылку на документацию в MSDN online, а то у меня нет пока MSDN'на на дисках.


MSDN: Retrieving Identity or Autonumber Values
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconretrievingidentityorautonumbervalues.asp?frame=true
С уважением, Владимир
Re[4]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: bulkoed  
Дата: 07.04.03 05:30
Оценка:
Здравствуйте, ВованЯ, Вы писали:

ВЯ>Здравствуйте, bulkoed, Вы писали:


B>> Благодарю. Но Вы не могли бы дать ссылку на документацию в MSDN online, а то у меня нет пока MSDN'на на дисках.


ВЯ>MSDN: Retrieving Identity or Autonumber Values

ВЯ>http://msdn.microsoft.com/library/en-us/cpguide/html/cpconretrievingidentityorautonumbervalues.asp?frame=true

Премного благодарен! Самое то что было нужно.
С уважением,
Денис.
Re[4]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: bulkoed  
Дата: 07.04.03 08:04
Оценка:
Здравствуйте, ВованЯ, Вы писали:

ВЯ>Здравствуйте, bulkoed, Вы писали:


B>> Благодарю. Но Вы не могли бы дать ссылку на документацию в MSDN online, а то у меня нет пока MSDN'на на дисках.


ВЯ>MSDN: Retrieving Identity or Autonumber Values

ВЯ>http://msdn.microsoft.com/library/en-us/cpguide/html/cpconretrievingidentityorautonumbervalues.asp?frame=true

Вобщем что-то не работает этот MSDN овский код
Вот мой код:


            cmdGetLetterData.CommandText = "SELECT LetterID, EjectDate, Ejected, AttestDoc, Series, Number, DateVid, EjectKim, NaOtrVid, CenaZa
            FROM LetterData ORDER BY LetterID"
            cmdGetLetterData.Connection = cn

            cmdInsertLetterData.CommandText = "INSERT INTO LetterData(LetterID, EjectDate, Ejected, AttestDoc, Series, Number, DateVid, EjectKim,
            NaOtrVid, CenaZa) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
            cmdInsertLetterData.CommandType = CommandType.Text
            cmdInsertLetterData.Connection = cn
            cmdInsertLetterData.Parameters.Add("@EjectDate", OleDb.OleDbType.DBDate, 0, "EjectDate")
            cmdInsertLetterData.Parameters.Add("@Ejected", OleDb.OleDbType.VarWChar, 100, "Ejected")

            adLetterData.SelectCommand = cmdGetLetterData
            adLetterData.InsertCommand = cmdInsertLetterData


            cn.Open()

            adLetterData.Fill(dsLetter)

            Dim newRow As DataRow = dsLetter.Tables("LetterData").NewRow()
            newRow("EjectDate") = "12.03.2003"
            dsLetter.Tables("LetterData").Rows.Add(newRow)
                 ^^^^ При выполнении программы вот на эту строку выдается что LetterID не может быть пустым

            AddHandler adLetterData.RowUpdated, New OleDb.OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)


            adLetterData.Update(dsLetter, "LetterData")

            cn.Close()


            Private Shared Sub OnRowUpdated(ByVal Sender As Object, ByVal args As OleDb.OleDbRowUpdatedEventArgs)
                Dim newID As Integer = 0
                Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTIFY", cn)

                If args.StatementType = StatementType.Insert Then
                    newID = CInt(idCMD.ExecuteScalar())
                    args.Row("LetterID") = newID
                End If
            End Sub
С уважением,
Денис.
Re[5]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: ВованЯ  
Дата: 07.04.03 08:22
Оценка:
Здравствуйте, bulkoed, Вы писали:

у тебя, наверное, на поле LetterID стоит constraint, который не дает ему быть DBNull.Value.
либо удали это ограничение, либо см Q310350
HOW TO: Update Parent-Child Data with an Identity Column from a Windows Forms Application
С уважением, Владимир
Re[6]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: bulkoed  
Дата: 07.04.03 08:30
Оценка:
Здравствуйте, ВованЯ, Вы писали:

ВЯ>Здравствуйте, bulkoed, Вы писали:


ВЯ>у тебя, наверное, на поле LetterID стоит constraint, который не дает ему быть DBNull.Value.

ВЯ>либо удали это ограничение, либо см Q310350
ВЯ>HOW TO: Update Parent-Child Data with an Identity Column from a Windows Forms Application

А где в MSDN'е можно это посмотреть — не дадите ли ссылочку?
С уважением,
Денис.
Re[7]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: ВованЯ  
Дата: 07.04.03 08:45
Оценка:
Здравствуйте, bulkoed, Вы писали:

B> А где в MSDN'е можно это посмотреть — не дадите ли ссылочку?


странно, что у тебя не подсвечивается как ссылка Q310350, тогда явно
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q310350
С уважением, Владимир
Re[8]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: bulkoed  
Дата: 07.04.03 08:59
Оценка:
Здравствуйте, ВованЯ, Вы писали:

ВЯ>Здравствуйте, bulkoed, Вы писали:


B>> А где в MSDN'е можно это посмотреть — не дадите ли ссылочку?


ВЯ>странно, что у тебя не подсвечивается как ссылка Q310350, тогда явно

ВЯ>http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q310350

Кстати, убрал всякие ключи, решил попробовать первый вариант и вот что получил — ошибку вот здесь:




    Private Shared Sub OnRowUpdated(ByVal Sender As Object, ByVal args As OleDb.OleDbRowUpdatedEventArgs)
        Dim newID As Integer = 0
        Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTIFY", cn)

        If args.StatementType = StatementType.Insert Then
            newID = CInt(idCMD.ExecuteScalar())
               ^^^ Вот на эту строку VB вылетает с экскепшеном такого рода: "An unhandled exception of type 'System.Data.OleDb.OleDbException'
                                                                             occurred in system.data.dll"
            args.Row("LetterID") = newID
        End If
    End Sub



В чем теперь может быть проблема?
С уважением,
Денис.
Re[9]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: ВованЯ  
Дата: 07.04.03 09:06
Оценка:
Здравствуйте, bulkoed, Вы писали:
B>Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTIFY", cn)
B>В чем теперь может быть проблема?
если это строка из программы, то исправь SELECT @@IDENTITY
С уважением, Владимир
Re[10]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: bulkoed  
Дата: 07.04.03 09:48
Оценка:
Здравствуйте, ВованЯ, Вы писали:

ВЯ>Здравствуйте, bulkoed, Вы писали:

B>>Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTIFY", cn)
B>>В чем теперь может быть проблема?
ВЯ>если это строка из программы, то исправь SELECT @@IDENTITY

Премного благодарен! Помогло.

Но вот столкнулся тутже с еще одной проблемой — привожу свой код и ошибку:



   'Это в описании класса
   Public dsLetter As New DataSet()
   Public cmdGetLetterData As New OleDbCommand()
   Public cmdInsertLetterData As New OleDbCommand()
   Public cmdUpdateLetterData As New OleDbCommand()

   Public adLetterData As New OleDbDataAdapter()

   'Теперь кусок из FormLoad
   cmdGetLetterData.CommandText = "SELECT LetterID, EjectDate, Ejected, AttestDoc, Series, Number, DateVid, EjectKim, NaOtrVid, CenaZa FROM
   LetterData ORDER BY LetterID"
   cmdGetLetterData.Connection = cn

   cmdInsertLetterData.CommandText = "INSERT INTO LetterData(EjectDate, Ejected, AttestDoc, Series, Number, DateVid, EjectKim,
   NaOtrVid, CenaZa) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)"
   cmdInsertLetterData.CommandType = CommandType.Text
   cmdInsertLetterData.Connection = cn
   cmdInsertLetterData.Parameters.Add("EjectDate", OleDb.OleDbType.DBDate, 10, "EjectDate")
   cmdInsertLetterData.Parameters.Add("Ejected", OleDb.OleDbType.VarWChar, 50, "Ejected")
   cmdInsertLetterData.Parameters.Add("AttestDoc", OleDbType.VarWChar, 50, "AttestDoc")
   cmdInsertLetterData.Parameters.Add("Series", OleDbType.VarWChar, 10, "Series")
   cmdInsertLetterData.Parameters.Add("Number", OleDbType.Integer, 0, "Number")
   cmdInsertLetterData.Parameters.Add("DateVid", OleDbType.DBDate, 10, "DateVid")
   cmdInsertLetterData.Parameters.Add("EjectKim", OleDbType.VarWChar, 100, "EjectKim")
   cmdInsertLetterData.Parameters.Add("NaOtrVid", OleDbType.VarWChar, 100, "NaOtrVid")
   cmdInsertLetterData.Parameters.Add("CenaZa", OleDbType.VarWChar, 50, "CenaZa")

   cmdUpdateLetterData.CommandText = "UPDATE LetterData SET EjectDate = ?, Ejected = ?, AttestDoc = ?, Series = ?, Number = ?, 
   DateVid = ?, EjectKim = ?, NaOtrVid = ?, CenaZa = ?"
   cmdUpdateLetterData.CommandType = CommandType.Text
   cmdUpdateLetterData.Connection = cn
   cmdUpdateLetterData.Parameters.Add("EjectDate", OleDb.OleDbType.DBDate, 10, "EjectDate")
   cmdUpdateLetterData.Parameters.Add("Ejected", OleDb.OleDbType.VarWChar, 50, "Ejected")
   cmdUpdateLetterData.Parameters.Add("AttestDoc", OleDbType.VarWChar, 50, "AttestDoc")
   cmdUpdateLetterData.Parameters.Add("Series", OleDbType.VarWChar, 10, "Series")
   cmdUpdateLetterData.Parameters.Add("Number", OleDbType.Integer, 0, "Number")
   cmdUpdateLetterData.Parameters.Add("DateVid", OleDbType.DBDate, 10, "DateVid")
   cmdUpdateLetterData.Parameters.Add("EjectKim", OleDbType.VarWChar, 100, "EjectKim")
   cmdUpdateLetterData.Parameters.Add("NaOtrVid", OleDbType.VarWChar, 100, "NaOtrVid")
   cmdUpdateLetterData.Parameters.Add("CenaZa", OleDbType.VarWChar, 50, "CenaZa")

   adLetterData.SelectCommand = cmdGetLetterData
   adLetterData.InsertCommand = cmdInsertLetterData
   adLetterData.UpdateCommand = cmdUpdateLetterData
   adLetterData.TableMappings.Add("Table", "LetterData")


   'А это кусок из процедуры вставки новой записи в нем и ошибка сосбвенно
   Private Sub btnInsertLetter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsertLetter.Click
        Dim LDataForm As New LetterDataForm()

        LDataForm.ShowDialog()
        If LDataForm.DialogResult = DialogResult.OK Then

            cn.Open()

            adLetterData.Fill(dsLetter)

            Dim newRow As DataRow = dsLetter.Tables(0).NewRow
            newRow.Item("EjectDate") = "12.03.2003"
            newRow.Item("Ejected") = "dasda"
            newRow.Item("AttestDoc") = "ddasdas"
            newRow.Item("Series") = "dsadasda"
            newRow.Item("Number") = 1000
            newRow.Item("DateVid") = "12.04.2003"
            newRow.Item("EjectKim") = "dasdas"
            newRow.Item("NaOtrVid") = "dasda"
            newRow.Item("CenaZa") = "dsdasd"
            dsLetter.Tables(0).Rows.Add(newRow)

            'Вставляем обработчик события для заполнения автоинкрементного поля
            AddHandler adLetterData.RowUpdated, New OleDb.OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)

            adLetterData.Update(dsLetter)
               ^^^ Вот тут вылетаем с ошибкой: "An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll"
                     :( 
            cn.Close()
        End If
    End Sub

    Private Shared Sub OnRowUpdated(ByVal Sender As Object, ByVal args As OleDb.OleDbRowUpdatedEventArgs)
        Dim newID As Integer = 0
        Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTITY", cn)

        If args.StatementType = StatementType.Insert Then
            newID = CInt(idCMD.ExecuteScalar())
            args.Row("LetterID") = newID
        End If
    End Sub
С уважением,
Денис.
Re[11]: Как автоинкрементировать поле "счетчик" из VB.Net?
От: ВованЯ  
Дата: 07.04.03 10:54
Оценка:
Здравствуйте, bulkoed, Вы писали:

так вроде бы все нормально (кроме UPDATE).
посмотри и приведи полное описание exception — InnerException.
С уважением, Владимир
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.