2017-09-27 55 views
0

Edit1:「你不能在sql中參數化標識符,SET @Column = @Value不起作用。」SqlCommand UPDATE不更新數據庫

所以,如果我修改datagridview,我不能做一個迭代,我告訴sql服務器應該更新哪些列?我是否需要更新該行的每個元素?感謝您的其他建議。

我想這個C#代碼來更新我的SQL Server數據庫:

try 
{ 
    string parancs = "UPDATE Equipment SET @Column = @Value, Modifier = @Modifier, Modified = @Modified " + 
        "WHERE Description = @Description AND [Plane_A/C] = @Plane"; 

    SqlCommand sqlComm = new SqlCommand(parancs, connection); 
    DateTime time = DateTime.Now; 

    foreach (DataGridViewRow row in dataGridView.Rows) 
    { 
     foreach (DataGridViewCell cell in row.Cells) 
     { 
      if (cell.Value == null) 
      { 
       cell.Value = DBNull.Value; 
      } 
     } 
    } 

    sqlComm.Connection.Open(); 

    for (int i = 0; i < rowIndexes.Count; i++) 
    { 
     sqlComm.Parameters.Clear(); 
     sqlComm.Parameters.AddWithValue("@Column", dataGridView.Columns[columnIndexes[i]].HeaderText); 
     sqlComm.Parameters.AddWithValue("@Value", dataGridView.Rows[rowIndexes[i]].Cells[columnIndexes[i]].Value); 
     sqlComm.Parameters.AddWithValue("@Description", dataGridView.Rows[rowIndexes[i]].Cells["Description"].Value); 
     sqlComm.Parameters.AddWithValue("@Plane", ChoosenAC); 
     sqlComm.Parameters.AddWithValue("@Modifier", "TesztAdmin"); 
     sqlComm.Parameters.AddWithValue("@Modified", time); 

     sqlComm.ExecuteNonQuery(); 
    } 

    sqlComm.Connection.Close(); 
    MessageBox.Show("Sikeres módosítás!"); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString()); 
} 

rowIndexes.Count是修改的行和columnIndexes的數量是他們的立場。代碼無一例外地運行,但數據不會更新。在SQL Server Profiler中,我得到:

exec sp_executesql N'UPDATE Equipment SET @Column = @Value, Modifier = @Modifier, Modified = @Modified WHERE Description = @Description AND [Plane_A/C] = @Plane',N'@Column nvarchar(11),@Value float,@Description nvarchar(6),@Plane nvarchar(8),@Modifier nvarchar(10),@Modified datetime',@Column=N'InspectHour',@Value=800,@Description=N'Engine',@Plane=N'TEST-REP',@Modifier=N'TesztAdmin',@Modified='2017-09-27 12:44:14.773' 

所以所有的參數都會得到值。如果我將UPDATE命令複製到SSMS並使用精確值而不是參數,則它可以正常工作並進行更新。

當我在程序中使用INSERT命令而不是UPDATE的相同方法時,它可以正常工作。我希望我寫下一切,你可以幫忙。

蒂博爾

+2

你不能在sql中參數化標識符。 'SET @Column = @ Value'將不起作用。 –

+1

'@ Column'有什麼用?當然,您無法將列更新爲參數。嘗試刪除該參數並在命令中添加特定的列名稱。然後看到它工作正常。 –

+0

我認爲他們有一個名爲「列」的表列。桌子是一個財產袋。這不是關於列標識符的參數化。至於爲什麼在Profiler輸出中用@顯示@Column的分配,則是另一回事。注意下面的分配是不是如何。 – dlatikay

回答

0

按照我提出的意見,我可以提供改進的代碼示例:

const string parancs = 
    "UPDATE Equipment SET {column-name} = @Value, Modifier = @Modifier, Modified = @Modified " + 
    "WHERE Description = @Description AND [Plane_A/C] = @Plane"; 

DateTime time = DateTime.Now; 

foreach (DataGridViewRow row in dataGridView.Rows) 
{ 
    foreach (DataGridViewCell cell in row.Cells) 
    { 
     if (cell.Value == null) 
     { 
      cell.Value = DBNull.Value; 
     } 
    } 
} 

using (connection) 
using (var sqlComm = connection.CreateCommand()) 
{ 
    connection.Open(); 

    for (int i = 0; i < rowIndexes.Count; i++) 
    { 
     sqlComm.Parameters.Clear(); 
     sqlComm.Parameters.AddWithValue("@Value", dataGridView.Rows[rowIndexes[i]].Cells[columnIndexes[i]].Value); 
     sqlComm.Parameters.AddWithValue("@Description", dataGridView.Rows[rowIndexes[i]].Cells["Description"].Value); 
     sqlComm.Parameters.AddWithValue("@Plane", ChoosenAC); 
     sqlComm.Parameters.AddWithValue("@Modifier", "TesztAdmin"); 
     sqlComm.Parameters.AddWithValue("@Modified", time); 

     sqlComm.CommandText = parancs.Replace("{column-name}", dataGridView.Columns[columnIndexes[i]].HeaderText); 

     try 
     { 
      sqlComm.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
      throw; 
     } 
    } 

    sqlComm.Connection.Close(); 
} 

MessageBox.Show("Sikeres módosítás!"); 

注意,該try/catch塊現在包含一個單行 - 數據庫調用。它可能會產生我們無法控制的錯誤。

此外,SqlConnectionSqlCommand實施Disposable Pattern所以他們需要在using塊被使用,以防止memory leak