2011-07-20 7 views
0

私はついに1つの問題を解決しましたが、今は別の問題があります。セレクタがオンになっている現在のフィールドの名前を取得する方法を見つけましたが、現在は更新コマンドを使用したいときにパラメータを設定できません。いくつかのコードがあります...パラメータのSQL編集

private void dgv_DataLookup_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 

     DialogResult dr; 
     dr = MessageBox.Show("Are you sure you want to edit this field?", "Edit Cell", MessageBoxButtons.YesNo); 

     if (dr == DialogResult.Yes) 
     { 
      string myCell = dgv_DataLookup.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); 
      string myIndex = dgv_DataLookup.CurrentCell.OwningRow.Cells[6].Value.ToString(); 
      string myColumn = dgv_DataLookup.CurrentCell.OwningColumn.HeaderCell.Value.ToString(); 
      myColumn.Trim(); 

      da.UpdateCommand = new OleDbCommand("UPDATE tbl_Orders SET @myColumn = @myCell WHERE oid = @myIndex", cs); 
      da.UpdateCommand.Parameters.Add("@myColumn", OleDbType.VarChar).Value = myColumn; 
      da.UpdateCommand.Parameters.Add("@myCell", OleDbType.VarChar).Value = myCell; 
      da.UpdateCommand.Parameters.Add("@myIndex", OleDbType.Integer).Value = myIndex; 

      cs_Execute("UPDATE"); 

     } 
    } 

私が実際の列、たとえばitemNumにmyColumnを変更すると、正常に動作します。ただし、エラーは '@myColumn'を更新できませんでした。フィールドは更新できません

また、私にはmyColumnの値を示すメッセージボックスがあり、正しい値でした。私はちょうどこれが合法であるかどうか疑問に思って、パラメータをパラメータに設定しました。そうでなければ、すべての行を更新するだけです。ありがとう!

p.s. cd_Executeは、cs.Open()と同じです。da.UpdateCommand.ExecuteNonQuery()cs.Close()

答えて

1

パラメータ化されたクエリでは動的列名を使用できません。あなたはdynamic SQLに頼る必要があります。 SQL Injectionに開いているが

これは、あなたがやりたいことになります。

da.UpdateCommand = new OleDbCommand(string.Format("UPDATE tbl_Orders SET {0} = @myCell WHERE oid = @myIndex", myColumn), cs); 
+0

を絶対に100%正しいです!ありがとう!あなたは私の全体的なプロジェクト構造を完成させるために最後の感触を加えました。ありがとう –

関連する問題