2017-03-31 11 views
1

第一篇文章在這裏。我試圖創建一個從Oracle數據庫提取數據並返回一些表的網站。我能夠連接我的數據庫並創建了一個DataConnector,它返回一個CodeDesc對象的列表。我現在的主要問題是簡單地將數據顯示在屏幕上,最好是以下拉列表的形式顯示,但我現在使用GridView顯示查詢輸出到屏幕的C#asp.NET。錯誤:Oracle.DataAccess.dll中的'System.ArgumentException'

這裏是我的前端:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    DataConnector dc = new DataConnector(); 
    GridView2.DataSource = dc.getCodeTypes(); 
    GridView2.DataBind(); 
} 

當我點擊該按鈕時,會產生什麼和調試器只說「拋出異常:‘System.ArgumentException’在Oracle.DataAccess.dll」任何幫助將是讚賞。這是我第一次進行網絡開發,並且一直在努力爭取到這一點。我使用Visual Studio 2015年

後端:

//Create datatable to get info from db & return results 
public List<CodeDesc> getCodeTypes() 
{ 
    try 
    { 
     OracleConnection con = new OracleConnection(connString); 
     con.Open(); 

     string query = "select id, descr from code_desc where code_type_id = 0"; 

     // Create the OracleCommand 
     OracleCommand cmd = new OracleCommand(); 

     cmd.Connection = con; 
     cmd.CommandType = CommandType.Text; 

     // Execute command, create OracleDataReader object 
     OracleDataReader reader = cmd.ExecuteReader(); 

     List<CodeDesc> L = new List<CodeDesc>(); 

     while (reader.Read()) 
     { 
      CodeDesc c = new CodeDesc(); 
      c.id = reader.GetInt32(0); 
      c.description = reader.GetString(1); 
      L.Add(c); 
     } 
     // Clean up 
     reader.Dispose(); 
     cmd.Dispose(); 
     con.Dispose(); 

     System.Diagnostics.Debug.WriteLine(L); 
     return L; 
    } 
    catch (Exception ex) 
    { 
     // catch clause here... 
    } 
} 

CodeDesc:

public class CodeDesc 
{ 
    public int id { get; set; } 
    public string description { get; set; } 
} 

任何幫助將是巨大的。

+0

看看你的錯誤的內部異常。它包含更多錯誤的詳細信息 – tomcater

+0

您從不將查詢字符串設置爲要執行的CommandText。不好。 – Steve

回答

0

您從不將查詢字符串設置爲OracleCommand的CommandText屬性。當然,當你嘗試執行你的命令時,這隻會導致異常。

說的是,記住每個可丟棄的對象應該被包含在一個using語句中。這是非常重要的情況下,因爲正確的關閉和處理自動退出使用塊

public List<CodeDesc> getCodeTypes() 
{ 
    try 
    { 
     List<CodeDesc> L = new List<CodeDesc>(); 
     string query = "select id, descr from code_desc where code_type_id = 0"; 
     using(OracleConnection con = new OracleConnection(connString)) 
     using(OracleCommand cmd = new OracleCommand(query, con)) 
     { 
      con.Open(); 
      // Execute command, create OracleDataReader object 
      using(OracleDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        CodeDesc c = new CodeDesc(); 
        c.id = reader.GetInt32(0); 
        c.description = reader.GetString(1); 
        L.Add(c); 
       } 
      } 
     } 
     System.Diagnostics.Debug.WriteLine(L); 
     return L; 
    } 
+0

感謝您的回覆,但我仍然有點困惑。看看你的代碼,你在哪裏設置查詢字符串的CommandText屬性?我沒有這樣做,「cmd.CommandType = CommandType.Text;」行?無論如何,改變我的代碼以包含你提供的簡介給我提出了同樣的問題。 – Kuro

+0

不,CommandType通知OracleCommand是否正在執行文本查詢或存儲過程,默認情況下已經是CommandType.Text。可能你的意思是cmd.CommandText。在任何情況下,當我構建OracleCommand時,我使用構造函數來接收要執行的命令文本和連接(避免兩行代碼_cmd.CommandText = query; cmd.Connection = con; _) – Steve

+0

並關於錯誤。嘗試查看Exception.InnerException屬性(單擊查看郵件上的詳細信息)通常,此屬性包含使問題更清晰的其他信息。 – Steve