- ベストアンサー
VB6と2008、SQL使用方法の違いについて
- VB6とVB2008でのデータベースの使用方法には違いがあります。VB6ではVB6のSQLを使用していたが、VB2008ではSQLステートメントを直接使用します。
- VB6では複数のフィールドを持つレコードの保存処理をプロシージャで行っていましたが、VB2008ではSQLのINSERT文を使用します。
- VB2008での保存処理はコマンドテキストに長文のステートメントを記述することになります。VB6のように別のプロシージャで保存処理を行う方法はありません。.NETではコーディングが必要です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> >まぁ,現在の常識として入力値をそのままSQL文として組み立てない,というのはありますが……。 > これはどういった意味なのでしょうか。具体的に説明して頂ければ幸いです。 入力値をそのまま使うと,SQL Injectionの可能性がでます。 例えば,Textbox1.Textが"','','', ... );DELETE FROM Work;--"だったような場合,DELETE FROM Workによってデータが削除されてしまいます。 SELECT系だと,条件式を無視するような記述方法も可能で,情報漏洩の原因になり得ます。 実際にSQL Injectionによる情報流出が疑われる事例はよく起きています。 こういうことを防ぐために,ADO.NETではデータをパラメータ化し,サーバー側でバインドさせます。 cmnd.CommandText = "INSERT INTO Work ( Id, Collection1, Collection2, ... ) VALUES ( @id, @collection1, @collection2, ... )" cmnd.Parameters.Add("@id", SqlDbType.Int).Value = Int32.Parse(Textbox1.Text) cmnd.Parameters.Add("@collection1", SqlDbType.VarChar, 64).Value = Textbox2.Text ... cmdn.ExecuteNonQuery() SQL インジェクション対策でプリペア-ドステートメントやバインド機構を使うことは, 10年近く前から言われていることなので,「現在の常識」と書きました。 もちろん,すべての入力値の文字種に制限があり,それがチェック済みで, SQL Injectionを引き起こさないのであればバインドしなくてもよいのですが, 入力値の文字種の制限はアプリケーション側の制限であり,SQL Injectionを理由とする制限ではないため, その場合であってもバインド機構を使うことが推奨されます。
その他の回答 (1)
- Yune-Kichi
- ベストアンサー率74% (465/626)
Visual BasicはRDBMSではないので,「VB6のSQL」は存在しないと思いますが……。 Visual Basic 7以降にもちゃんとメソッド (Sub/Function) は存在します。 クラスを受け付けて単一のSQLステートメントを実行するメソッドや, IEnumerable<T>を受け付けて複数のSQLステートメントを実行するメソッドを作ることは多々あります。 後者はPrepareが使えるので,効率をよくする効果もあります。 ---- まぁ,現在の常識として入力値をそのままSQL文として組み立てない,というのはありますが……。 # ADO.NETならパラメータ化してバインドさせる。
お礼
ご返答ありがとうございます。 ところで、 >まぁ,現在の常識として入力値をそのままSQL文として組み立てない,というのはありますが……。 これはどういった意味なのでしょうか。具体的に説明して頂ければ幸いです。
お礼
パラメータ化についてのご説明とても参考になりました。 丁寧に書いて頂きありがとうございます。