MySQL INSERT ステートメントでパラメーターを利用することは、データの整合性を維持し、SQL インジェクション攻撃を防ぐための重要な実践です。ただし、コードで問題が発生しました。その解決をお手伝いいたします。
元の問題:
最初のコードでは、次のパラメータを使用して INSERT ステートメントを実行しようとしました:
comm.Parameters.Add("@person", "Myname"); comm.Parameters.Add("@address", "Myaddress");
しかし、エラー メッセージ「person カラムを null にすることはできません」は、person パラメータの値を設定していないことを示しています。
解決策:
この問題に対処するには、パラメータに値を割り当てる必要があります:
comm.Parameters.Add("@person", MySqlDbType.VarChar).Value = "Myname"; comm.Parameters.Add("@address", MySqlDbType.VarChar).Value = "Myaddress";
SQL インジェクションの脆弱性:
また、INSERT ステートメントでリテラル文字列を使用しても (例: "INSERT INTO room(person,address) VALUES('Myname', 'Myaddress')") エラーが発生しないとも述べました。ただし、この方法では SQL インジェクション攻撃が発生しやすく、悪意のあるユーザーが入力を操作して任意の SQL コマンドを実行する可能性があります。
代替解決策:
代わりに、以下を使用できます。 AddWithValue メソッド。パラメータ化を自動的に処理し、SQL インジェクションを防止します。
comm.Parameters.AddWithValue("@person", "Myname"); comm.Parameters.AddWithValue("@address", "Myaddress");
疑問符の使用:
もう 1 つのオプションは、疑問符をパラメータのプレースホルダーとして使用することです。例:
comm.CommandText = "INSERT INTO room(person,address) VALUES(?person, ?address)"; comm.Parameters.Add("?person", "Myname"); comm.Parameters.Add("?address", "Myaddress");
MySqlDbType 列挙型を使用して各パラメータの MySQL データ型を指定していることを確認してください。
インデックスベースのパラメータ:
インデックスベースのパラメーター (例: cmd.Parameters.Add("person", MySqlDbType.VarChar).Value = a;) を使用しようとした試みは無効です。インデックス ベースのアプローチは、パラメーター化されたクエリではなく、ストアド プロシージャ用です。
解決されたコード:
最終的に、コードは次のアプローチを使用して解決されました。
cmd.CommandText = "INSERT INTO room(person,address) VALUES(?person,?address)"; cmd.Parameters.Add("?person", MySqlDbType.VarChar).Value = "myname"; cmd.Parameters.Add("?address", MySqlDbType.VarChar).Value = "myaddress"; cmd.ExecuteNonQuery();
このコードは、SQL インジェクションから保護しながら INSERT ステートメントを正常に実行します。
以上がC# を使用して MySQL にデータを挿入すると、「person カラムを Null にすることはできません」というエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。