2013-06-20 89 views
2

我想要根據id_curse刪除整行時遇到問題。這是我的代碼,這是我得到的錯誤:如何從C#中的Oracle數據庫中刪除一行?

Oracle.DataAccess.dll中出現未處理的「Oracle.DataAccess.Client.OracleException」類型異常。

其他信息:

外部組件引發的異常。

你能幫我解決這個問題嗎?我認爲來自SQL命令的代碼對此並不好。

private void button3_Click(object sender, EventArgs e) 
{ 
    Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(provider); 
    Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand(); 

    conn.Open(); 
    cmd = new Oracle.DataAccess.Client.OracleCommand(" DELETE * from CURSE WHERE ID_CURSA = '" + textBox1.Text + "'", conn); 
    cmd.ExecuteNonQuery(); 
} 
+2

你的代碼非常不安全!請閱讀SQL注入和如何防範它。 – Arran

+0

什麼是innerexception? –

回答

9

的DELETE語法如下

DELETE from CURSE WHERE ID_CURSA = xxxxx 
    ^no * here 

但是,你應該使用參數化查詢不字符串連接。字符串連接導致Sql Injection和分析問題(字符串引號,小數和日期無法識別)

string cmdText = "DELETE from CURSE WHERE ID_CURSA = :ID" 
using(OracleConnection conn = new OracleConnection(provider)) 
using(OracleCommand cmd = new OracleCommand(cmdText, conn)) 
{ 
    conn.Open(); 
    cmd.Parameters.AddWithValue("ID", textBox1.Text); 
    cmd.ExecuteNonQuery(); 
} 

作爲一個側面說明,你確認ID_CURSA是一個文本數據庫字段? (你把引號的價值,所以我認爲這是一個文本字段)

+1

+1爲正確的解決方案和屏蔽sql注入 –

0

擺脫你的代碼的try-catch-finally語句捕獲異常,看看什麼地方出了錯更多詳細信息:

private void button3_Click(object sender, EventArgs e) 
{ 
    Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(provider); 
    Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand(); 

    try 
    { 
     conn.Open(); 
     cmd = new Oracle.DataAccess.Client.OracleCommand(" DELETE * from CURSE WHERE ID_CURSA = '" + textBox1.Text + "'", conn); 
     cmd.ExecuteNonQuery(); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
     if(ex.InnerException != null) 
      MessageBox.Show(ex.InnerException.Message); 
    } 
    finally 
    { 
     conn.Close(); 
    } 
} 
相關問題