0

ProductDB(データベース)から検索を作成しようとしています。ユーザーに検索してもらいたい主な列は、Material_NoとProduct_Lineです。

これまでのところ、私は次のものを持っています:

ドロップダウンリスト

<asp:DropDownList ID="DropDownList" runat="server" Height="16px" 
        onclick="SearchButton_Click" Width="144px" 
        AutoPostBack="True">
        <asp:ListItem>Please select...</asp:ListItem>
        <asp:ListItem Value="0">Material No</asp:ListItem>
        <asp:ListItem Value="1">Product Line</asp:ListItem>
    </asp:DropDownList>

TextBox

<asp:TextBox ID="TextBox1" runat="server" ontextchanged="TextBox1_TextChanged">
</asp:TextBox>

検索ボタン

<asp:Button ID="SearchButton" runat="server" Text="Search" 
onclick="SearchButton_Click" />

だから私がやろうとしているのは、ユーザーが検索ボタンをクリックした後に材料番号または製品ラインを入力するときに材料番号または製品ラインのいずれかを選択した場合、結果はグリッド形式または同様のもので表示され、検索をクリックするだけの場合です何も選択せずに、すべての結果が表示されます。

これが私がこれまでにしたことです。

古いコード

protected void SearchButton_Click(object sender, EventArgs e)
    {
        string  Selectedvalue = DropDownList.SelectedItem.Value;
        if (DropDownList.SelectedItem.ToString() == "Material No")
        {
            MessageBox.Show("Material No selected");
            string textbox = TextBox1.Text;
            MessageBox.Show(textbox.ToString());

            SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=ROG;Integrated Security=True");

            DataSet dsData = new DataSet();

            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "SELECT * FROM ProductDB WHERE Material_No ='" + TextBox1.Text + "'";
            cmd.Connection = conn;

            conn.Open();

            SqlDataAdapter da = new SqlDataAdapter("", conn);

            SqlCommandBuilder cmdBldr = new SqlCommandBuilder(da);
            da.Fill(dsData, TextBox1.Text);

            MessageBox.Show("Connection Successful");
            conn.Close(); 
        }
        else
        {
            MessageBox.Show("Product Line selected");
        }


    }

新しいコード

private SqlConnection conn;
private SqlDataAdapter daMaterial;
private SqlDataAdapter daProduct;

private SqlCommand cmdMaterial;
private SqlCommand cmdProduct;

private SqlParameter paramMaterial;
private SqlParameter paramProduct;

private DataSet dsMaterial;
private DataSet dsProduct;
private DataGrid dgMaterial;
private DataGrid dgProduct;

private const string tableNameMaterial = "Material_No";
private const string tableNameProduct = "Product_Line";
enter code here
protected void SearchButton_Click(object sender, EventArgs e)
    {
        string Selectedvalue = DropDownList.SelectedItem.Value;
        if (DropDownList.SelectedItem.ToString() == "Material No")
        {
            //MessageBox.Show("Material No. Selected");
            string textbox = TextBox1.Text;
            //MessageBox.Show(textbox.ToString());

            conn = new SqlConnection("Data Source=localhost;Initial Catalog=ROG;Integrated Security=True");
            dsMaterial = new DataSet(); 
            daMaterial = new SqlDataAdapter("SELECT * FROM ProductDB WHERE Material_No = @Material_No", conn);
            daMaterial.SelectCommand.CommandText = "SELECT * FROM ProductDB WHERE Material_No = @Material_No";
            paramMaterial = new SqlParameter();
            paramMaterial.ParameterName = "@Material_No";
            paramMaterial.Value = TextBox1.Text;

            daMaterial.SelectCommand = cmdMaterial;
            cmdMaterial.Parameters.Add("@Material_No", SqlDbType.BigInt).Value = TextBox1.Text;

            daMaterial.Fill(dsMaterial, tableNameMaterial);              

            //MessageBox.Show("Connection Successful");
            conn.Close();
        }
        else
        {
            //MessageBox.Show("Product Line selected");
            string textbox = TextBox1.Text;
            //MessageBox.Show(textbox.ToString());


            conn = new SqlConnection("Data Source=localhost;Initial Catalog=ROG;Integrated Security=True");
            dsProduct = new DataSet();
            daProduct = new SqlDataAdapter("SELECT * FROM ProductDB WHERE Product_Line = @Product_Line", conn);
            daProduct.SelectCommand.CommandText = "SELECT * FROM ProductDB WHERE Product_Line = @Product_Line";
            paramProduct = new SqlParameter();
            paramProduct.ParameterName = "@Product_Line";
            paramProduct.Value = TextBox1.Text;

            daProduct.SelectCommand = cmdProduct;
            cmdProduct.Parameters.Add("@Product_Line", SqlDbType.VarChar, 50).Value = TextBox1.Text;
            conn.Open();
            daProduct.Fill(dsProduct, tableNameProduct);

            //MessageBox.Show("Connection Successful");
            conn.Close();
        }


    }

「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。

Parameter誰かが使用が正しいかどうかを確認できますかSqlDataAdapter

4

3 に答える 3

1
    protected void btnSearch_Click(object sender, EventArgs e)
    {
        string Query = string.Empty;
        try
        {
            if (sqlCon.State == ConnectionState.Closed)
            {
                sqlCon.Open();
            }
            if (DropDownList1.SelectedValue.ToString() == "Name")
            {
                Query = "select * from tbl_Employee where Name Like '" + txtSearchName.Text +  "%'";
            }
            else if (DropDownList1.SelectedValue.ToString() == "Designation")
            {
                Query = "select * from tbl_Employee where Designation Like '" + txtSearchName.Text + "%'";
            }
            SqlDataAdapter sqlDa = new SqlDataAdapter(Query, sqlCon);
            DataSet Ds = new DataSet();
            sqlDa.Fill(Ds);
            dgvEmployee.DataSource = Ds;
            dgvEmployee.DataBind();
        }
        catch (Exception ex)
        {

            HttpContext.Current.Response.Write("<script>alert('wfrmGrid: 11')</script>" + ex.Message);
        }

    }
于 2013-12-01T06:41:10.283 に答える
0

いくつかのこと:

daProduct = new SqlDataAdapter("SELECT * FROM ProductDB WHERE Product_Line = @Product_Line", conn);

新しいを作成し、それを とSqlDataAdapterで初期化します。したがって、次の行は冗長であり、本質的にエラーが発生しやすくなります。SelectCommandCommandTextConnection

  1. daProduct.SelectCommand.CommandText = "SELECT * FROM ProductDB WHERE Product_Line = @Product_Line";
  2. daProduct.SelectCommand = cmdProduct;

2番目の命令は、最初の命令を新しいものでオーバーライドし、使用したことはCommandText ありConnectionません。

paramProduct = new SqlParameter();

このパラメーターなしのコンストラクターを使用する代わりに、私が使用するAddWithValueParameters.Add、エラーが発生しにくいコンストラクターを使用します(たとえば、型を指定していない場合)。

cmdProduct.Parameters.Add( ....

今、あなたは私が提案した方法を使用していませんparamProduct。また、管理されていないリソースを破棄することはありません(たとえば、エラーが発生した場合に接続が開いたままになります)using。したがって、-statementを使用します。ところで、を使用するDataAdapter場合は、接続を開閉する必要さえありません。これは、で暗黙的に行われDataAdapter.Fillます。

申し訳ありませんが、あなたのコードは混乱しています。あなたのコードをいじくり回す代わりに、動作するはずのクリーンなバージョンを提供します。

....
else
{
    using(var con =  new SqlConnection("Data Source=localhost;Initial Catalog=ROG;Integrated Security=True"))
    using (var daProduct = new SqlDataAdapter("SELECT * FROM ProductDB WHERE Product_Line = @Product_Line", con))
    {
        daProduct.SelectCommand.Parameters.Add("@Product_Line", SqlDbType.VarChar, 50).Value = TextBox1.Text;
        dsProduct = new DataSet();
        daProduct.Fill(dsProduct, "Product_Line");
    }
}
于 2013-01-30T09:32:40.190 に答える
0

次のコードが機能しています。

private const string tableNameMaterial = "Material_No";
private const string tableNameProduct = "Product_Line";

protected void SearchButton_Click(object sender, EventArgs e)
    {
        string Selectedvalue = DropDownList.SelectedItem.Value;
        if (DropDownList.SelectedItem.ToString() == "Material No")
        {
            //MessageBox.Show("Material No. Selected");
            string textbox = TextBox1.Text;
            //MessageBox.Show(textbox.ToString());

            SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=ROG;Integrated Security=True");
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;

            cmd.CommandText = "SELECT * FROM ProductDB WHERE Material_No = @Material_No";
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.Add("@Material_No", SqlDbType.BigInt);
            cmd.Parameters["@Material_No"].Value = TextBox1.Text;

            SqlDataAdapter daMaterial = new SqlDataAdapter();
            daMaterial.SelectCommand = cmd;

            DataSet dsMaterial = new DataSet();
            conn.Open();
            daMaterial.Fill(dsMaterial, tableNameMaterial);

            //MessageBox.Show("Connection Successful");
            GridView1.DataSource = dsMaterial;
            GridView1.DataBind();

            conn.Close();
        }
        else
        {
            //MessageBox.Show("Product Line selected");
            string textbox = TextBox1.Text;
            //MessageBox.Show(textbox.ToString());

            SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=ROG;Integrated Security=True");
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;

            cmd.CommandText = "SELECT * FROM ProductDB WHERE Product_Line = @Product_Line";
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.Add("@Product_Line", SqlDbType.VarChar);
            cmd.Parameters["@Product_Line"].Value = TextBox1.Text;

            SqlDataAdapter daProduct = new SqlDataAdapter();
            daProduct.SelectCommand = cmd;

            DataSet dsProduct = new DataSet();
            conn.Open();
            daProduct.Fill(dsProduct, tableNameProduct);

            //MessageBox.Show("Connection Successful");
            GridView1.DataSource = dsProduct;
            GridView1.DataBind();

            conn.Close();
        }


    }

今、私はデータベースからの文字をオートコンプリートするための検索ボックスが必要です...誰かが何か提案があれば、それを共有してください。

ありがとうございました

于 2013-01-30T11:44:07.797 に答える