2016年3月9日 星期三

C# Oracle Client 執行多行SQL回傳影響列數為-1 | C# Oracle Client execute multiple line sql number of rows affected return -1

問題:
當執行多行ORACLE SQL、如BEGIN ...END,或者MERGE INTO等指令時會,
ExecuteNonQuery()都只會回傳-1,這樣就無法看出影響列數

解決方法參考
http://stackoverflow.com/questions/32138843/merge-query-returns-1-instead-of-number-of-rows-merged

原本的SQL加上一段
:num := sql%rowcount;
且增加一個OUTPUT變數
OracleCommand cmd = new OracleCommand(sql, myConnection);
  var p = cmd.Parameters.Add(":num", OracleDbType.Int32, ParameterDirection.Output);
  cmd.ExecuteNonQuery();
  Console.WriteLine("Rows affected: " + p.Value);
執行之後讀取變數的值即可得到影響列數

-----------
寫成int回傳方法時
舊的System.Data.OracleClient裡面我這樣寫轉換:
count = (int)p.Value;
是可以跑的,但在新的Oracle.DataAccess.Client裡面
我要這樣轉換
(參考: http://stackoverflow.com/questions/3026036/convert-oracleparameter-value-to-int32 )
Convert.ToInt32((decimal)(OracleDecimal)(cmd.Parameters["successCount"].Value))
轉換時才不會出現InvalidCastException

沒有留言:

張貼留言