2016-11-05 56 views
1

我寫了一個庫存軟件;我有3種形式第一個有庫存第二個銷售物品的項目,最後一個我們可以退還我們銷售的物品。C#退款SQL語法

我有問題,退款指令,這裏是代碼:

try 
{ 
    mycon.Open(); 
    int y = 0; 

    for (int i = 0; i < dataGridView1.Rows.Count; i++) 
    { 
     SqlCommand cmd5 = new SqlCommand("UPDATE Pharmacy_Items Set Quantity= Quantity + " + dataGridView1.Rows[y].Cells[4].Value + " , Sold= Sold - " + dataGridView1.Rows[y].Cells[4].Value + " where ItemName='" + dataGridView1.Rows[y].Cells[1].Value + "'", mycon); 
     cmd5.ExecuteNonQuery(); 
     y += 1; 
    } 

    mycon.Close(); 
} 

有了這個代碼,我想補充的項目重新進貨但有時它不工作,並沒有新增項目並更改項目不正確。我的代碼或者我使用的方式有什麼問題嗎?

感謝

對不起,我英文不好:)

+1

使用參數化查詢。 –

+0

@gordonLinoff您能否告訴我,請與代碼,對不起,我是新的:) –

+0

@GordonLinoff你能告訴我請與代碼,對不起,我是新的:) –

回答

2

使用參數化查詢是更具可讀性和推薦的方式。

try 
     { 
      mycon.Open(); 
      int y = 0; 
      for (int i = 0; i<dataGridView1.Rows.Count; i++) 
      { 

       string sql = "UPDATE [dbo].[Pharmacy_Items] Set Quantity= Quantity + @Quantity , Sold= Sold - @Sold where [email protected]"; 

       using (SqlCommand cmd5 = new SqlCommand(sql, mycon)) 
       { 
        cmd5.CommandType = CommandType.Text; 
        var qunatityParam = new SqlParameter{Value=dataGridView1.Rows[y].Cells[4].Value, SqlDbType=SqlDbType.Int, ParameterName="Quantity"}; 
        var soldParam = new SqlParameter{Value=dataGridView1.Rows[y].Cells[4].Value, SqlDbType = SqlDbType.Int, ParameterName = "Sold"}; 
        var itemNameParam = new SqlParameter{Value=dataGridView1.Rows[y].Cells[1].Value,SqlDbType = SqlDbType.VarChar, ParameterName = "ItemName"}; 

        cmd5.Parameters.Add(qunatityParam); 
        cmd5.Parameters.Add(soldParam); 
        cmd5.Parameters.Add(itemNameParam); 
        cmd5.ExecuteNonQuery(); 
       } 

       y += 1; 
      } 
      mycon.Close(); 
     } 

或者更好的方法是在SQL端編寫一個存儲過程,並從您的C#代碼中調用該代碼,以防止SQL注入。

SQL

CREATE PROCEDURE EditPharmacyItems 
    @Quantity INT, 
    @Sold INT, 
    @ItemName VARCHAR(MAX) 
AS 
BEGIN 

    SET NOCOUNT ON; 

    UPDATE Pharmacy_Items 
    SET Quantity = [email protected] 
    ,Sold = Sold - @Sold 
    WHERE ItemName [email protected] 
END 
GO 

C#

  try 
      { 

       string sqlQuery = "[dbo].[EditPharmacyItems]"; 
       int y = 0; 
       mycon.Open(); 

       for (int i = 0; i<dataGridView1.Rows.Count; i++) 
       { 
        SqlCommand cmd5 = new SqlCommand(sqlQuery, mycon); 
        cmd5.CommandType=CommandType.StoredProcedure; 
        var qunatityParam = new SqlParameter{Value=dataGridView1.Rows[y].Cells[4].Value, SqlDbType=SqlDbType.Int, ParameterName="Quantity"}; 
        var soldParam = new SqlParameter{Value=dataGridView1.Rows[y].Cells[4].Value, SqlDbType = SqlDbType.Int, ParameterName = "Sold"}; 
        var itemNameParam = new SqlParameter{Value=dataGridView1.Rows[y].Cells[1].Value,SqlDbType = SqlDbType.VarChar, ParameterName = "ItemName"}; 

        cmd5.Parameters.Add(qunatityParam); 
        cmd5.Parameters.Add(soldParam); 
        cmd5.Parameters.Add(itemNameParam); 
        cmd5.ExecuteNonQuery();     
        y += 1; 
       } 
       mycon.Close(); 
      } 
+0

你應該看看[我們可以停止使用AddWithValue()了嗎?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)並停止使用'.AddWithValue()' - 它可能會導致意外和令人驚訝的結果... –

+0

不幸的是,我不能upvote這個答案,因爲它使用'AddWithValue()'。這讓人們學習如何使用參數成爲一個糟糕的例子。 –

+0

謝謝你指出。那是一個錯誤。適當地編輯答案。 –