Получение значения автоинкрементного столбца в ASP.NET из таблицы MySQL БЕЗ использования хранимой процедуры

0

Я использую функцию mySQL Data Adapter и вставляет новую строку.

Я хочу, чтобы функция возвращала значение автоинкрементного столбца обновленной строки.

Пожалуйста, помогите.

Public Function addRow(ByVal colA as String, ByVal colB as String) As Integer
    Dim dbConnection As New MySqlConnection("server=xxx; user id=xxx; password=xxx; database=xxx; pooling=false;")
    Dim dbDataAdapter As New MySqlDataAdapter("SELECT * FROM table", dbConnection)
    Dim dbDataSet As DataSet = New DataSet
    dbDataAdapter.Fill(dbDataSet, "table")

    Dim dbNewRow As DataRow = dbDataSet.Tables("table").NewRow
    dbNewRow("colA") = colA
    dbNewRow("colB") = colB

    dbDataSet.Tables("table").Rows.Add(dbNewRow)

    dbDataAdapter.InsertCommand = New MySqlCommand("INSERT into table(colA, colB) VALUES (@colA, @colB)", dbConnection)
    dbDataAdapter.InsertCommand.Parameters.Add("colA", MySqlDbType.VarChar, 256, "colA")
    dbDataAdapter.InsertCommand.Parameters.Add("colB", MySqlDbType.VarChar, 256, "colB")

    Dim dbParm As MySqlParameter = dbDataAdapter.InsertCommand.Parameters.Add("@colID", MySqlDbType.Int16, 16, "colID")
    dbParm.Direction = ParameterDirection.ReturnValue

    dbDataAdapter.Update(dbDataSet, "table")

    Return dbDataAdapter.InsertCommand.Parameters("@colID").Value

End Function

Строка "Возврат..." не работает и не знает, какой будет правильный код.

  • 0
    Все, что я получаю, это «Ссылка на объект не установлена на экземпляр объекта».
Теги:
database

3 ответа

0
Лучший ответ

Я сделал это сам снова.

Public Function addRow(ByVal colA as String, ByVal colB as String) As Integer 
    Dim dbConnection As New MySqlConnection("server=xxx; user id=xxx; password=xxx; database=xxx; pooling=false;") 
    Dim dbDataAdapter As New MySqlDataAdapter("SELECT * FROM table where colID = 0", dbConnection) 
    Dim dbDataSet As DataSet = New DataSet 
    dbDataAdapter.Fill(dbDataSet, "table") 

    Dim dbNewRow As DataRow = dbDataSet.Tables("table").NewRow 
    dbNewRow("colA") = colA 
    dbNewRow("colB") = colB 

    dbDataSet.Tables("table").Rows.Add(dbNewRow) 

    dbDataAdapter.InsertCommand = New MySqlCommand("INSERT into table(colA, colB) VALUES (@colA, @colB); Select * from table where colID = LAST_INSERT_ID()", dbConnection) 
    dbDataAdapter.InsertCommand.Parameters.Add("colA", MySqlDbType.VarChar, 256, "colA") 
    dbDataAdapter.InsertCommand.Parameters.Add("colB", MySqlDbType.VarChar, 256, "colB") 

    dbDataAdapter.Update(dbDataSet, "table") 

    Return dbDataSet.Tables("table").Rows(0).Item(0)

End Function

Кажется, все, что мне нужно было сделать, это добавить оператор Select в конце инструкции Insert и использовать функцию LAST_INSERT_ID, чтобы просто получить последнюю строку Inserted. Затем просто прочитайте из этого идентификатора строк и верните его.

Я очень разочарован тем, что DataAdapters работают таким образом. Я уверен, что классический ASP был проще, чем это! Спасибо всем, кто ответил.

1

Предполагая, что хранимая процедура вставки делает что-то вроде

RETURN @@IDENTITY

Вам понадобится эквивалент этого:

oDatabase.AddParameter(oDbCommand, "@RETURN_VALUE", System.Data.DbType.Int32, System.Data.ParameterDirection.ReturnValue, "", System.Data.DataRowVersion.Current, null);
...
oDbCommand.ExecuteNonQuery();
returnStatusCode = (int)oDbCommand.Parameters[0].Value;
  • 0
    Привет, спасибо за ответ. Я не использую хранимую процедуру. Это единственный способ сделать это, чтобы использовать один?
  • 0
    Я думаю, что используемый вами встроенный SQL все еще может использовать оператор RETURN @@ IDENTIY вместо оператора select, который будет возвращать первичный ключ столбца, при условии, что он также установлен в качестве столбца идентификаторов.
0

Попробуйте следующее:

Dim result As Integer = 0
Integer.TryParse(dbDataAdapter.InsertCommand.Parameters("@colID").Value, result)
Return result
  • 0
    Привет, спасибо за ответ. К сожалению, это просто возвращает 0.
  • 0
    Ну, тогда @colID не является целым числом.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню