【解決方法】C# を使用してメソッドにクエリを配置する方法


私は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 インジェクション攻撃[^].

コメント

タイトルとURLをコピーしました