2017-02-11 153 views
0

要開始我沒有對數據庫的訪問,我們遇到的問題與我校帳戶,並等待它復位。怎麼我曾經有一個是給我一些問題,坦率地說我不知道​​我甚至去了解這個以正確的方式代碼。C#創建和填充Oracle數據庫

我只是試圖讓創建一個表,然後填充它讀取它一個簡單的測試程序。

如果這是不夠的信息,我很抱歉,我應該等待,但其竊聽我得到的代碼,這些小錯誤之前,我甚至得到一個點我可以編譯測試的明天。

下面是創建該表的代碼,似乎沒有要在代碼

static void buildTable() 
    { 
     try 
     {     
      string sqlBuild = "CREATE TABLE Item (" 
           + "Item_ID VARCHAR2(1)," 
           + "Item_Name VARCHAR2(16)," 
           + "Price_Consumer VARCHAR(5)" 
           + "); "; 
      OracleCommand cmd = new OracleCommand(sqlBuild, con); 
      Connect(); 
      cmd.ExecuteNonQuery(); 
      Close(); 
     } 
     catch (Exception e) 
     { 

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

這裏的任何錯誤是填充表的代碼,這就是我收到的錯誤。

 static void populateTable() 
    { 
     string[,] items; 
     items = new string[5,3] { { "1", "Mozzarella", "9.99" }, { "2", "Peperoni", "12.99" }, { "3", "Meat Feast", "14.99" }, { "4", "Chicken Tikka", "12.99" }, { "5", "Spicy Vegetarian", "11.99" } }; 
     try 
     { 
      OracleCommand cmd = new OracleCommand(); 
      OracleDataReader r = cmd.ExecuteReader(); 
      r.Read(); 
      for (int i = 1; i < 6; i++) 
      { 
       for(int j = 1; j < 4; j++) 
       { 
        OracleCommand comd = new OracleCommand(); 
        comd.Connection = con; 
        comd.CommandText = "insert into Item(Item_ID, Item_Name, Price_Consumer) values(" items[i, j].ToString() + ", " + items[i, j].ToString() + ", " + items[i, j].ToString() ");"; 
        Connect(); 
        comd.ExecuteNonQuery(); 
        Close(); 
       }      
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 
} 

的錯誤是在項目[I,J],它告訴我,它預計的「;」

最後這是接近100%的IM將作爲這個我已經在過去所做,但我從來沒有嘗試過用C#創建或填充一個表。

 static void itemList() 
    { 
     string s = "\n"; 
     try 
     { 
      Connect(); 
      OracleCommand cmd = new OracleCommand(sql, con); 
      OracleDataReader r = cmd.ExecuteReader(); 
      r.Read(); 
      while (r.Read()) 
      { 
       s = s + r["Item_ID"].ToString() + ", " + r["Item_Name"].ToString() + ", " + "£" +r["Price_Consumer"].ToString(); 

      } 
      Close(); 
      Console.WriteLine(s); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

這裏是addtional代碼,可能是相關

 static void Connect() 
    { 
     con = new OracleConnection(); 
     con.ConnectionString = "User Id=username;Password=password;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port))(CONNECT_DATA=(SERVICE_NAME=SID)))"; 
     con.Open(); 
     Console.WriteLine("Connected to Oracle" + con.ServerVersion); 
    } 

    static void Close() 
    { 
     con.Close(); 
     con.Dispose(); 
    } 

聲明

static OracleConnection con; 
    static string sql = "select * from Item"; 
+1

在你的INSERT INTO說法你缺少‘+’ –

+0

感謝我檢討了我意識到其中IW對不對。 –

+0

太棒了,請接受我的回答:) –

回答

2

你的內部循環的錯誤。當您嘗試插入一行時,不要每次插入一行插入,但每次插入一次插入一行

另一個問題是您的VARCHAR類型的列,這意味着您需要在那裏插入字符串,但是你沒有正確地做。 這可以解決將圍繞這些字符串單引號數據庫引擎被認爲是這樣的。

for (int i = 1; i < 6; i++) 
{ 
    comd.CommandText = @"insert into Item(Item_ID, Item_Name, Price_Consumer) 
         values('" + items[i, 0].ToString() + "', '" + 
         items[i, 1].ToString() + "', '" + 
         items[i, 2].ToString() '");"; 

但是,雖然這將適用於您的簡單示例,但這仍然是錯誤的。你不應該連接字符串來建立一個sql命令。這導致Sql Injection和解析錯誤,如果插入值包含一個單引號。

做的唯一正確途徑是通過參數化查詢,因爲這

comd.CommandText = @"insert into Item(Item_ID, Item_Name, Price_Consumer) 
           values(:ID, :Name, :Price)"; 

comd.Parameters.AddWithValue(":ID", items[i, 0].ToString()); 
comd.Parameters.AddWithValue(":Name",items[i, 1].ToString()); 
comd.Parameters.AddWithValue(":Price",items[i, 2].ToString()); 

(作爲一個附帶的好處,看看命令現在是如何更容易理解)

+0

.AddWithValue不包含在'OracleParameterCollection'中 –

+0

更好的是,我已經使用AddWithValue來簡化事情,但是您可以使用正常的Add方法編寫它,該方法採用DbType並設置值。 – Steve

1

此行是格式不正確,並缺席兩場+符號:

comd.CommandText = "insert into Item(Item_ID, Item_Name, Price_Consumer) values(" + 
    items[i, j].ToString() + ", " + 
    items[i, j].ToString() + ", " + 
    items[i, j].ToString() + ");"; 

如果你以同樣的方式把它分解到上述那麼容易發現不需要

1

你缺少一個' +」在這裏簽名

enter image description here