这几乎可行。我在最后一行看到一个错误,看起来它抱怨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
答案 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
。除非你真的需要其他字段,否则你最好在查询中指定单个字段,除了你在这里遇到可能重复的字段问题之外,它还可能是一个显着的性能影响,将所有内容都拉进去。你清理查询并只提取你想要的结果,你可以安全地按照你对其他字段的方式引用它们,而不需要表别名(正如其他人指出的那样,它不会持久保存到结果集中)反正)。