0

レコードの削除に問題があります。Access データベースで VB.net を使用しています。このプログラムを実行しようとすると、エラーはありませんが、レコードはデータベースで削除されませんでした。レコードを削除するクラスが 1 つあります。このクラスは、DeleteMultipleRecords という別のメソッドを呼び出します。これが私のコードです。誰かがこれを解決するのを手伝ってくれることを願っています。

-Default.aspx.vb-

Protected Sub btnDelete_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDelete.Click
    'create string collection to store IDs of records to be deleted
    Dim idCollection As New StringCollection()
    Dim strID As String = String.Empty
    'Loop through GridView rows to find checked rows 
    For i As Integer = 0 To i < GridView1.Rows.Count - 1
        Dim chkDelete As CheckBox = DirectCast(GridView1.Rows(i).Cells(0).FindControl("chkSelect"), CheckBox)
        If chkDelete IsNot Nothing Then
            If chkDelete.Checked Then

                strID = GridView1.Rows(i).Cells(1).Text
                idCollection.Add(strID)

            End If
        End If
    Next

    'called method to delete record
    DeleteMultipleRecords(idCollection)

    'rebind(GridView)
    GridView1.DataBind()
End Sub
Private Sub DeleteMultipleRecords(ByVal idCollection As StringCollection)
    'create connection
    Dim cnnOLEDB As New OleDbConnection(strConnection)
    Dim IDs As String = ""

    'create string builder to store 
    'delete commands seperated by ;

    For Each id As String In idCollection

        IDs += id.ToString() & ","
    Next

    Try

        Dim strIDs As String = IDs.Substring(0, IDs.LastIndexOf(""))
        Dim strSql As String = ("Delete from Details WHERE ID = '" & strIDs & "' ")

        cmdOLEDB.CommandType = CommandType.Text
        cmdOLEDB.CommandText = strSql
        cmdOLEDB.Connection = cnnOLEDB
        cnnOLEDB.Open()
        cmdOLEDB.ExecuteNonQuery()
        cmdOLEDB.Dispose()

    Catch ex As OleDbException

        Dim errorMsg As String = "Error in Deletion"
        errorMsg += ex.Message
        Throw New Exception(errorMsg)

    Finally
        cnnOLEDB.Close()
    End Try

End Sub

-Default.aspx-

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
        DataSourceID="SqlDataSource1" AutoGenerateColumns="False" DataKeyNames="ID">
        <Columns>
        <asp:TemplateField HeaderText="Select">
<ItemTemplate>

<asp:CheckBox ID="chkSelect" runat="server" />
</ItemTemplate>
 </asp:TemplateField>
<asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID"/>

<asp:TemplateField HeaderText="Name" 
                   SortExpression="Name">
<ItemTemplate>
<asp:TextBox ID="txtName" runat="server" 
             Text='<%# Bind("Name") %>'  ReadOnly="true" 
             BorderStyle="none" 
             BorderWidth="0px" >
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="Location" 
                   SortExpression="Location">
<ItemTemplate>
<asp:TextBox ID="txtLocation" runat="server" 
             Text='<%# Bind("Location") %>' 
             ReadOnly="true" 
             BorderStyle="none" BorderWidth="0px">
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
        </Columns>
    </asp:GridView>

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:LabSystemDBConnectionString %>" 
        ProviderName="<%$ ConnectionStrings:LabSystemDBConnectionString.ProviderName %>" 
        SelectCommand="SELECT * FROM [Details]"
        DeleteCommand = "DELETE FROM [Details] WHERE ID = [@ID]">

    <DeleteParameters>
    <asp:Parameter Name="ID" />
    </DeleteParameters></asp:SqlDataSource>


    <asp:Button ID="btnDelete" runat="server" OnClick="btnDelete_Click" OnClientClick="return DeleteConfirmation();"  Text="Delete" />
    &nbsp;<br />
4

2 に答える 2

0

これらの行を変更して機能させる必要があります。

For Each id As String In idCollection

    IDs += "'" + id.ToString() & "',"
Next

Try

    Dim strIDs As String = IDs.Substring(0, IDs.LastIndexOf(""))
    Dim strSql As String = ("Delete from Details WHERE ID IN (" & strIDs & ")")

BUT : このコードはSQL INJECTIONになりやすいため、2012 年には SQL パラメータを使用する必要があります。

于 2012-07-03T06:32:25.393 に答える
0

にブレークポイントを設定してください

Dim strSql As String = ("Delete from Details WHERE ID IN (" & strIDs & ")")

次に、アプリケーションを実行し、strSql にウォッチを追加します。ブレークポイントに到達したら、F11 キーを押します。strSql の内容を確認し、その sql ステートメントをコピーして、Access データベースでクエリを実行し、それが機能しているかどうかを確認します。

PS: テーブル名に [] を追加してみてください。DELETE FROM [詳細]

于 2012-07-03T08:13:14.423 に答える