2016-05-12 155 views
2

我正在尝试编写一个函数,用于在我的数据库中搜索与SearchCriteria匹配的对象的记录。该函数的参数看起来像这样:在数据库中搜索与用户输入内容匹配的记录

RetrieveObject(SearchCriteria) As String (SearchCritera is a string aswell)

现在用于测试目的,我使用,要求用户通过名字来搜索一个控制台应用程序。

Console.Writeline("Search by first name: ") Dim firstName = Console.Readline()

然后我用我的功能:RetrieveObject(firstName)

我想我的功能,以显示已传递到RetrieveObject功能特定的人的所有值(姓氏,TITLENAME,州,邮编)。

我遇到的问题是我似乎无法理解我将如何匹配用户输入的值与数据库中的值。

如果任何人都可以让我朝正确的方向来帮助我理解如何实现这一点,我会很感激!

这里是我到目前为止的代码:

Private Function RetrieveObject(SearchCriteria As String) As String 

    Dim cn As OdbcConnection = New OdbcConnection(myCon) 

    Dim myQuery = "SELECT * FROM Applicant WHERE [strFirstName] LIKE '%son'" 

    Using com As New OdbcCommand(myQuery) 

     cn.Open() 
     com.Connection = cn 
     com.CommandType = CommandType.Text 
     com.CommandText = myQuery 
     com.Parameters.AddWithValue("@strFirstName", SearchCriteria) 

     Try 
      com.ExecuteReader() 
     Catch ex As Exception 
      MsgBox(ex.Message.ToString()) 
     End Try 

    End Using 

    Return SearchCriteria 

End Function 

再次感谢!

+0

似乎strFirstName不是表申请人的字段。包含搜索到的FirstNames的列的真实名称是什么 – Steve

+0

strFirstName是申请人表中字段的名称。此外,用于存储来自控制台的用户输入的firstName变量实际上是Public。 – TimmyHoHoo

回答

2

要创建WHERE条件,您需要向数据库引擎提供(在最基本的级别)三个信息。第一位是要搜索的列名,第二部分是要用于匹配记录的经营者,最后是要搜索的值

SELECT * FROM table WHERE FieldName = 'AStringValue' 

当然,我们可以有很多与操作符和字段数据类型有关的变体,但此答案仅限于您的实际情况。

请务必注意,您的查询可能会返回多个记录(特别是如果您将LIKE添加为通配符运算符,那么您不能简单地使用此查询返回单个值,而是返回DataTable,您可以在其中环比rows集合看到查询返回的所有记录

所以你的代码应改为

Private Function RetrieveObject(SearchCriteria As String) As DataTable 
    Dim myQuery = "SELECT * FROM Applicant WHERE [strFirstName] LIKE ?" 
    Try 
     Using cn = New OdbcConnection(myCon) 
     Using da = new OdbcDataAdapter(myQuery, cn) 
      da.SelectCommand.Parameters.Add("?", OdbcType.VarChar).Value = SearchCriteria 
      Dim dt = new DataTable() 
      da.Fill(dt) 
      return dt 
     End Using 
     End Using 
    Catch ex As Exception 
     MsgBox(ex.Message.ToString()) 
     return Nothing 
    End Try 
End Function 

现在你可以调用此方法类似

Dim table = RetrieveObject("John%") 
if table IsNot Nothing Then 
    For Each row in table.Rows 
     Console.WriteLine(row["strFirstName"].ToString()) 
    Next 
End If 

如果你真的需要所有的名字匹配返回一个JSON字符串,那么你可以上述

..... 
da.Fill(dt) 
Dim names = dt.AsEnumerable().Select(Function(x) x.Field(Of String)("strFirstName")).ToArray() 
string output = JsonConvert.SerializeObject(names); 
return output; 

并再次线路改变返回值内容添加到代码的最后几行是一个字符串。

+0

史蒂夫,这一切看起来很棒!我注意到的第一件事是该函数返回一个DataTable。我想我没有澄清,它需要返回一个'字符串'。尽管我会欺骗这个代码! :) 再次谢谢你!!会让你知道我是如何做出的。 – TimmyHoHoo

+0

你不能以字符串的形式返回记录集合 - 无论如何没有任何有意义的方式 – Plutonix

+0

对不起,我需要澄清它甚至更多!大声笑。我需要返回一个JSON字符串,其中包含一组符合条件的对象。如果我需要更多帮助,我会在稍后介绍。 – TimmyHoHoo

0

您也可以通过你的搜索条件为函数返回dataset如下图所示,还有一件事,你可以使用函数在文本框textchange事件形式

而且同时搜索包括LIKELIKE '%" & @strFirstName & "%',它可以帮助你如果需要,缩小搜索结果

Public Function Search(ByVal Criteria As String) As DataSet 
     Try 
      Dim ds As New DataSet 
      Using sqlCon As New SqlConnection(connStr) 
      stQuery="SELECT * FROM Applicant WHERE [strFirstName] 
        LIKE '%" & @strFirstName & "%'" 
       Dim sqlCmd As New SqlCommand(stQuery, sqlCon) 
       Dim sqlAda As New SqlDataAdapter(sqlCmd) 
       sqlCmd.CommandType = CommandType.Text 
       sqlCmd .Parameters.AddWithValue("@strFirstName", Criteria) 
       sqlAda.Fill(ds) 
      End Using 
      Return ds 
     Catch ex As Exception 
      MsgBox(ex.Message.ToString()) 
     End Try 
    End Function 
相关问题