VB.NET - SQL UpdateCommand для таблицы без первичного ключа в Gridview

1) Каков синтаксис запроса на обновление для таблицы без первичного ключа в vb.net для gridview с флажком?

Отказ от ответственности: к сожалению, добавление первичного ключа невозможно. Моя программа — небольшая программа в гораздо большей системе с плохим управлением данными. Мое время разработки не включает переписывание другого программного обеспечения.

Вот столбцы для таблицы, где AgentLeads — это база данных, а MktDtaLeads_Scrubbed — это таблица:

FROM [AgentLeads].[dbo].[MktDtaLeads_Scrubbed] - [Last Name] ,[First Name],
     [Middle Name] ,[Suffix] ,[Address Line 1] ,[Address Line 2] ,[City] ,[ST],
     [ZipCode] ,[Email Address] ,[Phone Nbr] ,[Toll Free Nbr] ,[InsertDate] ,
     [SentDate] ,[DoNotMail] 

Код, который у меня есть прямо сейчас, не отображает никаких ошибок, но не обновляет поле DoNotMail, когда вы устанавливаете флажок, хотя он отображает текст «Значение DoNotMail было изменено в базе данных для выбранного поля».

Для кода default.aspx.vb я добавил:

Public Sub gridview1_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)


     If e.CommandName = "UpdateDoNotMail" Then

        With Me.SqlDataSource1
           Dim box As CheckBox = DirectCast(sender, CheckBox)


           If box.Checked = True Then

               donotmail.SelectedValue = 1


               .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString

               .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail 
               WHERE [last name][email protected] AND [first name][email protected] AND [Address Line 1]=@Address Line 1.selectedrow" 

           Else
               donotmail.SelectedValue = 0


               .ConnectionString = ConfigurationManager.AppSettings("AgentLeadsConnectionString").ToString


               .UpdateCommand = "UPDATE MktDataLeads_scrubbed set donotmail=@donotmail
               WHERE [last name][email protected] AND [first name][email protected] AND [Address Line 1]=@Address Line 1.selectedrow"

           End If
       End With

    End If
End Sub

Вот код для GridView по умолчанию. aspx:

        <asp:GridView ID="GridView2" runat="server" CellPadding="2" 
            DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None" 
            AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="Last Name" HeaderText="Last Name" 
                    SortExpression="Last Name" />
                <asp:BoundField DataField="First Name" HeaderText="First Name" 
                    SortExpression="First Name" />
                <asp:BoundField DataField="Address Line 1" HeaderText="Addr 1" 
                    SortExpression="Address Line 1" />
                <asp:BoundField DataField="Address Line 2" HeaderText="Addr 2" 
                    SortExpression="Address Line 2" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="ST" HeaderText="ST" SortExpression="ST" />
                <asp:BoundField DataField="ZipCode" HeaderText="ZipCode" 
                    SortExpression="ZipCode" />
                <asp:BoundField DataField="Email Address" HeaderText="Email Addr" 
                    SortExpression="Email Address" />
                <asp:BoundField DataField="Phone Nbr" HeaderText="Phone Nbr" 
                    SortExpression="Phone Nbr" />

         <asp:TemplateField HeaderText="DoNotMail" SortExpression="DoNotMail">     
         <ItemTemplate>         
         <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" CommandName="UpdateDoNotMail" Checked='<%# Bind("DoNotMail") %>'
                       Enabled="true" />     
         </ItemTemplate>     

         <EditItemTemplate>         
         <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" CommandName="UpdateDoNotMail" Checked='<%# Bind("DoNotMail") %>' />     
         </EditItemTemplate>       
         </asp:TemplateField> 

            </Columns>

2) можно ли выполнить двустороннюю синхронизацию для всей сетки, когда пользователь нажимает кнопку, чтобы вам не приходилось обновлять каждый раз, когда изменяется строка? потому что пользователь может установить флажок, а затем установить другой флажок, затем снять флажок, и будет много обновлений...


