2010-10-18 46 views
5

Trong SQL Server, ID là một số nguyên không null và một danh tính.Phương thức SQLCommand ExecuteScalar() trả về kiểu dữ liệu nào?

Khi tôi chạy đoạn mã sau, tôi nhận được một InvalidCastException trên dòng cuối cùng:

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = _conn; 
cmd.CommandText = @"INSERT INTO [Users] (Name, Email, Password) VALUES (@name, @email, @pass); SELECT SCOPE_IDENTITY()"; 
cmd.Parameters.AddWithValue("@name", newUser.Name); 
cmd.Parameters.AddWithValue("@email", newUser.Email); 
cmd.Parameters.AddWithValue("@pass", newUser.PasswordHash); 
int id = (int)cmd.ExecuteScalar(); 

ExecuteScalar() trở về đây là gì? Dù trở về của nó có một ToString() mà làm cho nó trông giống như một số, vì vậy dòng khủng khiếp mã này hoạt động:

int id = Int32.Parse(cmd.ExecuteScalar().ToString()); 
+7

Điều gì xảy ra nếu bạn gọi 'GetType() '? – SLaks

+0

Wow, tại sao tôi không nghĩ về điều đó? Nó trả về một số thập phân. Cảm ơn. – Patty

Trả lời

2

Nó có thể trở về một trường hợp đóng hộp của một số loại khác nhau, chẳng hạn như long.
A boxed long cannot be converted to int.

Bạn có thể gọi GetType() trên giá trị trả lại để xem loại thực sự là gì.

+1

Để mở rộng câu trả lời này, kiểu trả về ExecuteScalar là Object, có nghĩa là bất kỳ loại giá trị nào sẽ được đóng hộp, bạn không thể bỏ kiểu giá trị được đóng vào bất kỳ thứ gì khác ngoài kiểu gốc –

0

Từ cuối câu lệnh INSERT của bạn

SELECT SCOPE_IDENTITY() 

Nó trở về giá trị bản sắc của hàng chèn vào [Thành viên] bảng.

9

SCOPE_IDENTITY() trả lại mã decimal trong mã, còn được gọi là NUMERIC(38,0) trong TSQL.

http://msdn.microsoft.com/en-us/library/ms190315.aspx

Vì vậy, nếu bạn muốn có một diễn viên trực tiếp, bạn có thể làm (int)(decimal)cmd.ExecuteScalar();. Lưu ý rằng chuyển đổi thập phân sang int có thể mất thông tin theo nghĩa hẹp nhất, do đó, chỉ cần được thông báo. Nhưng với cột nhận dạng của bạn là số nguyên, chuyển đổi sẽ an toàn.

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