Получение первичного ключа после вставки в asp.net (Visual Basic)
Я добавляю такую запись:
Dim pathString As String = HttpContext.Current.Request.MapPath("Banking.mdb")
Dim odbconBanking As New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" + pathString)
Dim sql As String
sql = "INSERT INTO tblUsers ( FirstName, LastName, Address, City, Province, Zip, Phone, UserName, [Password])" & _
" VALUES ('" & firstName & "', '" & lastName & "', '" & address & _
"', '" & city & "', '" & province & "', '" & zip & "', '" & phone & "', '" & username & "', '" & password & "');"
odbconBanking.Open()
Dim cmd As New OleDbCommand(sql, odbconBanking)
cmd.ExecuteNonQuery()
odbconBanking.Close()
Первичный ключ представляет собой поле автономного номера с именем UserID. Итак, как мне получить первичный ключ записи, которую я только что вставил?
Благодарю.
5 ответов
Я считаю, что параметризованный запрос будет выглядеть примерно так:
Dim pathString As String = HttpContext.Current.Request.MapPath("Banking.mdb")
Dim odbconBanking As New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" + pathString)
Dim sql As String
sql = "INSERT INTO tblUsers ( FirstName, LastName, Address, City, Province, Zip, Phone, UserName, [Password])" & _
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"
odbconBanking.Open()
Dim cmd As New OleDbCommand(sql, odbconBanking)
//Add Params here
cmd.Parameters.Add(new OdbcParameter("@FirstName", firstName))
cmd.Parameters.Add(new OdbcParameter("@LastName", lastName))
//..etc
//End add Params here
cmd.ExecuteNonQuery()
Dim newcmd As New OleDbCommand("SELECT @@IDENTITY", odbconBanking)
uid = newcmd.ExecuteScalar
odbconBanking.Close()
Мой синтаксис может быть немного неправильным, так как я более привык использовать библиотеку Sql Server, а не библиотеку Odbc, но это должно помочь вам начать.
"SELECT @@IDENTITY"
только после вставки должен работать Microsoft.Jet Provider.
Вы хотите добавить
;select scope_identity();
после вашего запроса и запустите executeScalar, чтобы получить значение обратно.
Кроме того, на совершенно несвязанной заметке вы действительно должны изменить свой код, чтобы использовать параметризованные запросы, чтобы вас не поймали атаки SQL-инъекций или сбои из-за неправильно экранированных строк, конкатенированных в ваш оператор sql.
Понял. Вот как выглядит приведенный выше код:
Dim pathString As String = HttpContext.Current.Request.MapPath("Banking.mdb")
Dim odbconBanking As New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" + pathString)
Dim sql As String
sql = "INSERT INTO tblUsers ( FirstName, LastName, Address, City, Province, Zip, Phone, UserName, [Password])" & _
" VALUES ('" & firstName & "', '" & lastName & "', '" & address & _
"', '" & city & "', '" & province & "', '" & zip & "', '" & phone & "', '" & username & "', '" & password & "');"
odbconBanking.Open()
Dim cmd As New OleDbCommand(sql, odbconBanking)
cmd.ExecuteNonQuery()
Dim newcmd As New OleDbCommand("SELECT @@IDENTITY", odbconBanking)
uid = newcmd.ExecuteScalar
odbconBanking.Close()
Самый простой способ - создать значение uniqueIdentifier на уровне кода, добавить его в строку и отправить на сервер.
Dim sql As String, _
myNewUserId as variant
myNewUserId = stGuidGen 'this function will generate a new GUID value)'
sql = "INSERT INTO tblUsers ( userId, LastName)" & _
" VALUES ('" & myNewUserId & "','" & LastName);"
Вы можете проверить предложение для кода, генерирующего guid stGuidGen здесь.
Эта методика на стороне клиента ясна, чиста и полезна