2011-12-15 27 views
8

Tôi đang sử dụng MySql Connector .net và tôi cần lấy id chèn được tạo bởi truy vấn cuối cùng. Bây giờ, tôi giả sử giá trị trả về của MySqlHelper.ExecuteNonQuery nên chèn id cuối cùng, nhưng nó chỉ trả về 1.MySql Last Insert ID, Connector .net

Mã Tôi đang sử dụng là:

int insertID = MySqlHelper.ExecuteNonQuery(Global.ConnectionString, 
"INSERT INTO test SET var = @var", paramArray); 

Tuy nhiên insertID luôn là 1. Tôi cố gắng tạo một kết nối MySql và mở/đóng bằng tay mà dẫn đến hành vi tương tự

+0

1 nghĩa là đã chèn 1 bản ghi. Để lấy lại insertID, bạn cần một truy vấn. – chance

+0

Không phải là "SET" được sử dụng trên CẬP NHẬT và không phải là Phụ trang? – jason

+0

Bạn có thể sử dụng nó cho cả hai: http://dev.mysql.com/doc/refman/5.5/en/insert.html – Splatbang

Trả lời

1

1 là không có hồ sơ bị ảnh hưởng bởi các truy vấn ở đây chỉ có một hàng được chèn quá 1 lợi nhuận

để nhận id của hàng chèn bạn phải sử dụng scope_identity() trong SQLServer và LAST_INSERT_ID() trong MySql

3

Cố gắng sử dụng truy vấn này để có được chèn vào id cuối cùng -

SELECT LAST_INSERT_ID(); 

Sau đó, chạy phương pháp DbCommand.ExecuteReader để có được IDataReader -

command.CommandText = "SELECT LAST_INSERT_ID()"; 
IDataReader reader = command.ExecuteReader(); 

. ..và lấy thông tin từ người đọc -

if (reader != null && reader.Read()) 
    long id = reader.GetInt64(0); 

... đừng quên để đóng đọc ;-)

+0

Cảm ơn! Đó là cách duy nhất để làm việc khi sử dụng giao dịch;) –

72

Chỉ cần sử dụng lĩnh vực LastInsertedId

MySqlCommand dbcmd = _conn.CreateCommand(); 
dbcmd.CommandText = sqlCommandString; 
dbcmd.ExecuteNonQuery(); 
long imageId = dbcmd.LastInsertedId; 
+2

Đây là câu trả lời đúng. Thử nghiệm với [MySql/Connector] (http://dev.mysql.com/downloads/connector/net/) 6.3.8 – caligari

+0

Cách dễ dàng, thậm chí được kiểm tra bởi tôi. Đúng ! – Hatem

+0

Đây là một cách để làm điều đó, ** nhưng không phải nếu bạn cần sử dụng nghiêm ngặt MySqlHelper.ExecuteNonQuery **. Một trong những lý do để sử dụng MySqlHelper là khi bạn muốn trình kết nối quản lý nhóm kết nối và, như đã nêu trong [docs] (https: //dev.mysql.com/doc/connector-net/vi/connector-net-lập trình-kết nối-pooling.html), một cách tiếp cận là sử dụng các quá tải api mà không lấy một đối tượng MySqlConnection mới làm tham số, thay vào đó, để cho trình quản lý kết nối tự tạo. Vì vậy, đây không phải là một giải pháp cho các trường hợp như vậy (mỏ). – Veverke

2

tôi đã cùng một vấn đề, và sau một số thử nghiệm, tôi phát hiện ra rằng vấn đề dường như là phương thức kết nối; bạn đang sử dụng một chuỗi kết nối.

Đây là khóa học để sử dụng tính năng tái sử dụng nhóm kết nối tự động, nhưng trong trường hợp này nó đã gây rắc rối cho tôi.

Giải pháp cuối cùng cho tôi là tạo một kết nối mới, thực hiện truy vấn chèn, và sau đó thực thi last_insert_id(). Trên số cùng một kết nối.

Nếu không sử dụng cùng một kết nối, last_insert_id() có thể trả về bất cứ điều gì, tôi không biết tại sao, nhưng đoán nó mất theo dõi mọi thứ vì nó có thể là các kết nối khác nhau.

Ví dụ:

MySqlConnection connection = new MySqlConnection(ConnectionString); 
connection.Open(); 

int res = MySqlHelper.ExecuteNonQuery(
    connection, 
    "INSERT INTO games (col1,col2) VALUES (1,2);"); 

object ores = MySqlHelper.ExecuteScalar(
connection, 
"SELECT LAST_INSERT_ID();"); 

if (ores != null) 
{ 
    // Odd, I got ulong here. 
    ulong qkwl = (ulong)ores; 
    int Id = (int)qkwl; 
} 

Tôi hy vọng điều này sẽ giúp người!

Các vấn đề liên quan