2014-07-06 31 views
0

我一直在尋找一段時間,但我發現的答案通常涉及存儲過程或不同的功能。.Net MySql用戶定義的變量作爲輸出參數

我想執行一個閱讀器,並返回一個標量在一個查詢。我想我可以使用輸出參數來做到這一點,但我得到一個異常來檢查我的語法附近NULL = @rows_found(),所以它看起來輸出參數沒有得到初始化。

基本上我需要知道這是否可能,因爲我還沒有找到像這樣的代碼示例。

command.CommandText = @" 
    SELECT SQL_CALC_FOUND_ROWS 
     accounting.* 
    FROM 
     accounting 
    WHERE 
     transaction_type = @transaction_type 
    LIMIT 
     @index, @results; 

    SET @total_rows = FOUND_ROWS(); 
"; 

command.Parameters.AddWithValue("transaction_type", transaction_type); 
command.Parameters.AddWithValue("index", index); 
command.Parameters.AddWithValue("results", results); 

MySqlParameter totalRows = new MySqlParameter("total_rows", 0); 
totalRows.Direction = System.Data.ParameterDirection.Output; 
command.Parameters.Add(totalRows); 

using (MySqlDataReader dr = command.ExecuteReader()) 
{ 
    while (dr.Read()) 
     invoices.Add(new AccountingDataModel(dr)); 
} 

invoices.Total = (int)totalRows.Value; 

回答

0
cmd.Parameters["@output"].Value.ToString() 

使用命令對象來訪問你的輸出參數.... 你不能直接訪問了perameter。

你應該使用像

invoices.Total = Convert.ToInt32(command.Parameters["total_rows"].Value.ToString()) 

例如存儲過程

MySqlCommand cmd = new MySqlCommand(nameOfStoredRoutine, connection);  
cmd.CommandType = CommandType.StoredProcedure;  

//input parameters 

for (int i = 0; i < (parameterValue.Length/2); i++) 
{ 
    cmd.Parameters.AddWithValue(parameterValue[i, 0], parameterValue[i, 1]); 
    cmd.Parameters[parameterValue[i, 0]].Direction = ParameterDirection.Input; 
    parameterList = parameterList + parameterValue[i,0] + " " + parameterValue[i,1] + " "; 
    } 

    //single output parameter 
    cmd.Parameters.AddWithValue("@output", MySqlDbType.Int32); 
    cmd.Parameters["@output"].Direction = ParameterDirection.Output; 

    cmd.ExecuteNonQuery(); //Execute command 


    return Convert.ToInt32(cmd.Parameters["@output"].Value.ToString()); 
+0

它實際上沒有那麼遠。從我讀的內容來看,輸出參數在datareader關閉時被綁定,這是發生異常的地方。再一次,您提供的答案是存儲過程。我懷疑你不能使用沒有存儲過程的輸出參數,但還沒有能夠在任何地方進行確認。 – crazyhor77

0

看來,這是不可能的。從MySqlParameter's membersDirection屬性的文檔:

獲取或設置一個值,指示參數是僅用於輸入,輸出專用,雙向或存儲過程返回值參數。從MySQL 4.1及更早版本開始,僅有輸入是唯一有效的選擇。

所以參數是,無論你設置Direction來,始終輸入參數。如果從null值更改爲別的(如15),你應該看到的是,生成的查詢是一樣的東西

SET 15 = FOUND_ROWS() 

我最終結束了運行兩個查詢。這可能不是性能,但至少可以得到所需的結果(使用EF Core):

using (var context = new MyDbContext(...)) 
{ 
    context.Database.OpenConnection(); 
    var estates = context.MySet 
     .FromSql("SELECT SQL_CALC_FOUND_ROWS * FROM myset LIMIT 25 OFFSET 25") 
     .ToList(); 

    var cmd = context.Database.GetDbConnection().CreateCommand(); 
    cmd.CommandText = "SELECT FOUND_ROWS()"; 

    var rows = (long)cmd.ExecuteScalar(); 
    context.Database.CloseConnection(); 
} 
相關問題