如何使用SQLDataAdapter从同一个表访问多个记录?

时间:2015-07-14 17:50:36

标签: sql sql-server vb.net

这几乎可行。我在最后一行看到一个错误,看起来它抱怨C1引用。有一个简单的方法吗?查询或连接没有任何问题。

  Dim CmdString As String
    Dim con As New SqlConnection
    Try
        con.ConnectionString = PubConn
        CmdString = "select * from " & PubDB & ".dbo.Suppliers as S " & _
            " join " & PubDB & ".dbo.Address as A" & _
            "  on S.Supplier_Address_Code = A.Address_IDX" & _
            " join " & PubDB & ".dbo.Contacts as C1" & _
            "  on S.Supplier_Contact1 = C1.Contact_IDX" &
            " join " & PubDB & ".dbo.Contacts as C2" & _
            "  on S.Supplier_Contact2 = C2.Contact_IDX" &
            " WHERE S.Supplier_IDX = " & LookupIDX

        Dim cmd As New SqlCommand(CmdString)
        cmd.Connection = con
        con.Open()

        Dim DAdapt As New SqlClient.SqlDataAdapter(cmd)
        Dim Dset As New DataSet

        DAdapt.Fill(Dset)
        con.Close()

        With Dset.Tables(0).Rows(0)

            txtAddress1.Text = .Item("Address1").ToString
            txtAddress2.Text = .Item("Address2").ToString
            txtSupplierName.Text = .Item("Address_Title").ToString
            txtAttn.Text = .Item("Attn").ToString
            txtBusinessPhone1.Text = .Item("C1.Contact_Business_Phone").ToString

3 个答案:

答案 0 :(得分:1)

你不会包括" C1"表别名作为列名的一部分。它将作为Contact_Business_Phone从您的查询中返回。

要访问多行,您可以像上面的示例一样使用索引器"行(0)和#34;将With块放入For循环并访问" Rows(i)"用你的循环变量。但是,这对您将其分配给单个文本框无效,因此您只能看到页面/屏幕上的最后一个值。

答案 1 :(得分:0)

别名C1由SQL Server使用,不会持久保存到结果集。您是否已将此查询带入SQL Management Studio以查看结果?

由于您请求了所有列(*)并且两次加入了Contacts表,因此您最终会在结果中找到重复的列名。例如,如果Contacts表具有LastName字段,那么您的结果中最终会有两个LastName列。

我还没有尝试在我的本地环境中复制它,但我无法想象数据适配器会有重复的列名。

我建议您专门包含要返回的列,而不是使用*。在那里您将使用C1的别名,然后您可以使用AS关键字重命名重复列:

SELECT C1.LastName AS [Supplier1_LastName],
       C2.LastName AS [Supplier2_LastName],
...

这可以解决您的问题。

祝你好运!

答案 2 :(得分:0)

您应该只撤回您实际感兴趣的列,而不是*。由于您正在提取完整集,因此很难准确地确定哪些数据存在于哪些表中,但是在快速猜测时,您需要在select语句中撤回A.Address1, A.Address2, A.AddressTitle, ?.Attn (not sure which table this actually derives from) and C1.Contact_Business_Phone。除非你真的需要其他字段,否则你最好在查询中指定单个字段,除了你在这里遇到可能重复的字段问题之外,它还可能是一个显着的性能影响,将所有内容都拉进去。你清理查询并只提取你想要的结果,你可以安全地按照你对其他字段的方式引用它们,而不需要表别名(正如其他人指出的那样,它不会持久保存到结果集中)反正)。