San*_*ndy 6 c# stored-procedures sql-server-2008
我是编写存储过程的新手.所以我用输出参数编写了一个并想要访问输出值,热点就可以了.
我的存储过程:
ALTER PROCEDURE selQuery
(
@id int, @code varchar(50) OUTPUT
)
AS
SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id
RETURN @code
Run Code Online (Sandbox Code Playgroud)
如果尝试将"@ code = RecItemCode"设置为获取错误:"为变量赋值的SELECT语句不得与Data Retrieval操作结合使用."
我使用存储过程:
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();
Run Code Online (Sandbox Code Playgroud)
错误:"对象引用未设置为对象的实例." 我想得到输出参数的值.怎么做到的?
谢谢.
Con*_*rix 25
要使其正常工作,您需要解决几个问题
@ouput它的@code AddWithValue因为它不应该只有你的价值Add.ExecuteNonQuery如果你没有返回行尝试
SqlParameter output = new SqlParameter("@code", SqlDbType.Int);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output);
cmd.ExecuteNonQuery();
MessageBox.Show(output.Value.ToString());
Run Code Online (Sandbox Code Playgroud)
SP中的SQL是错误的.你可能想要
Select @code = RecItemCode from Receipt where RecTransaction = @id
Run Code Online (Sandbox Code Playgroud)
在您的语句中,您没有设置@code,您正在尝试将其用于RecItemCode的值.这可以解释您NullReferenceException何时尝试使用输出参数,因为永远不会为其分配值,并且您将获得默认的null.
另一个问题是你的SQL语句是否被重写为
Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id
Run Code Online (Sandbox Code Playgroud)
它混合了变量赋值和数据检索.这突出了几点.如果除了数据的其他部分之外还需要驱动@code的数据,请忘记输出参数并只选择数据.
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id
Run Code Online (Sandbox Code Playgroud)
如果您只需要代码,请使用我向您展示的第一个SQL语句.关于实际需要输出和数据的随机机会,请使用两个不同的语句
Select @code = RecItemCode from Receipt where RecTransaction = @id
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id
Run Code Online (Sandbox Code Playgroud)
这应该将您的值赋给输出参数以及连续返回两列数据.然而,这让我觉得非常多余.
如果您按照我在最顶部显示的那样编写SP,只需调用cmd.ExecuteNonQuery();然后读取输出参数值即可.
您的SP和代码的另一个问题.在您的SP中,您已将@code声明为varchar.在代码中,将参数类型指定为Int.更改SP或代码以使类型保持一致.
另请注意:如果您所做的只是返回一个值,那么还有另一种方法可以完全不涉及输出参数.你可以写
Select RecItemCode from Receipt where RecTransaction = @id
Run Code Online (Sandbox Code Playgroud)
然后使用object obj = cmd.ExecuteScalar();获取结果,不需要SP或代码中的输出参数.
| 归档时间: |
|
| 查看次数: |
110151 次 |
| 最近记录: |