2011-10-14 20 views
6

Tôi mới viết thủ tục được lưu trữ. Vì vậy, tôi đã viết một với các tham số đầu ra và muốn truy cập vào giá trị đầu ra, nóng để làm điều đó.Cách sử dụng tham số OUTPUT trong Quy trình đã lưu

My Stored Procedure:

ALTER PROCEDURE selQuery 
    (
     @id int, @code varchar(50) OUTPUT 
    ) 
AS 
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id 
    RETURN @code 

Nếu cố gắng để thiết lập "@ code = RecItemCode" nhận được lỗi như sau: "Một câu lệnh SELECT mà gán một giá trị cho một biến phải không được kết hợp với các hoạt động Phục hồi dữ liệu"

Và tôi đang sử dụng Stored Procedure như:

con.Open(); 
cmd.Parameters.AddWithValue("@id", textBox1.Text); 
SqlParameter code = new SqlParameter("@code", SqlDbType.Int); 
code.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(code); 
SqlDataReader sdr = cmd.ExecuteReader(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); // getting error 
con.Close(); 

Lỗi: "Đối tượng tham chiếu không được đặt để một thể hiện của một đối tượng." Tôi muốn lấy giá trị của tham số đầu ra. Làm thế nào để có được điều đó?

Cảm ơn.

Trả lời

7

SQL trong SP của bạn sai. Bạn có thể muốn

Select @code = RecItemCode from Receipt where RecTransaction = @id 

Trong tuyên bố của bạn, bạn không đặt @code, bạn đang cố gắng sử dụng nó cho giá trị của RecItemCode. Điều này sẽ giải thích của bạn NullReferenceException khi bạn cố gắng sử dụng tham số đầu ra, bởi vì một giá trị không bao giờ được gán cho nó và bạn đang nhận được một null mặc định.

Vấn đề khác là câu lệnh SQL của bạn nếu viết lại như

Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id 

Nó được trộn phân biến và phục hồi dữ liệu. Điều này làm nổi bật một vài điểm. Nếu bạn cần dữ liệu đang lái @code ngoài các phần khác của dữ liệu, hãy quên tham số đầu ra và chỉ chọn dữ liệu.

Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

Nếu bạn chỉ cần mã, hãy sử dụng câu lệnh SQL đầu tiên tôi đã chỉ cho bạn.Trên cơ hội ăn nói lấc cấc bạn thực sự cần sản lượng dữ liệu, sử dụng hai câu lệnh khác nhau

Select @code = RecItemCode from Receipt where RecTransaction = @id 
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

này nên gán giá trị của mình vào tham số đầu ra cũng như trở lại hai cột dữ liệu trong một hàng. Tuy nhiên, điều này khiến tôi thất vọng khủng khiếp.

Nếu bạn viết SP của mình như tôi đã hiển thị ở trên cùng, chỉ cần gọi cmd.ExecuteNonQuery(); và sau đó đọc giá trị tham số đầu ra.


Một vấn đề khác với SP và mã của bạn. Trong SP của bạn, bạn đã khai báo @code là varchar. Trong mã của bạn, bạn chỉ định loại tham số là Int. Hoặc thay đổi SP hoặc mã của bạn để làm cho các loại phù hợp.


Cũng lưu ý: Nếu tất cả những gì bạn đang làm sẽ trả lại một giá trị, có cách khác để thực hiện điều đó không liên quan đến thông số đầu ra. Bạn có thể viết

Select RecItemCode from Receipt where RecTransaction = @id 

Và sau đó sử dụng object obj = cmd.ExecuteScalar(); để nhận kết quả, không cần tham số đầu ra trong SP hoặc trong mã của bạn.

+0

cảm ơn anthony, nó đã giúp rất nhiều .... cảm ơn nhiều – Sandy

+0

Cảm ơn bạn và +1. 'object obj = cmd.ExecuteScalar();' làm việc hoàn hảo. Tôi đã có thể thực hiện những gì tôi cần trong hai dòng mã C#, thứ hai là 'myString = obj.ToString();'. – FumblesWithCode

24

Có một vài điều bạn cần phải giải quyết để có được nó làm việc

  1. Tên là sai không nó @ouput@code
  2. Bạn cần phải thiết lập các tham số để hướng Output.
  3. Không sử dụng AddWithValue vì nó không phải có giá trị chỉ là bạn Add.
  4. Sử dụng ExecuteNonQuery nếu bạn không trở về hàng

Hãy thử

SqlParameter output = new SqlParameter("@code", SqlDbType.Int); 
output.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(output); 
cmd.ExecuteNonQuery(); 
MessageBox.Show(output.Value.ToString()); 
+0

tuyệt vời, nhưng làm thế nào để có được giá trị của tham số đầu ra ?? output.Value.ToString() đưa ra lỗi là "Tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng." – Sandy

+0

và không nói "BẠN FORGOT" vì tôi không quên, thực sự tôi không biết :-( – Sandy

+0

@rapsalands, * sau * bạn thực hiện truy vấn, truy xuất giá trị từ tham số. 'Cmd.ExecuteNonQuery(); int value = (int) output.Value; ' –

1

Bạn cần phải xác định các thông số đầu ra như một tham số đầu ra trong các mã với ParameterDirection.Output liệt kê. Có rất nhiều ví dụ về điều này, nhưng đây là một ví dụ trên MSDN.

1
SqlCommand yourCommand = new SqlCommand(); 
yourCommand.Connection = yourSqlConn; 
yourCommand.Parameters.Add("@yourParam"); 
yourCommand.Parameters["@yourParam"].Direction = ParameterDirection.Output; 

// execute your query successfully 

int yourResult = yourCommand.Parameters["@yourParam"].Value; 
+0

tôi đang gặp lỗi. xem sửa bài viết ... nhờ – Sandy

+0

@rapsalands Bạn không thể thực thi mã. Nó không phải là một khối mã độc lập. Lỗi đó nói rằng bạn chưa khởi tạo một đối tượng (tức là tạo một thể hiện mới của nó).Nó chỉ là để cho bạn ý tưởng chung về cách lấy một giá trị từ một tham số đầu ra của một proc được lưu trữ. –

+0

Thực ra tôi đang cố gắng học SP và chưa bao giờ thực hiện nó trước đây. Nó sẽ là tuyệt vời nếu bạn có thể nói những gì sai với mã của tôi. Tôi có nghĩa là nơi tôi phải tạo ra các ví dụ ?? – Sandy

0

Bạn cần đóng kết nối trước khi có thể sử dụng các thông số đầu ra. Một cái gì đó như thế này

con.Close(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); 
Các vấn đề liên quan