2

SQLクエリがラジオボタンとテキストボックスに依存する検索を作成しようとしています。

SELECT * FROM [Sales] WHERE (text in radio button) = (text in textbox)

どうすればこれを実装できますか?

以下は私の完全なコードです。

Protected Sub btnSearch_Click(sender As Object, e As ImageClickEventArgs) Handles btnSearch.Click
    If radClient.Checked = True Then
        Dim connection As New OleDb.OleDbConnection
        Dim provider As String
        Dim source As String
        provider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
        source = "Data Source=|DataDirectory|DeltaOneMDB.mdb"
        connection.ConnectionString = provider & source
        GridView1.Visible = False
        connection.Open()
        SqlDataSource3.SelectCommand = "SELECT * FROM Sales WHERE ClientID = '" & txtSearch.Text & "'"
        connection.Close()
    ElseIf radItem.Checked = True Then
        Dim connection As New OleDb.OleDbConnection
        Dim provider As String
        Dim source As String
        provider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
        source = "Data Source=|DataDirectory|DeltaOneMDB.mdb"
        connection.ConnectionString = provider & source
        GridView1.Visible = False
        connection.Open()
        SqlDataSource3.SelectCommand = "SELECT * FROM Sales WHERE ItemID = '" & txtSearch.Text & "'"
        connection.Close()
    ElseIf radUser.Checked = True Then
        Dim connection As New OleDb.OleDbConnection
        Dim provider As String
        Dim source As String
        provider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
        source = "Data Source=|DataDirectory|DeltaOneMDB.mdb"
        connection.ConnectionString = provider & source
        GridView1.Visible = False
        connection.Open()
        SqlDataSource3.SelectCommand = "SELECT * FROM Sales WHERE UserID = '" & txtSearch.Text & "'"
        connection.Close()
    ElseIf radUser.Checked = False And radClient.Checked = False And radItem.Checked = False Then
        ErrorLabel.Text = "Error: You have not chosen a search criteria."
    End If
End Sub

テーブル、テキストボックス、ラジオボタンはすべて同じフォームにあります。Microsoft Visual Studio 2012 for Webを使用していて、フォーム上のGridViewオブジェクトのデータソースを変更しようとしています。ただし、エラーが発生し続けます。

ConnectionStringプロパティが初期化されていません。

以前に私のコードを提供しなかったことをお詫びします。

ありがとうございました!

4

3 に答える 3

2

コードを見ると、不要な行がたくさんあります。コードを単純化するためにできると思うことの例を示したいと思います。まず、SqlDataSourceに不要なコードを削除します(データベースとの接続はすでに開いていると思いますが、クリックエントリで1回だけ実行できます。次に、各スイッチで、実行するコマンドとパラメーターを準備します。 (名前と値)そのコマンドに渡す最後に、SqlDataSourceを更新し、すべてを再バインドします

Protected Sub btnSearch_Click(sender As Object, e As ImageClickEventArgs) Handles btnSearch.Click
    Dim sqlQuery As String
    Dim prm as String
    Dim prmValue as String

    prmValue = txtSearch.Text
    If radClient.Checked = True Then
        sqlQuery = "SELECT * FROM Sales WHERE ClientID = @clientID"
        prm = "@clientID"
    ElseIf radItem.Checked = True Then
        sqlQuery = "SELECT * FROM Sales WHERE ItemID = @itemID"
        prm = "@itemID"
    ElseIf radUser.Checked = True Then
        sqlQuery = "SELECT * FROM Sales WHERE UserID = @userID"
        prm = "@userID"
    ElseIf radUser.Checked = False And radClient.Checked = False And radItem.Checked = False Then
        ErrorLabel.Text = "Error: You have not chosen a search criteria."
        return
    End If
    SqlDataSource3.SelectCommand = sqlQuery
    SqlDataSource3.SelectParameters.Add(prm, prmValue)
    SqlDataSource3.DataBind()
End Sub
于 2013-03-20T14:57:41.327 に答える
1

SQLDatasourceを使用する場合、接続を指定する必要はありません。SQLDatasourceは独自の接続を管理します。

あなたがする必要があるのは:

  1. ラジオボタンのステータスに基づいて選択ステートメントを更新します
  2. DataSourceDataBind関数を呼び出しますSqlDataSource3.DataBind()

また、より良いアプローチは、ヌル値を許可するストアドプロシージャを使用することです。SQLインジェクションに適しています(データベースの脅威)

SELECT * FROM Sales WHERE (@ClientID IS NULL OR ClientID = @ClientID)
AND (@ItemID IS NULL OR ItemID = @ItemID )
AND (@UserIDIS NULL OR UserID= @UserID)
于 2013-03-20T14:48:30.087 に答える
-1

インターネット上のいたるところにある恐ろしい解決策。これはおそらく世界で最も単純です。

PrintWriter out=response.getWriter();
        out.print("<html>");
        out.print("<body>");
        out.print("<form>");
        out.print("<textarea rows='5' columns='500' name='t1'></textarea>");
        //out.print("<input type='text' name='t2'>");
        //out.print("c<input type='checkbox' value='c' name='t1'>");
        //out.print("d<input type='checkbox' value='d' name='t1'>");
        out.print("<input type='submit' value='execute' name='b1'>");
    //  out.print("<input type='submit' value='show' name='b1'>");
        //out.print("<input type='submit' value='query' name='b1'>");

        String a,c;
        a=request.getParameter("t1");
        //b=request.getParameter("t2");
        c=request.getParameter("b1");
        if(c!=null)
            {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/saransh","root","");
                Statement st=con.createStatement();

                if(a.startsWith("delete"))
                {
                    out.print("<br>");
                    out.print("delete query execution...");         

                    //st.executeUpdate("insert into student2(name,address) values('"+a+"',"+b+"')") ;
                    st.executeUpdate(a);
            }

                else if(a.startsWith("select"))
                {   out.print("<br>");
                    out.print("select query execution...");         
                    ResultSet rs=st.executeQuery(a);
                    ResultSetMetaData m1=rs.getMetaData();
                    out.print("<br>");
                    for(int i=1;i<=m1.getColumnCount();i++)
                    {String x1=m1.getColumnLabel(i);
                    out.print("   "+x1);}
                    out.print("<br>");//name of label               
                    while(rs.next())
                {   String s0=rs.getString("Stu_roll");
                    String s1=rs.getString("name");
                    String s2=rs.getString("address");

                out.print(s0+"   "+s1+"   "+s2);
                    out.print("<br>");  
                    }}

                else if(a.startsWith("insert"))
                {   out.print("<br>");
                out.print("insert query execution...");         

                    st.executeUpdate(a);
                }

                else if(a.startsWith("drop"))
                {   out.print("<br>");
                out.print("drop query execution...");           

                    st.executeUpdate(a);
                }
                } catch (Exception e) {

                out.print(e);
                // TODO: handle exception
            }
            }


        out.print("&lt;/form>");
        out.print("&lt;/body>");
        out.print("&lt;/html>");

コメント行を削除します。唯一の問題は、クエリで大文字と小文字が区別されることです。'大文字と小文字を区別しない'にするために使用する文字列操作を理解できます。

于 2013-10-11T10:01:24.307 に答える