Reputation: 197
I'm new to C# and I have a stored procedure in SQL Server:
DECLARE @return_value int
EXEC @return_value = [dbo].[sp_getUserInfo]
@TelNo = N'2537743007'
SELECT 'Return Value' = @return_value
GO
and try call that with this code:
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());
}
}
}
but I get an error:
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)
How can I solve that? Thanks.
This is my stored procedure in SQL Server: link to code
Upvotes: 2
Views: 1337
Reputation: 2719
If your stored procedure just returns one value then use var res = cmd.ExecuteScalar();
instead of reader = cmd.ExecuteReader();
.
But if your stored procedure return table then use SqlDataAdapter
with your current command like this SqlDataAdapter DA = new SqlDataAdapter(cmd);
and then DA.Fill(dt);
Upvotes: 0
Reputation: 754598
Well, from the code you're showing as to how to call this stored procedure in T-SQL, it seems that the value is being returned from the stored procedure via a RETURN statement - not as a result set (SELECT ....
).
Therefore, you need to read the return value of the stored procedure - not a result set using 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);
}
Update: after consulting the stored procedure code, the result is in fact being returned by a SELECT
(as a result set) - so you do need to use ExecuteReader
- but that column just doesn't have a name, you so cannot access it using :
while (reader.Read())
{
Console.WriteLine(reader["return_value"].ToString());
}
but you need to instead use the numerical index:
while (reader.Read())
{
Console.WriteLine(reader[0].ToString());
}
Upvotes: 1