[英]C# Catch OracleException vs General Exception
我正在更新之前項目的代碼。 我想在SQL命令中捕獲任何問題,所以我在SQL查詢的開頭放了一個“X”。 在Microsoft中,通常SqlException會捕獲此類問題。 在下面的代碼中,我得到了一般的Exception而不是OracleException。 我有正確的例外,如果是這樣,為什么不解雇?
public static string getSKUByPONumber(string poNumber)
{
Logging.logMethodStart("getSKUByPONumber poNumber=" + poNumber);
string rt = "";
string sql = "x select i.segment1 || '.' || i.segment2 " +
" from po_headers_all h " +
" inner join po.po_lines_all l on( h.po_header_id = l.po_header_id ) " +
" inner join inv.mtl_system_items_b i on( l.item_id = i.inventory_item_id ) " +
" where h.segment1 = '" + poNumber.Trim() + "'";
try
{
rt = getOracleSingleValue(sql);
}
catch (OracleException ex)
{
string errMsg = "OracleException: getSKUByPONumber failed with error code: " + ex.Message + " Sql=" + sql;
Logging.logHelperError("getSKUByPONumber", ex.Message);
Logging.TraceWriteLine(errMsg);
throw new Exception(errMsg);
}
catch (Exception ex)
{
Logging.logHelperError("getSKUByPONumber", ex.Message);
throw new Exception("getSKUByPONumber failed with error code: " + ex.Message + " Sql=" + sql );
}
Logging.logMethodEnd("getSKUByPONumber poNumber=" + poNumber + " sku=" + rt);
return rt;
}
修改后的代碼:
public static string getOracleSingleValue(string sql)
{
OracleConnection conn = Config.GetOracleSqlconnection();
string rt = "";
try
{
DataSet ds = new DataSet();
OracleDataAdapter adapter = new OracleDataAdapter(sql, conn);
OracleCommandBuilder builder = new OracleCommandBuilder(adapter);
adapter.Fill(ds, "data");
if (ds.Tables["data"].Rows.Count > 0)
{
DataRow row = ds.Tables["data"].Rows[0];
rt = row[0].ToString();
}
}
catch (SqlException ex)
{
Logging.logHelperError("getOracleSingleValue: SqlException:", ex.Message);
throw new Exception("getOracleSingleValue failed with SqlException: " + ex.Message);
}
catch (Exception ex)
{
Logging.logHelperError("getOracleSingleValue", ex.Message);
throw new Exception("getOracleSingleValue failed with error code: " + ex.Message);
}
finally
{
conn.Close();
conn.Dispose();
}
return rt;
}
public static string getSKUByPONumber(string poNumber)
{
Logging.logMethodStart("getSKUByPONumber poNumber=" + poNumber);
string rt = "";
string sql = "x select i.segment1 || '.' || i.segment2 " +
" from po_headers_all h " +
" inner join po.po_lines_all l on( h.po_header_id = l.po_header_id ) " +
" inner join inv.mtl_system_items_b i on( l.item_id = i.inventory_item_id ) " +
" where h.segment1 = '" + poNumber.Trim() + "'";
try
{
rt = getOracleSingleValue(sql);
}
catch (SqlException ex)
{
string errMsg = "SqlException: getDropShipFlag failed with error code: " + ex.Message + " sql=" + sql;
Logging.TraceWriteLine(errMsg);
Logging.logHelperError("getDropShipFlag", ex.Message);
throw new Exception(errMsg);
}
catch (Exception ex)
{
string innerExMessage = "";
if (ex.InnerException != null)
{
innerExMessage = ex.Message + " Internal Exception:" + ex.InnerException;
}
Logging.logHelperError("getDropShipFlag", ex.Message + innerExMessage);
throw new Exception("Exception: getDropShipFlag failed with error code: " + ex.Message);
}
Logging.logMethodEnd("getSKUByPONumber poNumber=" + poNumber + " sku=" + rt);
return rt;
}
最后的錯誤是:
{“異常:getSKUByPONumber失敗,錯誤代碼:getOracleSingleValue失敗,錯誤代碼:ORA-00900:無效的SQL語句”}
問題是你正在調用自己的getOracleSingleValue()例程。 此例程必須拋出異常以捕獲任何異常。 這看起來像我懷疑的自定義(非Oracle)功能。 檢查一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.