【问题标题】:Datareader Retrieving Data数据读取器检索数据
【发布时间】:2011-09-09 03:01:33
【问题描述】:

我在包含属性 cust_id 的数据库中有 Memberships 和 Bookings 表,该属性是 Memberships 中的主键和 Bookings 中的引用键。当我执行数据读取器时,我希望它从成员表中读取 cust_id 值,但它正在从预订表中读取它。

另外,当我比较两个 cust_id 值时,一个取自文本​​框,另一个取自数据库列,即使两者相同,但比较结果为假。我已经使用 string.equals(str1, str2) 进行了比较,并且还使用 if 语句直接比较了两者。但在这两种情况下,即使字符串相同,结果也不同。

我的查询是:

 str2 = "select Memberships.cust_id from Memberships, Bookings where   Memberships.cust_id = Bookings.cust_id"
Dim cmd2 As New SqlCommand(str2, con)
con.Open()

Dim bookchk As SqlDataReader = cmd2.ExecuteReader  
While bookchk.Read()
Dim str1 As String = MskdTxtCustId.Text
Dim str3 As String = bookchk("cust_id")
MessageBox.Show(str1 & "," & str3 & String.Equals(str1, str3))

End While
    bookchk.Close()
    con.Close()

【问题讨论】:

  • 我加入表格的一个主要目的是,还有其他需要来自预订表格的属性的验证,例如我必须检查新预订是否与一些已经进行的预订重叠
  • 你可以在这里发布你的表定义吗?

标签: sql-server vb.net sqldatareader


【解决方案1】:

尝试明确声明您想要INNER JOIN

str2 = "select m.cust_id from Memberships AS M " &_
       " INNER JOIN Bookings AS B ON B.cust_id = M.cust_id;"

比较时,请使用String.Compare(),并确保您正在修剪空白,以防万一。

Dim str1 As String = MskdTxtCustId.Text.Trim()
Dim str3 As String = bookchk("cust_id").ToString().Trim()

Dim compareResult As Integer = String.Compare(s1, s2)
MessageBox.Show("compare str1: {0}, str3: {1}, result: {2}" , str1, str3, compareResult)

compareResult = String.Compare(s1, s2, True)
MessageBox.Show("Compare insensitive. result: {0}", compareResult)

【讨论】:

  • 感谢您的帮助,比较问题正在解决,但查询中的问题仍然存在,它仍在从 Bookings 表而不是 Memberships 表中读取值
  • 不清楚您所说的“阅读”是什么意思。它 100% 从 m 表中获取值,同时加入 b 表,确保每个 cust_id 都在两者中。如果你不想这样,那就不要加入。
  • 我在 Memberships 表中有 3 个唯一的 cust_id 值,即 csc-01、csc-02、csc-03 和 Bookings 表中的 6 个 Bookings 都适用于 csc-01 和 csc-02,并且没有预订 csc-03...当我从会员资格中选择时,即 m.cust_id 然后,因为我使用消息框检查结果,在 MessageBox.Show(str1 & "," & str3 & String.Equals(str1, str3 )) str3 从不显示值 csc-03 但它存在于 MEmberships 表中...我希望 bookchk 遍历 M.cust_id 中的所有值,以便每次检查客户是否具有会员资格... .我希望你现在已经明白了
  • 您需要 LEFT OUTER JOIN 而不是 INNER JOIN。
【解决方案2】:

至于字符串比较:我总是在这个 Sub 中使用 Datareader.GetString(item):

    If IsDBNull(Dr.Item(nr)) Then
        Return ""
    Else
        Return Dr.GetString(nr).TrimEnd
    End If

其中 nr 标识要从中获取值的行。您正在使用一些默认方法将数据库值转换为程序变量。我宁愿写我想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多