2017-01-02 8 views
0

私はそれが含まれている高度な検索を持っているcombobox1、combobox2、コンボボックス3私はデータベースで検索を行う方法を探しました。 combobox1を選択し、combobox2とcombobox3を選択せず​​、combobox2を選択してcombobox1とcombobox3を選択しなかった場合は、combobox3と同じコンボボックスをすべて選択してもソリューションが見つからなかった場合は、それぞれのケースでSqlCommand以上を作成する必要がありますか?またはこれを行う簡単な方法がある私は、SqlCommandオブジェクト高度な検索vb.net

Public Sub Load_Main(ByVal projectid As Integer, ByVal pdocid As Integer, ByVal depid As Integer) 
    main_Datatable.Clear() 
    Dim cmd As New SqlCommand("select * from main where [email protected] and [email protected] and [email protected]", DBConnection) 

    cmd.Parameters.Add("projectid", SqlDbType.Int).Value = projectid 
    cmd.Parameters.Add("pdocid", SqlDbType.Int).Value = pdocid 
    cmd.Parameters.Add("depid", SqlDbType.Int).Value = depid 
    DBConnection.Open() 
    main_Datatable.Load(cmd.ExecuteReader) 
    DBConnection.Close() 
    cmd = Nothing 

End Sub 

Load_Main(project_combo.SelectedValue, doc_combo.SelectedValue, Depart_combo.SelectedValue) 

作ってみました。しかし、私は他のコンボボックスを選択しなかった場合は、その後、nullにパラメータを設定する場合は、単に1は

+2

SQL文をビルドし、パラメータを追加し、値のみのためにo(またはnull)ではありません。 –

+0

ストアドプロシージャを使用すると、動的SQLを使用することも、コードを使用してSQLを構築することもできます。一つを選ぶ。 – Codexer

+1

また、適切に処分されるように、コマンドを使用してコマンドをラップする必要があります。 – Codexer

答えて

0

があまりにも多くのコードを変更せずに、0値を仮定すると、何もコンボボックスで選択されなかったことを意味し、それを行うための一つの方法である:

Public Sub Load_Main(ByVal projectid As Integer, ByVal pdocid As Integer, ByVal depid As Integer) 
    main_Datatable.Clear() 
    Dim query as string 
    query = "select * " & _ 
      "from main " & _ 
      "where projectid = ISNULL(NULLIF(@projectid, 0), projectid) " & _ 
      "and pdocid = ISNULL(NULLIF(@pdocid, 0), pdocid) " & _ 
      "and depid = ISNULL(NULLIF(@depid, 0), depid) " 
    Dim cmd As New SqlCommand(query, DBConnection) 

    cmd.Parameters.Add("projectid", SqlDbType.Int).Value = projectid 
    cmd.Parameters.Add("pdocid", SqlDbType.Int).Value = pdocid 
    cmd.Parameters.Add("depid", SqlDbType.Int).Value = depid 
    DBConnection.Open() 
    main_Datatable.Load(cmd.ExecuteReader) 
    DBConnection.Close() 
    cmd = Nothing 

End Sub 
+0

新しい2コンボボックスを追加すると、{All、0,1,2,3,4,5,6,7,8,9,10}を含む最初のコンボボックスに2つ目のコンボボックス{ (すべて、送信、承認済み、拒否)検索に追加する方法 –

+0

同じこと - '0'を' All' - 'で置き換え、列= ISNULL(NULLIF(@パラメータ、 'All')、列)' –

+0

ありがとう、これは私と一緒に働く –

0
Public Sub Load_Main(ByVal projectid As Integer, ByVal pdocid As Integer, ByVal depid As Integer) 
    main_Datatable.Clear() 
    Dim cmd As New SqlCommand("select * from main where (@projectid IS NULL OR [email protected]) and (@pdocid IS NULL OR [email protected]) and (@depid IS NULL OR [email protected])", DBConnection) 

    cmd.Parameters.Add("projectid", SqlDbType.Int).Value = If(projectid = 0, CObj(DBNull.Value), projectid) 
    cmd.Parameters.Add("pdocid", SqlDbType.Int).Value = If(pdocid = 0, CObj(DBNull.Value), pdocid) 
    cmd.Parameters.Add("depid", SqlDbType.Int).Value = If(depid = 0, CObj(DBNull.Value), depid) 
    DBConnection.Open() 
    main_Datatable.Load(cmd.ExecuteReader) 
    DBConnection.Close() 
    cmd = Nothing 

End Sub 

に動作しませんすべてのレコードと一致するため、事実上無視されます。あなたのものは整数として渡されているので、それをあなたのSQL節で無視したい場合は、0(または-1のようには使用されない他の整数値)に設定します。

代わりに代わりのステートメントを使用する必要があります。ここで

+0

新しい2コンボボックスを追加すると、{All、0,1,2,3,4,5,6,7,8,9,10}を含む最初のコンボボックスと、{All、Submitted、Approved、Rejected}検索に追加する方法 –

+0

@MichaelRaouf私たちの答えが本質的に同一であるので、あなたはすでにZoharから答えを得ているのが分かります。私のバージョンでは 'cmd.Parameters.Add(" status "、SqlDbType.varchar).Value = If(status = 'All'、CObj(DBNull.Value)、status)' – topshot

+0

のようなことをしています。それを試してみましたが、私と一緒には動作しません –

関連する問題