2017-05-03 62 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();' –

相關問題