2016-05-12 154 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 
相關問題