ADO.NET Accessのホームへ戻る

SQLDeleteステートメントでレコードを削除するサンプル

 SQLDeleteステートメントでレコードを削除するサンプル

 

このサンプルは、SQLDeleteステートメントでAccessNwind.mdbデータベースの得意先テーブルからレコードを削除します。実行結果として削除したレコード件数を表示します。

 

このサンプルでは、以下のノウハウを習得することができます。

 

  OleDbConnectionOpen(),Close()メソッドの使い方

  OleDbCommandExecuteNonQuery()メソッドの使い方

  SQLDeleteステートメントの使い方

 

サンプルのPage_Load()イベントでは、AccessNwind.mdbデータベースの得意先テーブルからレコードを削除します。行7-8では、SQLDeleteステートメントを生成しています。

 

Delete * Customers
Where CompanyName='
フレンドリーソフト'

Deleteに続く*は、省略できます。DeleteWhere句では、CompanyName=”フレンドリーソフトを指定していますので、フレンドリーソフトのレコードが削除されます。行9-10では、OleDbConnectionのインスタンスを生成しています。行11では、OleDbCommandのインスタンスを生成しています。行14では、OleDbConnectionOpen()メソッドでAccessNwind.mdbデータベースを開いています。行15では、OleDbCommnad()ExecuteNonQuery()メソッドでDeleteステートメントを実行して得意先テーブルからレコードを削除しています。ExecuteNonQuery()メソッドでは、戻り値として削除されたレコード件数が返されます。行16では、OleDbConnectionClose()メソッドでAccessNwind.mdbデータベースを閉じています。行17-19では、LabelTextプロパティに削除されたレコード件数を設定して表示しています。

 

  6: Sub Page_Load()
  7:   Dim strSqlDelete As String = "Delete * From Customers " & _
  8:     "Where CompanyName='
フレンドリーソフト';"
  9:   Dim con As New OleDbConnection( _
 10:     ConfigurationSettings.AppSettings("conStringAccNw"))
 11:   Dim cmd As New OleDbCommand(strSqlDelete, con)
 12:   Dim intDeleteCount As Integer
 13:
 14:   con.Open()
 15:   intDeleteCount = cmd.ExecuteNonQuery()
 16:   con.Close()
 17:   lblMessage.Text = _
 18:     String.Format("<b>{0}</b>
件の得意先を削除しました.", _
 19:     intDeleteCount.ToString())
 20: End Sub

 

 

Note

ランタイム時にSQLを生成するときのセキュリティ上の留意点

 

テキストボックスから得意先名を入力させてSQLWhere句をランタイム時に生成するような場合、ハッカーにデータベースを覗かれたり、改ざんされる可能性があります。テキストボックスに「フレンドリーソフト」のようなデータを入力したときは、次のようなSQLが生成されて期待した結果が表示されます。

Select * From Customers Where CompanyName='
フレンドリーソフト'

ところが、テキストボックスに「'フレンドリーソフト' Or '' = ''」のようなデータを入力したときは、次のようなSQLが生成されて得意先のすべてのデータが表示されてしまいます。

 

Select * From Customers Where CompanyName='フレンドリーソフト' Or '' = ''

 

また、テキストボックスに「フレンドリーソフト'; Update Customers Set Phone='03-9999-9999' Where CustomerID=143」のようなデータを入力すると、SQLUpdateステートメントが埋め込まれてデータベースが書き換えられてしまいます。

 

  6: Sub btnExecuteSQL_Click(s As Object, e As EventArgs)
  7:   Dim strSqlSelect As String = "Select * From Customers " & _
  8:     "Where CompanyName='" & txtCustomerName.Text.Trim() & "'"
 11:   Dim cmd As New OleDbCommand(strSqlSelect, con)
 12:
 13:   lblMessage.Text = String.Format("SQL:<b>{0}</b><hr>", strSqlSelect)
 14:   con.Open()
 15:   Dim dr As OleDbDataReader = cmd.ExecuteReader()
 16:   While dr.Read()
 17:     With lblMessage
 18:       .Text &= String.Format("
得意先ID: <b>{0}</b><br>",dr("CustomerID"))
 19:       .Text &= String.Format("
得意先名: <b>{0}</b><br><hr>",dr("CompanyName"))
 20:     End With
 21:   End While
 24: End Sub

 

このようなセキュリティの問題を解決するには、テキストボックスに入力されたデータからシングルクオテーション(') を除去します。シングルクオテーションを除去するには、Regular Expressionクラスを利用すると便利です。次の例では、RegExクラスのReplace()メソッドで英数字と空白以外の文字を除去しています。

 

Dim objRegEx As New RegEx("[^0-9a-zA-Z\s]")

Response.Write( objRegEx.Replace("Friendly Soft' Or ''='" ,"") ) è Friendly Soft Or

 

テキストボックスに不正なデータを入力した時点でチェックするには、RegularExpressionValidatorを使用します。ValidationExpressionプロパティには、"[0-9a-zA-Z\s]*"を設定します。ここで設定したRegular Expressionは、英数字と空白のみ許可することを意味します。

 

<asp:TextBox id="txtCustomerName" runat="server"

  Width="20em" />

<asp:RegularExpressionValidator runat="server"

  ControlToValidate="txtCustomerName"

  ValidationExpression="[0-9a-zA-Z\s]*"

  Text="Invalid Customer Name" /> 

 

 

 

ADO.NET Accessのホームへ戻る