2011-12-04 31 views
8

Tôi có hàm sau thực thi truy vấn và trả về true thành công và sai về lỗi. Không, tôi muốn mở rộng phương thức sao cho mỗi truy vấn chèn được kích hoạt, lớp var insertId chứa ID của hàng được chèn cuối cùng.C# + SQL Server ExecuteScalar() không trả về id được chèn cuối cùng

Vấn đề là insertId luôn là 0, vì vậy bằng cách nào đó, executeScalar() không trả lại ID.

Bất kỳ ý tưởng nào? Hoặc các giải pháp khác để có được ID của truy vấn chèn cuối cùng ....

public int insertId;   

    public bool executeCommand(string q) { 
     q += "; SELECT @@IDENTITY AS LastID"; 
     bool retour = true; 
     SqlConnection myCon = new SqlConnection(Settings.DSN); 
     SqlCommand cmd = new SqlCommand(q, myCon); 
     try { 
      cmd.Connection.Open(); 
      insertId = (int)cmd.ExecuteScalar(); 
      if (insertId > 0) { 
       MessageBox.Show(insertId.ToString()); 
      } 

      myCon.Close(); 
     } catch (Exception ex) { 
      this.error = ex.Message; 
      retour = false; 
     } 
     return retour; 
    } 

Trả lời

17

Bạn nên thay đổi INSERT để trả lại ID được chèn cho bạn ngay lập tức (trong điều khoản OUTPUT)! Điều này làm việc từ SQL Server 2005 trên - các khoản OUTPUT không có sẵn trong SQL Server 2000 hoặc trước đó (bạn đã không chỉ định mà phiên bản của SQL Server bạn đang sử dụng trong câu hỏi của bạn ...). Đọc thêm về số OUTPUT clause on MSDN Books Online.

Thay đổi chèn của bạn là một cái gì đó như:

INSERT INTO dbo.YourTable(Col1, Col2, ..., ColN) 
OUTPUT Inserted.ID 
VALUES(Val1, Val2, ..., ValN); 

và sau đó khi bạn thực hiện câu lệnh insert của bạn từ C#, bạn sẽ có thể làm:

using(SqlCommand cmdInsert = new SqlCommand("INSERT.....", myCon)) 
{ 
    myCon.Open(); 
    var result = cmdInsert.ExecuteScalar(); 
    myCon.Close(); 
} 

và biến result bạn nên bây giờ chứa giá trị thích hợp, mới được chèn vào!

+1

Tôi đang sử dụng phiên bản 2005 ... Tôi sẽ thử điều này nhưng nó sẽ là một số công việc vì tất cả các truy vấn chèn đã được viết ... EDIT: Cảm ơn bạn! Điều này làm việc, kết quả bây giờ chứa id của hàng chèn – jhoevenaars

+0

Cảm ơn rất nhiều. Nhưng hãy nhớ rằng Inserted.ID có nghĩa là Inserted.name của cột ID :) –

+0

Muchas gracias, funciona de maravilla: D – cheloncio

2

Hãy thử SCOPE_IDENTITY() thay vì @@ IDENTITY, nếu điều đó không làm việc, bạn có thể đăng các schema bảng và truy vấn chèn bạn đang chạy.

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