Есть у меня небольшая база данных на Access, в этой базе есть таблица со полем типа "Счетчик".
Использую я эту базу данных из программы на VB.Net.
Но когда происходит добавление новой записи (пока что это делается из DataGrid), то поле типа "Счетчик" не изменяется.
Подскажите пожалуйста, как сделать так чтобы оно автоинкрементировалось.
Заранее премного благодарен.
С уважением,
Денис.
Re: Как автоинкрементировать поле "счетчик" из VB.Net?
Здравствуйте, bulkoed, Вы писали:
B> Есть у меня небольшая база данных на Access, в этой базе есть таблица со полем типа "Счетчик". B> Подскажите пожалуйста, как сделать так чтобы оно автоинкрементировалось.
через
OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);
Здравствуйте, ВованЯ, Вы писали:
ВЯ>Здравствуйте, bulkoed, Вы писали:
B>> Есть у меня небольшая база данных на Access, в этой базе есть таблица со полем типа "Счетчик". B>> Подскажите пожалуйста, как сделать так чтобы оно автоинкрементировалось.
ВЯ>через ВЯ>
ВЯ>OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);
ВЯ>
Благодарю. Но Вы не могли бы дать ссылку на документацию в MSDN online, а то у меня нет пока MSDN'на на дисках.
Или может приведете небольшой примерчик кода чтобы модны было видеть как получить из такой команды данные в переменную?
Заранее премного благодарен!
С уважением,
Денис.
Re[3]: Как автоинкрементировать поле "счетчик" из VB.Net?
Вобщем что-то не работает этот 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?
у тебя, наверное, на поле 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, Вы писали:
ВЯ>у тебя, наверное, на поле 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?
Кстати, убрал всякие ключи, решил попробовать первый вариант и вот что получил — ошибку вот здесь:
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?
Здравствуйте, bulkoed, Вы писали: B>Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTIFY", cn) B>В чем теперь может быть проблема?
если это строка из программы, то исправь SELECT @@IDENTITY
С уважением, Владимир
Re[10]: Как автоинкрементировать поле "счетчик" из VB.Net?
Здравствуйте, ВованЯ, Вы писали:
ВЯ>Здравствуйте, 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?