2011-02-08 32 views
0

1)对于带复选框的gridview,在vb.net中没有主键的表的更新查询的语法是什么?VB.NET - 在Gridview中没有主键的表的SQL UpdateCommand

声明:令人沮丧的是,添加主键不是一个选项。我的程序是一个更大的系统中的一个小程序,数据管理很差。我的开发时间不包括重写其他软件。

下面是表在哪里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 [email protected] 
       WHERE [last name][email protected] AND [first name][email protected] AND [Address Line 1][email protected] Line 1.selectedrow" 

      Else 
       donotmail.SelectedValue = 0 


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


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

      End If 
     End With 

    End If 
End Sub 

这里的default.aspx上为GridView的代码:

 <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)有可能做两当用户点击一个按钮时,在整个gridview上进行双向同步,因此每次更改某行时都不必进行更新?因为用户可能会检查框,然后检查另一个框,然后取消选中一个框,这将是很多更新...

回答

0

下面是GridView控件的代码上的Default.aspx:

我使用本网页中的代码的变化,并得到它的工作! vb.net SQL query works in SQL server but not when called from checkbox

因为我背后的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][email protected] AND [Address Line1][email protected] " 
    Else 
     insertSQL = "UPDATE MktDataLeads_scrubbed " 
     insertSQL &= "SET donotmail=0 " 
     insertSQL &= "WHERE [last name]= @lastname AND [first name][email protected] AND [Address Line1][email protected] " 
    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> 
0

这是一个艰难的情况,因为你无法区分相同的记录没有一个唯一的主键。

然而,你可以做的是利用GridView's OldValues property。这不是开发人员通常处理GridView的方式,但我认为它可能只是您的救星。

例如,要确定要更新哪一行,可以将where子句设置为每个属性的所有OldValue,并相应地进行更新。由于你的情况很糟糕,你最终可能会更新多行 - 但这就是你为没有主键而付出的代价。

+0

什么是正确的语法换.UpdateCommand =“UPDATE MktDataLeads_scrubbed set donotmail = @ donotmail WHERE GridViewRow row = GridView1.SelectedRow AND [last name] = @ lastname.selectedrow AND [first name] = @ firstname.selectedrow AND [Address Line 1] = @ Address Line 1.selectedrow“ – 2011-02-08 15:51:47