[英]SqlCommand.ExecuteNonQuery() not throwing expected error in VB.net
[英]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.