Linq to Sql查询失败,“X不是'String'的成员”

时间:2011-01-04 17:42:14

标签: vb.net linq-to-sql

数据库表示:表3

Account Number     |Name      |Address        |Movies Rented   |Date               
00001              |John      |dbfdgjfkhgj    |fhdfhjfgjhk     |11/17/10
00002              |Michael   |gefjkyuthjs    |dgshythety      |10/12/10 
00003              |Maverick  |fgfshbsfgjk    |asdjbinn        |12/01/10 
00003              |Maverick  |gdsffgbhgfhg   |dfdfhfh         |12/02/10 
00004              |Joel      |dsgdsffh       |gdsfhfdh        |11/14/10
00004              |Joel      |hdfgjgfhgfj    |gsdhfdhjty      |11/14/10  
00003              |Maverick  |ertgrjrjtypo   |dsgdgrhtyth     |12/03/10

我遇到了类似逻辑错误的问题,因为我不熟悉这项技术,所以我很难解决。我正在使用visual basic 2008 express edition及其内置的linq-to-sql 技术。我能够使用linq-to-sql方法检索,添加,编辑和删除这样的记录,但有一点我无法得到的是关系数据库操作。

这是我的问题。正如您所见,上面的表格代表了我数据库中的记录。您可以注意到我有一些重复的帐号 用作主键或标识符。我想要的是当我想查询这样的帐号时,它应该显示所有具有相同帐号的记录。比如说,如果我查询帐号00003.它应该只显示三个记录,名称是Maverick及其相应的地址,电影租用和日期。

我最终发生的事情是当我查询在数据库中被复制的这样的帐号我遇到了两件事时,它要么显示数据库中所有与不同帐号相关联的记录,要么给我一个错误如果我将代码从For Each memrec In db.Table3s更改为For Each memrec In retrn语句,则会显示该消息。 我在这里尝试做的是,如果您在搜索框中输入帐号,它应该只显示与输入的帐号相关联的组合框中的记录。就像你在搜索框中输入00003一样,它应该只显示由Maverick租用的三部电影,并且在组合框中不会少。

以下是我使用的代码:

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

    Dim db As New memrecDataContext()

    Dim ret As String
    ret = InputBox("Enter Account#", "Search")

    Dim retrn = _
    From memrec In db.Table3s _
    Where memrec.Account_ = ret _
    Select memrec.Movies_Rented()

    For Each memrec In db.Table3s
        If memrec.Account_ = ret Then
            Form4.ComboBox5.Text = memrec.Account_
            Form4.ComboBox4.Text = memrec.Name
            Form4.DateTimePicker1.Value = memrec.Date
            Form4.ComboBox2.Text = memrec.Movies_Rented
            Form4.ComboBox1.Text = memrec.Address     
            Form4.Show()

        End If
    Next

End Sub

上面的代码不会过滤与在搜索框中输入的帐号关联的记录,因为它仍会提取数据库中的所有记录,如果我也使用下面的代码块:

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

    Dim db As New memrecDataContext()

    Dim ret As String
    ret = InputBox("Enter Account#", "Search")


    Dim retrn = _
    From memrec In db.Table3s _
    Where memrec.Account_ = ret _
    Select memrec.Movies_Rented()

    For Each memrec In retrn
        If memrec.Account_ = ret Then
            Form4.ComboBox5.Text = memrec.Account_
            Form4.ComboBox4.Text = memrec.Name
            Form4.DateTimePicker1.Value = memrec.Date
            Form4.ComboBox2.Text = memrec.Movies_Rented
            Form4.ComboBox1.Text = memrec.Address
            Form4.Show()

        End If
    Next

End Sub

它仍然会给我一个错误说明以下

'Account_' is not a member of 'String'.
'Name' is not a member of 'String'.
'Address' is not a member of 'String'.
'Movies_Rented' is not a member of 'String'.
'Date' is not a member of 'String'.

感谢您的回复。我之前已经尝试过这组代码,但它的工作方式相同。在我在这个论坛上发表我的评论之前,我曾多次尝试修改我的代码,以为我可以自己解决它,但我无法解决。该代码仍不会过滤数据库中的记录。我想验证上面的表只是表示,但我数据库表上的真实列是'帐号#'而不是帐号,而visual basic会将代码检测为'Account_'。我可以知道为什么我桌上的Movies_Rented列不是字符串的成员吗?为什么你提供的代码仍会显示组合框中的所有记录?

1 个答案:

答案 0 :(得分:1)

在您的示例中,您正在选择memrec.Movies_Rented,它将仅返回Movies_Rented列,该列只是一个字符串数组,因此“此类不是String的成员”错误。你想只选择memrec。

Dim retrn = _
    From memrec In db.Table3s _
    Where memrec.Account_ = ret _
    Select memrec

如果没有正确过滤,看起来您正在尝试使用Account_进行比较,而Account_不是您表格的一部分。您可能需要过滤Account_Number。 (这完全取决于LINQ映射的进展情况,代码的那部分可能就好了。)

过滤看起来很好。可能是因为您在文本框中键入“3”而不是“000003”。 (我假设您的帐号在数据库中存储为字符串。)

另外,我看到你正在设置组合框的文本。这可能是也可能不是,但我怀疑你想在他们的选项列表中添加一个项目。

一旦你解决了选择问题,就应该更容易看出你是否得到了正确的结果(如果没有,如何解决它们)。