2017-11-13 10 views
0

検索ボタンからのクエリに基づいてレコードを返すデータグリッドを表示したいが、検索ボタンをクリックするとデータベースからすべてのレコードが返される。データベースからすべてのレコードを返すVisual C#Datagrid

HTML

<html> 
<asp:TextBox ID="ClientCode" runat="server"></asp:TextBox> 
<asp:GridView ID="ClientDataGrid" runat="server" Height="111px" 
Width="202px" Visible="False"></asp:GridView> 

C#

private void rep_bind() 
    { 
     connection(); 
     string query = ""select * from client where client_code ='" + 
     ClientCode.Text + "'"; 
     SqlDataAdapter da = new SqlDataAdapter(query, con); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 
     ClientDataGrid.DataSource = ds; 
     ClientDataGrid.DataBind(); 
    } 

    private void InitializeComponent() 
    { 

    } 

    protected void search_Click(object sender, EventArgs e)   
    { 
     Label1.Text = ""; 
     connection(); 
     string query = string.Format("select * from client where client_code 
     ='" + ClientCode.Text + "'") ; ; 

     SqlCommand com = new SqlCommand(query, con); 
     com.Parameters.Add("@category", SqlDbType.NVarChar, 20).Value = 
     category.SelectedItem.Text; 
     SqlDataReader dr; 
     dr = com.ExecuteReader(); 

     ListItem selectedItem = category.SelectedItem; 
     if (string.IsNullOrWhiteSpace(ClientCode.Text) && 
      string.IsNullOrWhiteSpace(ClientName.Text)) 

     { 
      ClientDataGrid.Visible = false; 
      Label1.Visible = true; 
      Label1.Text = "Please Enter Correct Search Values"; 
     } 

     else if (dr.HasRows) 
     { 
      dr.Read(); 
      rep_bind(); 
      ClientDataGrid.Visible = true; 
     } 
     else 
     { 
      ClientDataGrid.Visible = false; 
     } 
    } 

私は、テキストボックスにクライアントコードと一致しますレコードを表示したいが、それは常に、データベースからすべてのレコードを返します。

+0

コードはどこですか? –

+0

はちょうど私があなたが(SQLインジェクションのリスクである)、クエリに文字列を連結避けるためにもclient_codeのパラメータを使用する必要があります。この –

+0

に新しいごめんなさい、それを掲載しました。 ClientCode.Textにはデバッグ時に実際に値がありますか? – pmcilreavy

答えて

0

実際の質問にはコメントできませんので、ここでお尋ねします。

あなたは二度同じクエリを実行しているようです。一度それが行を持っているとデータグリッドを埋めるためにもう一度参照してください。これを変更すると、クエリが1回だけ実行されます。

SQLインジェクション攻撃を防ぐ1つの方法は、文字列補間を使用して直接クエリを作成するのではなく、ストアドプロシージャを使用することです。ストアドプロシージャを使用し、パラメータを使用して条件を渡します。

ここではどのようにこのバージョンに関する1

https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/create-a-stored-procedure

0

を作成する方法について説明しますリンクですか?

using System; 
using System.Data; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     SqlCommand sCommand; 
     SqlDataAdapter sAdapter; 
     SqlCommandBuilder sBuilder; 
     DataSet sDs; 
     DataTable sTable;   

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string connectionString = "Data Source=.;Initial Catalog=pubs;Integrated Security=True"; 
      string sql = "SELECT * FROM Stores"; 
      SqlConnection connection = new SqlConnection(connectionString); 
      connection.Open(); 
      sCommand = new SqlCommand(sql, connection); 
      sAdapter = new SqlDataAdapter(sCommand); 
      sBuilder = new SqlCommandBuilder(sAdapter); 
      sDs = new DataSet(); 
      sAdapter.Fill(sDs, "Stores"); 
      sTable = sDs.Tables["Stores"]; 
      connection.Close(); 
      dataGridView1.DataSource = sDs.Tables["Stores"]; 
      dataGridView1.ReadOnly = true; 
      save_btn.Enabled = false; 
      dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
     } 

     private void new_btn_Click(object sender, EventArgs e) 
     { 
      dataGridView1.ReadOnly = false; 
      save_btn.Enabled = true; 
      new_btn.Enabled = false; 
      delete_btn.Enabled = false; 
     } 

     private void delete_btn_Click(object sender, EventArgs e) 
     { 
      if (MessageBox.Show("Do you want to delete this row ?", "Delete", MessageBoxButtons.YesNo) == DialogResult.Yes) 
      { 
       dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index); 
       sAdapter.Update(sTable); 
      } 
     } 

     private void save_btn_Click(object sender, EventArgs e) 
     { 
      sAdapter.Update(sTable); 
      dataGridView1.ReadOnly = true; 
      save_btn.Enabled = false; 
      new_btn.Enabled = true; 
      delete_btn.Enabled = true; 
     } 
    } 
} 
関連する問題