[ad_1]
私はC#を使用してデータベースCRUDを実行し、データベースにアクセスするクエリを配置しようとしていますが、コードをメソッドに配置することに失敗しているため、それを繰り返さないようにしています。
私が試したこと:
public String DeleteItem(int UserInput, String WhichTable) { String Item; OleDbConnection connection = new OleDbConnection(); connection.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|Rental_database .accdb");<pre lang="C#"><pre lang="C#">
connection.Open();
Item = “‘”+WhichTable+”‘ から削除します。 ID= “+ UserInput +” “;
OleDbCommand command = new OleDbCommand(Item, connection);
command.ExecuteNonQuery();
返却物;
解決策 1
まず、接続を閉じることはありません。これは悪いことです。 using
ブロックして、接続とコマンドが終了したときにそれらが閉じられ、破棄されるようにします。
C#
using (SqlConnection con = new SqlConnection(strConnect)) { con.Open(); using (SqlCommand cmd = new SqlCommand("SELECT Age, Description FROM myTable WHERE ID = @ID", con)) { cmd.Parameters.AddWithValue("@ID", myTextBox.Text); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { int age = (int) reader["Age"]; string desc = (string) reader["Description"]; Console.WriteLine($"{age}\n{desc}"); } } } }
(OleDb オブジェクトでも SqlServer オブジェクトでも同じです)。
次に、なぜ SQL クエリを返すのですか? ExecuteNonQuery 呼び出しの結果を返す方が理にかなっているでしょうか? そうすれば、呼び出し元の関数は行を削除したかどうかを確認できます…
第三に、そのコードは機能するように見えますが、SQL インジェクションが心配です
解決策 2
あなたはこれを探していると思います:
C#
String delQuery = $"DELETE FROM {WhichTable} WHERE [ID]= ?"; OleDbCommand delcmd = new OleDbCommand(); delcmd.CommandText = delQuery; delcmd.Connection = connection ; delcmd.Parameters.AddWithValue("?", UserInput); delcmd.ExecuteNonQuery();
クエリ文字列に値を入力しないでください。 そうすることで、 SQL インジェクション攻撃[^].
[ad_2]
コメント