2011-03-18 43 views
12

Đây là của tôi (thô) mã (DAL):ExecuteNonQuery()

int i; 
// Some other declarations 

SqlCommand myCmdObject = new SqlCommand("some query"); 

conn.open(); 
i = myCmdObject.ExecuteNonQuery(); 
conn.close(); 

Vấn đề là: Mặc dù có một kỷ lục hiện nay trên truy vấn SELECT của tôi, giá trị trong i vẫn -1.

Điều gì có thể là vấn đề?

Trả lời

39

Những loại truy vấn để bạn thực hiện? Sử dụng ExecuteNonQuery dành cho các yêu cầu UPDATE, INSERTDELETE. Theo the documentation:

Đối UPDATE, INSERT và DELETE báo cáo, giá trị trả về là số hàng bị ảnh hưởng bởi lệnh . Khi kích hoạt tồn tại trên bảng được chèn hoặc cập nhật, giá trị trả về bao gồm số lượng hàng bị ảnh hưởng bởi cả thao tác chèn hoặc và số lượng hàng bị ảnh hưởng bởi kích hoạt hoặc . Đối với tất cả các loại câu lệnh khác, giá trị trả về là -1.

+1

Giá trị trả về là gì, nếu chúng ta chạy một StoredProcedure sẽ chèn hoặc cập nhật hoặc xóa một bản ghi trong một Bàn, – Raghuveer

1

Bạn có thể đăng truy vấn chính xác không? Phương thức ExecuteNonQuery trả về biến số @@ROWCOUNT Sql Server bao giờ sau khi truy vấn cuối cùng đã thực thi là phương thức trả về của phương thức ExecuteNonQuery.

1

Nếu những gì bạn muốn là để có được chỉ là một số nguyên duy nhất từ ​​các truy vấn, sử dụng:

myCmdObject.ExecuteScalar() 
+0

ExecuteScalar sẽ chỉ trả về giá trị là giá trị cột đầu tiên của hàng đầu tiên trong truy vấn được thực thi. –

+0

Điều đó đúng nhưng như tôi đã nói khi chọn số nguyên duy nhất được cho là nằm trong cột đầu tiên của hàng đầu tiên :) – IordanTanev

1

Phương pháp ExecuteNonQuery được sử dụng cho câu lệnh SQL mà không truy vấn, chẳng hạn như INSERT, UPDATE ... Bạn muốn sử dụng ExecuteScalar hoặc ExecuteReader nếu bạn mong đợi tuyên bố của bạn để đưa ra kết quả (tức là một truy vấn) .

0

Từ MSDN: SqlCommand.ExecuteNonQuery Method

Bạn có thể sử dụng ExecuteNonQuery để thực hiện các thao Danh mục (ví Ví dụ, truy vấn cấu trúc của một cơ sở dữ liệu hoặc tạo ra cơ sở dữ liệu đối tượng như bảng), hoặc để thay đổi dữ liệu trong cơ sở dữ liệu mà không cần sử dụng Số liệu bằng cách thực hiện câu lệnh UPDATE, INSERT hoặc DELETE .

Mặc dù ExecuteNonQuery trả về không có hàng, bất kỳ thông số đầu ra hoặc giá trị trả lại được ánh xạ tới tham số là được điền dữ liệu.

Để biết các câu lệnh UPDATE, INSERT và DELETE , giá trị trả lại là số hàng bị ảnh hưởng bởi lệnh . Khi kích hoạt tồn tại trên bảng được chèn hoặc cập nhật, giá trị trả về bao gồm số lượng hàng bị ảnh hưởng bởi cả thao tác chèn hoặc và số lượng hàng bị ảnh hưởng bởi kích hoạt hoặc .Đối với tất cả các loại khác của câu lệnh , giá trị trả lại là -1. Nếu xảy ra trở lại, giá trị trả lại là cũng -1.

Bạn đang sử dụng truy vấn SELECT, do đó bạn sẽ có được -1

0

nếu bạn muốn chạy một bản cập nhật, xóa, hoặc chèn tuyên bố, bạn nên sử dụng ExecuteNonQuery. ExecuteNonQuery trả lại số hàng bị ảnh hưởng bởi tuyên bố.

How to Set Count On

5

Bạn sử dụng EXECUTENONQUERY() cho INSERT, UPDATEDELETE.

Nhưng đối với SELECT bạn phải sử dụng EXECUTEREADER() .........

11

Bất cứ khi nào bạn muốn thực hiện một câu lệnh SQL mà không phải trả lại một giá trị hoặc một tập hồ sơ, ExecuteNonQuery nên được sử dụng.

Vì vậy, nếu bạn muốn chạy bản cập nhật, xóa hoặc chèn câu lệnh, bạn nên sử dụng ExecuteNonQuery. ExecuteNonQuery trả về số hàng bị ảnh hưởng bởi câu lệnh. Điều này nghe có vẻ rất hay, nhưng bất cứ khi nào bạn sử dụng SQL Server 2005 IDE hoặc Visual Studio để tạo một thủ tục lưu sẵn, nó sẽ thêm một dòng nhỏ làm hỏng mọi thứ.

Dòng đó là: SET NOCOUNT ON; Dòng này bật tính năng NOCOUNT của SQL Server, "Dừng thông báo cho biết số hàng bị ảnh hưởng bởi lệnh Transact-SQL được trả về như là một phần của kết quả" và do đó nó làm cho thủ tục lưu sẵn luôn trả về -1 khi được gọi từ ứng dụng (trong trường hợp của tôi là một ứng dụng web).

Để kết luận, hãy xóa dòng đó khỏi quy trình được lưu trữ của bạn và bây giờ bạn sẽ nhận được một giá trị cho biết số hàng bị ảnh hưởng bởi câu lệnh.

Lập trình vui vẻ!

http://aspsoft.blogs.com/jonas/2006/10/executenonquery.html

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