Получение первичного ключа после вставки в asp.net (Visual Basic) - PullRequest
2 голосов
/ 06 декабря 2008

Я добавляю такую ​​запись:

    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 ]

5 голосов
/ 06 декабря 2008

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

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, но это должно помочь вам начать.

4 голосов
/ 06 декабря 2008

"SELECT @@IDENTITY" сразу после вставки должен работать с провайдером Microsoft.Jet.

2 голосов
/ 06 декабря 2008

Понял. Вот как выглядит приведенный выше код:

    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()
2 голосов
/ 06 декабря 2008

Вы хотите добавить

;select scope_identity();

после запроса и запустите executeScalar, чтобы вернуть значение.

Кроме того, на совершенно несвязанной заметке вы действительно должны изменить свой код, чтобы использовать параметризованные запросы, чтобы не попадать под атаки SQL-инъекций или сбои из-за некорректно экранированных строк, конкатенированных в ваш оператор sql.

1 голос
/ 06 декабря 2008

Простейшим способом было бы сгенерировать значение 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);"

Вы можете проверить предложение для stGuidGen кода, генерирующего guid здесь .

Эта методика на стороне клиента ясна, чиста и полезна

...