Я использую функцию 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
Я сделал это сам снова.
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 был проще, чем это! Спасибо всем, кто ответил.
Предполагая, что хранимая процедура вставки делает что-то вроде
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;
Попробуйте следующее:
Dim result As Integer = 0
Integer.TryParse(dbDataAdapter.InsertCommand.Parameters("@colID").Value, result)
Return result