2017-11-13 4 views
0

Ich möchte ein Datagrid anzeigen, das Datensätze basierend auf einer Abfrage von meiner Suchschaltfläche zurückgibt, aber jedes Mal, wenn ich auf die Suchschaltfläche klicke, werden alle Datensätze aus der Datenbank zurückgegeben.Visual C# Datagrid gibt alle Datensätze aus der Datenbank zurück

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; 
     } 
    } 

Ich möchte Datensätze angezeigt werden, die den Client-Code auf dem Textfeld übereinstimmen, aber es zurückgeben immer alle Datensätze aus der Datenbank.

+0

Wo ist Ihr Code? –

+0

Nur gepostet, tut mir leid, ich bin neu in diesem –

+0

Sie sollten auch einen Parameter für client_code verwenden, um die Verkettung einer Zeichenfolge in die Abfrage (die ein SQL-Injection-Risiko ist) zu vermeiden. Hat ClientCode.Text tatsächlich einen Wert beim Debuggen? – pmcilreavy

Antwort

0

Ich kann die Frage nicht kommentieren, also werde ich sie hier fragen.

Sie scheinen die gleiche Abfrage zweimal auszuführen. Einmal um zu sehen, ob es irgendwelche Zeilen hat und das zweite Mal, um das Datenraster zu füllen. Sie können dies ändern, so dass die Abfrage nur einmal ausgeführt wird.

Eine Möglichkeit zum Verhindern von SQL Injection-Angriffen besteht darin, eine gespeicherte Prozedur zu verwenden, anstatt die Abfrage direkt mithilfe der Zeichenfolgeninterpolation zu erstellen. Verwenden Sie eine gespeicherte Prozedur und übergeben Sie Ihre Bedingungen mithilfe von Parametern.

Hier ist ein Link, der erklärt, wie man

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

0

Wie über diese Version erstellen?

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; 
     } 
    } 
} 
Verwandte Themen