2016-12-27 54 views
0

我想通過從數據庫中選擇一個特定的記錄並在文本框中顯示它,然後單擊一個按鈕來更新從文本框輸入的編輯更新我的數據庫。 但是,當我嘗試通過獲取受影響的行數來檢查數據庫中是否存在記錄時,它始終顯示爲0. 有人可以幫我弄清楚這是爲什麼?如何更新從c中的文本框輸入訪問數據庫#

private void button3_Click(object sender, EventArgs e) 
     { 

      string ghost1 = textBox1.Text.ToString(); 
      string ghost2 = textBox2.Text.ToString(); 
      string ghost3 = textBox3.Text.ToString(); 
      string ghost4 = textBox4.Text.ToString(); 

      OleDbConnection conn = new OleDbConnection(); 
      conn.ConnectionString = @"Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:\Users\jameschoi\Desktop\andrew.mdb"; 
      conn.Open(); 
      //OleDbDataReader myReader = null; 
      OleDbCommand command = new OleDbCommand("SELECT * FROM Stock WHERE SKU ='" + ghost1 + "'", conn); 
      OleDbCommand combank = new OleDbCommand("INSERT INTO Stock (Description, Qty, Price) VALUES ('" + ghost2 + "', '" + ghost3 + "', '" + ghost4 + "')", conn); 

      int frango = command.ExecuteNonQuery(); 
      string test1 = frango.ToString(); 

      command.ExecuteNonQuery(); 

      try 
      { 
       if (frango > 0) 
       { 
        combank.ExecuteNonQuery(); 
        MessageBox.Show("Update Successful"); 
        conn.Close(); 
       } 
       else 
       { 
        MessageBox.Show("Record does not exist"); 
       } 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show("Failed due to" + ex.Message); 
      } 

      finally 
      { 
       conn.Close(); 
       DataSet_update(); 
      } 

     } 
+0

可以肯定的是,在調用ExecuteNonQuery()之前,'SELECT * FROM Stock WHERE SKU ='「+ ghost1 +」''看起來像什麼?一個簡單的空白可以毀掉所有的東西.. –

+2

總是使用SQL參數,而不是將SQL粘在一起。除此之外,你正在將我認爲是數字(數量,價格)作爲文本傳遞。此外,文本屬性是'字符串'開始 - 'ToString()'是毫無意義的 – Plutonix

+0

@BagusTesa我不明白你的意思?如果你的意思是'ghost1 +'之間的空格,我嘗試過'+ ghost1 +',然後frango仍然出現在0. – Icecubelegacy

回答

0

我覺得它更容易像

OleDbCommand command = new OleDbCommand("SELECT COUNT(*) FROM Stock WHERE SKU ='" + ghost1 + "'", conn); 
int rowCount = (int) command.ExecuteScalar(); 
if(rowCount > 0) 
{ 
    OleDbCommand combank = new OleDbCommand("INSERT INTO Stock (Description, Qty, Price) VALUES ('" + ghost2 + "', '" + ghost3 + "', '" + ghost4 + "')", conn); 
    combank.ExecuteNonQuery(); 
    MessageBox.Show("Update Successful"); 
} 

但是不推薦使用此代碼很容易出現SQL注入。你應該使用UsingParameterized Queries這樣

using (OleDbConnection conn = new OleDbConnection(/* connection info */)) 
{ 
    sqlq = "SELECT COUNT(*) FROM Stock WHERE SKU = ?" 
    conn.Open(); 
    using (OleDbCommand comm1 = new OleDbCommand(sqlq, conn)) 
    { 
     OleDbParameter ghost1Param = new OleDbParameter(); 
     comm1.Parameters.Add(ghost1Param).Value = ghost1; 
     int rowCount = (int) comm1.ExecuteScalar(); 
     if(rowCount > 0) 
     { 
      sqlaq = "INSERT INTO Stock (Description, Qty, Price) VALUES (?, ?, ?)" 
      using (OleDbCommand combank = new OleDbCommand(sqlaq, conn)) 
      { 
       combank.Parameters.Add(ghost2Param).Value = ghost2; 
       combank.Parameters.Add(ghost3Param).Value = ghost3; 
       combank.Parameters.Add(ghost4Param).Value = ghost4; 
       combank.ExecuteNonQuery(); 
       //Update signifies Alteration to exsisting record. 
       MessageBox.Show("Insert was Successful"); //Try to use relevant messages 
      } 
     } 
    } 
} 

的OleDbCommand和OdbCommand不支持命名參數,並使用?而不是佔位符,所以參數的順序很重要。但是,出於可讀性的目的,您可以爲其參數指定名稱,而不是使用?。

當你想要確保分配資源的對象將被清理時,你應該使用'using'。因爲如果在你創建新對象的地方使用'關鍵字',將會確保爲你調用Dispose。它確保Dispose將被調用,無論發生什麼......即使在using語句的主體內引發了異常。

+0

我剛剛改變了我的代碼,以適應你的參數和'using'語句,但是在'combank.ExecuteNonQuery();' – Icecubelegacy

+0

有一個錯誤說「索引或主鍵不能包含空值」好了,現在問題就解決了。我剛剛將combank命令從'INSERT INTO'改爲'UPDATE Stock SET等等',現在就可以運行。感謝你的幫助!! – Icecubelegacy

相關問題