在选择组合框项目后,使用多个表中的SQL Server数据填充文本框和其他字段

在选择组合框项目后,使用多个表中的SQL Server数据填充文本框和其他字段,sql,sql-server,vb.net,visual-studio,combobox,Sql,Sql Server,Vb.net,Visual Studio,Combobox,我正在编写代码,在从Combobox中选择索引之后,用多个SQL Server表中的数据加载并填充文本框和其他字段! 其余的我都知道了,但在运行我的项目时,它给出了一个错误:“列的's.staff_fullname'不属于表”。虽然我使用了连接,但仍然没有+ve结果 我从这个答案中得到了一些帮助,但对于我的问题,它仍然是不完整的: 以下是我迄今为止编写的代码: Private Sub cboISBN_SelectedIndexChanged(sender As Object, e As Eve

我正在编写代码,在从Combobox中选择索引之后,用多个SQL Server表中的数据加载并填充文本框和其他字段! 其余的我都知道了,但在运行我的项目时,它给出了一个错误:“列的's.staff_fullname'不属于表”。虽然我使用了连接,但仍然没有+ve结果

我从这个答案中得到了一些帮助,但对于我的问题,它仍然是不完整的:

以下是我迄今为止编写的代码:

Private Sub cboISBN_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboISBN.SelectedIndexChanged
    Dim ds As New DataSet
    If (cboISBN.SelectedIndex <> -1) Then
        da = New SqlDataAdapter("SELECT s.staff_fullname, p.pub_name, " _
                                & " b.sub_code, b.isbn, b.book_name, " _
                                & " b.author, b.price, b.rack_no, " _
                                & " b.no_of_books, pby.vol_no, " _
                                & " pby.pub_date FROM book b JOIN published_by pby " _
                                & " ON b.isbn = pby.isbn JOIN publisher p on p.pub_id = b.pub_id " _
                                & " JOIN staff s ON s.staff_id = b.staff_id WHERE b.isbn =@isbn", cn)
        da.SelectCommand.Parameters.AddWithValue("@isbn", Convert.ToDecimal(cboISBN.SelectedValue.ToString()))
        da.Fill(ds)
        cboStaff_id.Text = ds.Tables(0).Rows(0)("s.staff_fullname").ToString()
        cboPub_id.Text = ds.Tables(0).Rows(0)("p.pub_name").ToString()
        cboSub_Code.Text = ds.Tables(0).Rows(0)("b.sub_code")
        txtbook_name.Text = ds.Tables(0).Rows(0)("b.book_name").ToString()
        txtauthor.Text = ds.Tables(0).Rows(0)("b.author").ToString()
        txtprice.Text = ds.Tables(0).Rows(0)("b.price")
        txtrack_no.Text = ds.Tables(0).Rows(0)("b.rack_no")
        TxtNo_of_Books.Text = ds.Tables(0).Rows(0)("b.no_of_books")
        txtvol_no.Text = ds.Tables(0).Rows(0)("pby.vol_no")
        DateTimePicker1.Text = ds.Tables(0).Rows(0)("pby.pub_date")
    End If
End Sub
Private Sub cboISBN\u SelectedIndexChanged(发送方作为对象,e作为事件参数)处理cboISBN.SelectedIndexChanged
Dim ds作为新数据集
如果(cboISBN.SelectedIndex-1),则
da=新的SqlDataAdapter(“选择s.staff\u全名,p.pub\u名称,”_
&b.sub_代码,b.isbn,b.book_名称_
&b.作者b.价格b.机架编号_
&“b.书号,pby.vol\U no,”_
&“pby.pub_日期自pby出版的b书加入”_
&“在b.isbn=pby.isbn上在p.pub_id=b.pub_id上加入发布者p”_
&“在s.staff_id=b.staff_id上加入员工s,其中b.isbn=@isbn”,cn)
da.SelectCommand.Parameters.AddWithValue(“@isbn”,Convert.ToDecimal(cboISBN.SelectedValue.ToString()))
da.填充(ds)
cboStaff_id.Text=ds.Tables(0).行(0)(“s.staff_全名”).ToString()
cboPub_id.Text=ds.Tables(0).Rows(0)(“p.pub_name”).ToString()
cboSub_Code.Text=ds.表格(0).行(0)(“b.sub_代码”)
txtbook_name.Text=ds.Tables(0).Rows(0)(“b.book_name”).ToString()
txtauthor.Text=ds.Tables(0).Rows(0)(“b.author”).ToString()
txtprice.Text=ds.Tables(0).行(0)(“b.price”)
txtrack_no.Text=ds.表格(0).行(0)(“b.机架编号”)
TxtNo_of_Books.Text=ds.表(0).行(0)(“b.no_of_Books”)
txtvol\u no.Text=ds.表格(0).行(0)(“pby.vol\u no”)
DateTimePicker1.Text=ds.Tables(0).行(0)(“pby.pub_date”)
如果结束
端接头

问题在于如何引用查询结果

cboStaff_id.Text = ds.Tables(0).Rows(0)("s.staff_fullname").ToString()
您需要引用数据集中的列名,该列名与查询中的别名不同

cboStaff_id.Text = ds.Tables(0).Rows(0)("staff_fullname").ToString()

首先,我建议您通过为行定义变量来简化代码(并避免表单较大时可能出现的性能问题):

Dim iRow as DataRow = ds.Tables(0).Rows(0)
通过这种方式,可以通过以下方式引用字段:

iRow("s.staff_fullname")
Dim CmdText as String = "SELECT s.staff_fullname, p.pub_name, " _
        & " b.sub_code, b.isbn, b.book_name, " _
        & " b.author, b.price, b.rack_no, " _
        & " b.no_of_books, pby.vol_no, " _
        & " pby.pub_date FROM book b JOIN published_by pby " _
        & " ON b.isbn = pby.isbn JOIN publisher p on p.pub_id = b.pub_id " _
        & " JOIN staff s ON s.staff_id = b.staff_id WHERE b.isbn = '" & _
        Convert.ToDecimal(cboISBN.SelectedValue.ToString()) & "'; "
一旦引入IsDBNull()或其他输入数据检查,旧代码将无法读取

至于“Column's.staff_fullname'不属于table table”,我认为如果您更改设置文本框的行的顺序,它也会表示不同的列。我认为您需要使用结果名,它们从来没有表别名。 所以不是

ds.Tables(0).Rows(0)("s.staff_fullname").ToString()
试一试

如果您的列名colide(即b.book\u name和c.book\u name)在SQL中使用别名,即:

b.book_name AS b_book_name, c.book_name AS c_book_name
然后你可以用

ds.Tables(0).Rows(0)("b_book_name")
或者如果你接受了我上面的建议

iRow("b_book_name")
顺便说一下,您不应该需要.ToString()函数

哦,还有一个提示:如果直接运行SQL代码,为什么要使用参数?您可以简单地这样写:

iRow("s.staff_fullname")
Dim CmdText as String = "SELECT s.staff_fullname, p.pub_name, " _
        & " b.sub_code, b.isbn, b.book_name, " _
        & " b.author, b.price, b.rack_no, " _
        & " b.no_of_books, pby.vol_no, " _
        & " pby.pub_date FROM book b JOIN published_by pby " _
        & " ON b.isbn = pby.isbn JOIN publisher p on p.pub_id = b.pub_id " _
        & " JOIN staff s ON s.staff_id = b.staff_id WHERE b.isbn = '" & _
        Convert.ToDecimal(cboISBN.SelectedValue.ToString()) & "'; "
注意:vb.net和SQL代码的这种组合不是最佳的。数据访问层(具有数据访问功能的单独类)是可建议的。或者使用存储的产品;在这种情况下,必须提供变量作为参数

根本不需要使用参数。。。 从这里我可以问:为什么你们要把值转换成字符串,然后再转换成数字??尤其是十进制??ISBN是一个十进制数字吗

问候,


Oak

不是您问题的答案,但由于您没有使用存储过程,因此使用AddWithValue时应小心。这种类型的参数化传递查询有时可能会导致数据类型错误@SeanLange我到处都在关注这个存储过程!您能为我提供一个快速学习的好来源吗?不确定您所说的存储过程关注点是什么意思?@SeanLange我很久以前在大学里学习过存储过程主题,但现在我不记得了!所以我想问你们是否可以提供链接或其他东西来研究存储过程!你真的应该学习如何使用搜索引擎,并在网上图书(BOL)中查找参考资料。这是sql server的文档。我理解你在这个特殊的例子中对参数的评论,但老实说,建议某人不使用参数充其量只是不合理的。为什么不将其放在存储过程中,而首先将代码放在应用程序中?上面的代码是一个VB.NET Sub,如果编写这样的Sub,则使用参数是没有意义的。这也没有坏处,但我只是想给他展示一个简单的方法。当然,如果有人来复制这个代码作为示例,并且它不是参数化的……嗯,也许你是对的,我没有想到这一点。我将添加一条评论。