从C#调用存储过程时为什么会出错?

时间:2017-05-03 06:11:29

标签: c#

我是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

2 个答案:

答案 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);