簡體   English   中英

ExecuteNonQuery 卡住而不拋出錯誤

[英]ExecuteNonQuery stuck without throwing error

這一定是一個愚蠢的問題,但不知道我的代碼有什么問題
我正在嘗試在 oracle 數據庫中插入一些數據,這是我的一段代碼

try
{                
  OracleConnection con= new OracleConnection("Data Source=ANTI01T.world ;User Id=MyDB;Password=XYZ123 ;");
  con.Open();
  OracleCommand cmd = new OracleCommand();
  cmd.Connection =con;
  cmd.CommandText = query;
  cmd.CommandType = CommandType.Text;
  cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
  MessageBox.Show(ex.Message);
}  

查詢在哪里

string query = @"INSERT INTO TB_RULE_HISTORY
                                (   N_RULE_ID,
                                    N_RULE_VERSION,
                                    DT_START_DATE,
                                    DT_END_DATE,
                                    N_CURRENCY_ID,
                                    N_VALUE1,
                                    N_VALUE2,
                                    N_PERCENTAGE,
                                    N_MONTHS)
                                    VALUES(" 
                                    + pRuleId.ToString() + " , "
                                    + pRuleVersion.ToString() + " , '"
                                    + DateTime.Now.Date.ToString("dd/MMM/yy") + "' , '"
                                    + pEndDate.ToString("dd/MMM/yy") + "' , "
                                    + pCurrencyId.ToString()+ " , "
                                    + pValue1.ToString()+ " , "
                                    + pValue2.ToString()+ " , "
                                    + pPercentage.ToString()+ " , "
                                    + pMonths.ToString() + ")";    

代碼沒有拋出任何錯誤,它卡住了不知道在哪里
我所做的可能檢查是我通過引用Link1從查詢中刪除分號,因為執行查詢時使用 ; 給出 ORA-00911: 無效字符,但現在它沒有拋出任何錯誤只是被卡住了。
也沒有使用中的事務。
請建議可能的方法來追蹤它

首先獲取字符串查詢的值,然后在Oracle中運行它。 您有一些用單引號引起來的字符串值,而有些則沒有,例如pValue1,pValue2。 我將從您的字符串查詢中獲取實際的插入,然后運行該插入。

如果腳本有時出現問題,Oracle將掛起並且不執行任何操作。 這可以通過在PL SQL命令窗口中運行無效的腳本來看到。 它掛在那里等待響應。

其次,您是否在PL SQL中以與連接字符串相同的ID運行插入? 如果不是這樣,則需要在插入內容之前添加SCHEMA名稱,例如INSERT INTO SCHEMAX.TABLE_NAME。 正如其他人所述,沒有適用於SQL Server的Oracle初始目錄。

您的字符串值可能有問題,您可以嘗試使用參數嗎? 它可以解決字符串值的問題,並且...出於多種原因使用參數是一種常見的做法

string query = "INSERT INTO TB_RULE_HISTORY
(   
N_RULE_ID,
N_RULE_VERSION,
DT_START_DATE,
DT_END_DATE,
N_CURRENCY_ID,
N_VALUE1,
N_VALUE2,
N_PERCENTAGE,
N_MONTHS)
VALUES(:pRuleId
,:pRuleVersion
,:pDateTimeStart
,:pDateTimeEnd
,:pCurrencyId
,:pValue1
,:pValue2
,:pPercentage
,:pMonths)";    


try
{                
  OracleConnection con= new OracleConnection("Data Source=ANTI01T.world ;User Id=AML_UAT;Password=AML_UAT;");
  con.Open();
  OracleCommand cmd = new OracleCommand();
  cmd.Connection =con;
  cmd.CommandText = query;
  cmd.CommandType = CommandType.Text;

  cmd.Parameters.AddWithValue("pRuleId", pRuleId);
  cmd.Parameters.AddWithValue("pRuleVersion", pRuleVersion);

  ...

  cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
  MessageBox.Show(ex.Message);
}  

在傳遞帶有字符串值的日期並將連接隱式轉換為DATE類型時,連接上的NLS日期格式可能會出現問題。

對於長期實施而言,依靠隱式轉換總是很危險的,對於日期格式(由於環境設置,您的代碼可以在一個部署的實例上工作而在另一個實例上不能工作)的日期格式,則尤其危險。

因此,將日期字符串放入SQL TO_DATE()函數中,並顯式指定格式。 我還建議使用四位數的年份來輸入任何歷史日期(出生日期等)或將來的日期,以使數據庫猜測不知道數據上下文會導致錯誤結果的世紀。

string query = @"INSERT INTO TB_RULE_HISTORY
                                (   N_RULE_ID,
                                    N_RULE_VERSION,
                                    DT_START_DATE,
                                    DT_END_DATE,
                                    N_CURRENCY_ID,
                                    N_VALUE1,
                                    N_VALUE2,
                                    N_PERCENTAGE,
                                    N_MONTHS)
                                    VALUES(" 
                                    + pRuleId.ToString() + " , "
                                    + pRuleVersion.ToString() + " ,  TO_DATE('"
                                    + DateTime.Now.Date.ToString("dd/MMM/yy") + "','dd/mm/yy') , TO_DATE('"
                                    + pEndDate.ToString("dd/MMM/yy") + "','dd/mm/yy') , "
                                    + pCurrencyId.ToString()+ " , "
                                    + pValue1.ToString()+ " , "
                                    + pValue2.ToString()+ " , "
                                    + pPercentage.ToString()+ " , "
                                    + pMonths.ToString() + ")";    

我有同樣的問題。 就我而言,我從另一個系統連接到我的數據庫,並向現有表中添加了一些列。

之后為了驗證和檢查,我添加了一些新行,刪除了一些行等,同時我正在從另一個系統調試/執行我的代碼。

結果,它在執行delete from tablename時卡在cmd.ExecutenNonQuery() delete from tablename

所以從另一台PC(我登錄到我的數據庫的地方),我試圖退出數據庫。

哪里被問到你所做的交易沒有改變..

你想承諾嗎? 還是回滾??

我選擇了提交。 然后我回到我的代碼並執行它。 之后沒有進一步掛在ExecuteNonQuery

結論:數據庫中的事務有問題

我發現的問題是由於我的oracle事務不是自動提交。
因此,它被絞死了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM