Tôi cần một hàm thực thi câu lệnh INSERT trên cơ sở dữ liệu và trả về khóa chính Auto_Increment. Tôi có mã C# sau nhưng, trong khi câu lệnh INSERT hoạt động tốt (tôi có thể xem bản ghi trong cơ sở dữ liệu, PK được tạo đúng và hàng == 1), giá trị id luôn là 0. Bất kỳ ý tưởng nào về những gì có thể xảy ra sai rồi?@@ IDENTITY sau câu lệnh INSERT luôn trả về 0
public int ExecuteInsertStatement(string statement)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement;
int rows = cmdInsert.ExecuteNonQuery();
if (rows == 1)
{
IDbCommand cmdId = connection.CreateCommand();
cmdId.CommandText = "SELECT @@Identity;";
id = (int)cmdId.ExecuteScalar();
}
return id;
}
private void InitializeAndOpenConnection()
{
if (connection == null)
connection = OleDbProviderFactory.Instance.CreateConnection(connectString);
if(connection.State != ConnectionState.Open)
connection.Open();
}
Đáp lại câu trả lời, tôi đã cố gắng:
public int ExecuteInsertStatement(string statement, string tableName)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement + ";SELECT OID FROM " + tableName + " WHERE OID = SCOPE_IDENTITY();";
id = (int)cmdInsert.ExecuteScalar();
return id;
}
nhưng tôi là bây giờ nhận được lỗi "Nhân vật tìm thấy sau khi kết thúc câu lệnh SQL"
Tôi đang sử dụng MS Access cơ sở dữ liệu với kết nối OleDb, Nhà cung cấp = Microsoft.Jet.OLEDB.4.0
Ông có thể làm rõ những gì máy chủ cơ sở dữ liệu bạn đang sử dụng và có thể là nội tuyến các tài liệu tham khảo để InitializeAndOpenConnection/connection.CreateCommand vì chúng có thể ảnh hưởng đến câu trả lời của chúng tôi để bạn? :) – Rob
Ngoài ra - toàn bộ "SELECT OID FROM x nơi OID = SCOPE_IDENTITY()" thins là hơi phức tạp như bạn đang nói (đối với một bản ghi được chèn với một giá trị nhận dạng của 3): "SELECT 3 FROM table_x WHERE 3 = 3 "- kinda dự phòng – Rob
@Rob: có vẻ như thừa, nhưng OID được nhập int, trong đó scope_identity() không phải, vì vậy bạn có thể trực tiếp truyền (int) cmd.ExecuteScalar() – devio