person Brian McCarthy    schedule 08.02.2011    source источник


Ответы (2)


Это сложная ситуация, потому что вы не можете различить идентичные записи без уникального первичного ключа.

Однако вы можете использовать Свойство OldValues ​​GridView. Это не то, как разработчики обычно обрабатывают GridViews, но я думаю, что это может быть вашим спасителем.

Например, чтобы выяснить, какую строку следует обновить, вы должны установить в предложении where все значения OldValues ​​каждого свойства и соответствующим образом обновить. Из-за вашей липкой ситуации вы можете просто обновить более одной строки, но это цена, которую вы платите за отсутствие первичного ключа.

person rlb.usa    schedule 08.02.2011
comment
каков правильный синтаксис для- .UpdateCommand = UPDATE MktDataLeads_scrubbed set donotmail=@donotmail ГДЕ GridViewRow row = GridView1.SelectedRow AND [last name][email protected] AND [first name][email protected] AND [Address Line 1]= @Адресная строка 1.selectedrow - person Brian McCarthy; 08.02.2011
comment
как насчет того, чтобы каким-то образом адаптировать этот код - checkbox" title="vb net sql query работает на сервере sql, но не при вызове из флажка"> stackoverflow.com/questions/4239394/? - person Brian McCarthy; 08.02.2011

Вот код для GridView по умолчанию. aspx:

Я использовал вариант кода, подробно описанный на этой странице, и он заработал! vb.net SQL запрос работает на сервере SQL, но не при вызове из флажка

Для кода default.aspx.vb я добавил:

    Public Sub checkbox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) 'Handles checkbox.CheckedChanged
    Dim connectionString As String = ConfigurationManager.ConnectionStrings("AgentLeadsConnectionString").ConnectionString


    Dim box As CheckBox = DirectCast(sender, CheckBox)
    Dim tblcell As TableCell = CType(box.Parent, TableCell)
    Dim dgRow As GridViewRow = CType(tblcell.Parent, GridViewRow)

    Dim lastname As String = [last name].Rows(dgRow.DataItemIndex).Cells(0).Text
    Dim firstname As String = [first name].Rows(dgRow.DataItemIndex).Cells(0).Text
    Dim address As String = [Address Line1].Rows(dgRow.DataItemIndex).Cells(0).Text

    Dim insertSQL As String

    If box.Checked = True Then
        insertSQL = "UPDATE MktDataLeads_scrubbed "
        insertSQL &= "SET donotmail=1 "
        insertSQL &= "WHERE [last name]= @lastname AND [first name]=@firstname AND [Address Line1]=@address "
    Else
        insertSQL = "UPDATE MktDataLeads_scrubbed "
        insertSQL &= "SET donotmail=0 "
        insertSQL &= "WHERE [last name]= @lastname AND [first name]=@firstname AND [Address Line1]=@address "
    End If

    Using con As New SqlConnection(connectionString)
        Dim cmd As New SqlCommand(insertSQL, con)
        cmd.Parameters.AddWithValue("@donotmail", donotmail)
        Try
            con.Open()
            cmd.ExecuteNonQuery()
        Catch Err As SqlException
            MsgBox("Error", 65584, "Insertion Error")
        End Try
        con.Close()
    End Using

End Sub

Для gridview я использовал тот же код:

             <asp:TemplateField HeaderText="DoNotMail" SortExpression="DoNotMail">     
             <ItemTemplate>         
             <asp:CheckBox ID="CheckBox" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_CheckedChanged" Checked='<%# Bind("DoNotMail") %>'
                           Enabled="true" />     
             </ItemTemplate>     
             <EditItemTemplate>         
             <asp:CheckBox ID="CheckBox" runat="server" AutoPostBack="true" OnCheckedChanged="checkbox_CheckedChanged" Checked='<%# Bind("DoNotMail") %>' />     
             </EditItemTemplate>       
             </asp:TemplateField>
person Brian McCarthy    schedule 08.02.2011