2013-08-18 25 views
0

與輸出參數執行MySQL的存儲過程我有這個存儲過程與輸出參數不能在asp.net

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_count_rows`(OUT total int) 
BEGIN 
    SELECT COUNT(*) 
    FROM address_book.persons; 
END 

我想在asp.net頁面中使用它。我寫這背後代碼:

 string commandText = "usp_count_rows"; 
    MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["mySqlString"].ConnectionString); 
    MySqlCommand cmd = null; 

    try 
    { 

     cmd = new MySqlCommand(commandText, conn); 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add("total", MySqlDbType.Int32); 
     cmd.Parameters["total"].Direction = ParameterDirection.Output; 

     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     int total = (int)cmd.Parameters["?total"].Value; 

    } 
    catch (MySqlException ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
     conn.Clone(); 
    } 

和我得到這個錯誤信息

指定的轉換是無效的。

FOT線

INT總=(int)的cmd.Parameters [ 「總?」]值。

我該怎麼做才能使代碼正常工作。另一件事我不想在aspx頁面中使用結果。像這樣:總行數:(來自存儲過程的結果)。你有什麼建議嗎?

回答

0

發生這種情況是因爲您的SP不返回任何參數,只是查詢的結果。而對於這樣的存儲過程,你不需要任何參數 - 即使是輸出的,所以重新定義您的SP簡單

CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_count_rows` 
BEGIN 
    SELECT COUNT(*) 
    FROM address_book.persons; 
END 

然後在你的C#擺脫線(完全刪除)的:

cmd.Parameters.Add("total", MySqlDbType.Int32); 
cmd.Parameters["total"].Direction = ParameterDirection.Output; 

和替換這些行:

cmd.ExecuteNonQuery(); 
int total = (int)cmd.Parameters["?total"].Value; 

與這一個行:

int total = Convert.ToInt32(cmd.ExecuteScalar()); 

ExecuteScalar方法執行您的SP /查詢並返回該查詢的第一行的第一列(在您的情況下,它將是唯一的列和Count(*)唯一的行)。

哦,順便說一句,你的Finally塊應該是conn.Close()不是conn.Clone(),但我認爲它很簡單。

至於在ASPX頁面上顯示結果 - 根據您想要顯示的位置和方式,有多種方式。例如,你可以添加一個標籤控件到你的頁面並執行如下所示的操作:

Label1.Text = "Total number of rows: " + total.ToString(); 
+0

我試過了,但我又得到了:「指定的轉換無效」。 – PUDEV

+0

如果你自己在代碼之外運行它,你能驗證查詢/ sp的結果嗎? –

+0

此外,只是一個想法,但可能直接從ExecuteScalar的結果轉換爲int是不可能的,請嘗試'int total = Convert.ToInt32(cmd.ExecuteScalar());'而不是。我用這一行更新了我的答案 –