0

C# WinForm アプリケーションで ListBox を使用してデータベースからデータを削除したいと考えています。このコードを試していますが、機能していません。ListBox からデータを削除する方法を教えてください

それは私にこのエラーを与えています

varchar 値 'System.Data.DataRowView' をデータ型 int に変換するときに変換に失敗しました。

string i= listBox1.SelectedItem.ToString(); 

SqlConnection con = new SqlConnection();

con.ConnectionString = ConfigurationManager.ConnectionStrings["con"].ConnectionString;

con.Open();

SqlCommand CmdAddProof = new SqlCommand("delete from Tb_IdProof where PID='" + i+ "'", con);

CmdAddProof.CommandType = CommandType.Text;

CmdAddProof.ExecuteNonQuery();

textBox1.Text = string.Empty;

ShowProof();

con.Close();
4

3 に答える 3

0

改善できる点がいくつかあります。

  • パラメータ化されたコマンドを使用
  • コードとデータを混在させない
  • SQL インジェクション攻撃について読む
  • エラー処理コードを追加
  • db コードを UI クリーンアップ コードから 2 つのメソッドに分離する

これで問題が解決する可能性があります。

編集

パラメータ化されたコマンドを使用する場合は、タイプを渡します。これにより、ドライバーはタイプを処理およびエスケープする方法を認識できます。変数をクエリに埋め込むと、.ToString()メソッドが呼び出されます。文字列表現が期待どおりであるという誤った仮定が原因で、多くのバグが発生する可能性があります。この場合、これは機能します。しかし!それ以外の場合は、機能しない場合があります。このようなバグは、特定の場合にしか発生しないため、デバッグが非常に困難です。

アプリケーションがローカル サーバーとのみ通信するように指定することもできます。ネットワークにさらされることは決してありません。その後、仕事を変えると、アプリケーションが突然非常に成功し、インターネットに公開されます。そして、何を推測しますか?

デフォルトで防御的コーディングを適用していれば、多くのトラブルから身を守ることができたはずです。

環境は敵対的であり、ユーザー入力は悪であり、誰も信用しないと常に想定してください。遠慮なく異議を唱えてください。警告を受けています。

于 2013-08-09T09:51:21.153 に答える