2017-05-03 54 views
2

我是新的C#和我在SQL Server中的存储过程:为什么从C#调用存储过程时出现错误?

DECLARE @return_value int 

EXEC @return_value = [dbo].[sp_getUserInfo] 
     @TelNo = N'2537743007' 

SELECT 'Return Value' = @return_value 

GO 

,并尝试调用此代码:

using (SqlConnection con = new SqlConnection("Data Source=SERVICE;Initial Catalog=InvokeADSL;Integrated Security=True")) 
{ 
    using (SqlCommand cmd = new SqlCommand("sp_getUserInfo", con)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     //cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text; 
     cmd.Parameters.Add("@TelNo", SqlDbType.NVarChar).Value = "253774300"; 

     con.Open(); 

     reader = cmd.ExecuteReader(); 

     while (reader.Read()) 
     { 
      Console.WriteLine(reader["return_value"].ToString()); 
     } 
    } 
} 

,但我得到一个错误:

System.IndexOutOfRangeException: return_value
at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName) at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
at System.Data.SqlClient.SqlDataReader.get_Item(String name)
at ConsoleApplication1.Program.Main(String[] args)

我该如何解决?谢谢。

这是SQL Server我的存储过程:link to code

+0

此异常意味着你试图通过索引来访问集合项目,使用无效索引。当索引低于集合的下限或大于或等于其包含的元素数量时,索引无效。 –

+0

@KingReload如何处理收集? –

+0

使用索引位置而不是名称。阅读器[0] .ToString() – Thangadurai

回答

1

嘛,从你作为展示如何呼叫在T-SQL这个存储过程的代码,它似乎正在返回的值从存储过程通过返回声明 - 而不是作为结果集(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(作为结果集)返回 - so你确实需要使用ExecuteReader - 但该列只是没有一个,你因此不能使用访问:

while (reader.Read()) 
{ 
    Console.WriteLine(reader["return_value"].ToString()); 
} 

,但你需要,而不是使用数字索引:

while (reader.Read()) 
{ 
    Console.WriteLine(reader[0].ToString()); 
} 
+0

只是好奇,“似乎值是通过一个RETURN语句从存储过程返回”代码如何给出这个提示..我没有得到那种氛围。 – loneshark99

+0

当我在SQL服务器中运行该sp返回值= 0,并与您的代码返回值= -1运行时,会发生什么? –

+0

@ loneshark99:因为:'EXEC @return_value = [dbo]。[sp_getUserInfo]'然后'SELECT'返回值'= @ return_value' - 这是'RETURN'返回的值,他显示了.... –

0

如果您的存储过程只是返回一个值,则使用var res = cmd.ExecuteScalar();而不是reader = cmd.ExecuteReader();
但如果你的存储过程返回表,然后使用SqlDataAdapter与您当前的指令这样SqlDataAdapter DA = new SqlDataAdapter(cmd);然后DA.Fill(dt);

+0

得到这个输出字节[] –

+0

在你的代码中,你可以将它转换为int '像这样'int res =(int)cmd.ExecuteScalar();' –

相关问题