2015-05-06 116 views
0

我需要找到在C#中的記錄,但我得到一個InvalidOperationException:使用OleDbCommand的Select語句拋出InvalidOperationException異常

public static Auto findAuto(int kfznr) 
{ 
    Auto retAuto = new Auto(); 
    try 
    { 
     myOleDbConnection.Open(); 
     string query = "SELECT * FROM Auto WHERE Auto.KFZNR = " + kfznr; 

     OleDbCommand select = new OleDbCommand(); 
     select.Connection = myOleDbConnection; 
     select.CommandText = query; 
     OleDbDataReader reader = select.ExecuteReader(); 

     while (reader.Read()) 
     { 
      Auto at = new Auto(Convert.ToInt32(reader[0]), Convert.ToString(reader[1]), Convert.ToString(reader[2])); 

      retAuto = at; 
     } 
    } 
    catch (OleDbException e) 
    { 

     Console.WriteLine(e.ToString()); 
    } 

    return retAuto; 
} 

我得到了while循環的錯誤在創建新的自動的。 當我在SQLDeveloper中運行相同的查詢時,我得到一條記錄(查看第一個屏幕截圖),但在我的C#程序中,我得到的行數/單元沒有數據。

The output from the SQLDeveloper

當我徘徊讀者我獲得下面的圖片。它說,讀者有行: Screenshot from Visual Studio

希望你能幫我解決這個問題。

+0

行列中的某一列是否可能爲空?這是Oracle嗎?如果列中有一個空字符串,它會返回null嗎? –

+2

通過連接字符串編寫查詢是不好的做法,請使用參數來避免將惡意腳本注入數據庫。順便說一句,你不需要你的第一個自動課程。 –

回答

2

您需要使用reader.GetValue(0)

public static Auto findAuto(int kfznr) 
    { 
     Auto retAuto = new Auto(); 
     try 
     { 
      myOleDbConnection.Open(); 
      string query = "SELECT * FROM Auto WHERE Auto.KFZNR = " + kfznr; 

      OleDbCommand select = new OleDbCommand(); 
      select.Connection = myOleDbConnection; 
      select.CommandText = query; 
      OleDbDataReader reader = select.ExecuteReader(); 

      while (reader.Read()) 
      { 
       Auto at = new Auto(Convert.ToInt32(reader.GetValue(0)), Convert.ToString(reader.GetValue(1)), Convert.ToString(reader.GetValue(2))); 

       retAuto = at; 
      } 
     } 
     catch (OleDbException e) 
     { 

      Console.WriteLine(e.ToString()); 
     } 

     return retAuto; 
    } 

也想添加...你可以通過列名使用訪問閱讀器的值,以及:

讀者[ 「的ColumnName」 ] ...不要忘記列名稱周圍的「」;)

public static Auto findAuto(int kfznr) 
{ 
    Auto retAuto = new Auto(); 
    try 
    { 
     myOleDbConnection.Open(); 
     string query = "SELECT * FROM Auto WHERE Auto.KFZNR = " + kfznr; 

     OleDbCommand select = new OleDbCommand(); 
     select.Connection = myOleDbConnection; 
     select.CommandText = query; 
     OleDbDataReader reader = select.ExecuteReader(); 

     while (reader.Read()) 
     { 
      Auto at = new Auto(Convert.ToInt32(reader["col1"]), Convert.ToString(reader["col2"]), Convert.ToString(reader["col3"])); 

      retAuto = at; 
     } 
    } 
    catch (OleDbException e) 
    { 

     Console.WriteLine(e.ToString()); 
    } 

    return retAuto; 
} 
相關問題