我是C#的新手,我在SQL Server中有一个存储过程:
Traceback (most recent call last):
File "<console>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/pyproject/mysite/tmp/pic.jpg'
并尝试使用此代码调用:
DECLARE @return_value int
EXEC @return_value = [dbo].[sp_getUserInfo]
@TelNo = N'2537743007'
SELECT 'Return Value' = @return_value
GO
但是我收到了错误:
System.IndexOutOfRangeException:return_value
at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName) 在System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
在System.Data.SqlClient.SqlDataReader.get_Item(String name)
在ConsoleApplication1.Program.Main(String [] args)
我该如何解决?感谢。
这是我在SQL Server中的存储过程:link to code
答案 0 :(得分:1)
好吧,从你在T-SQL中如何调用这个存储过程的代码中看来,似乎是通过 RETURN 声明 - 不作为结果集(SELECT ....
)。
<击>
因此,您需要阅读存储过程的返回值 - 而不是使用ExecuteReader()
的结果集:
using (SqlCommand cmd = new SqlCommand("sp_getUserInfo", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@TelNo", SqlDbType.NVarChar).Value = "253774300";
con.Open();
// get the value from the RETURN statement in the stored procedure
int returnValue = cmd.ExecuteNonQuery();
Console.WriteLine("Return value: {0}", returnValue);
}
击> <击> 撞击>
咨询存储过程代码后 更新,结果 实际上是由SELECT
(作为结果集)返回的 - 所以你< strong>需要才能使用ExecuteReader
- 但该列没有名称,您无法使用以下方式访问它:
while (reader.Read())
{
Console.WriteLine(reader["return_value"].ToString());
}
但您需要使用数字索引:
while (reader.Read())
{
Console.WriteLine(reader[0].ToString());
}
答案 1 :(得分:0)
如果您的存储过程只返回一个值,则使用var res = cmd.ExecuteScalar();
而不是reader = cmd.ExecuteReader();
。
但是如果您的存储过程返回表,那么使用SqlDataAdapter
和您当前的命令一样SqlDataAdapter DA = new SqlDataAdapter(cmd);
然后DA.Fill(dt);