2012-04-12 10 views
0

Ich bin BindingSource und ich möchte einige SQL-Code verwenden, um eine Inner Join durchzuführen. Mein Code für das nicht funktioniert,BindingSource.Filter mit Inner Join

ticketsBindingSource.Filter = "SELECT u.CallerName, t.* FROM users u INNER JOIN tickets t ON u.id = t.user WHERE u.CallerName = 'joe.smith' AND t.ProblemStatus = 'Open'"; 

Aber die folgende funktioniert

ticketsBindingSource.Filter = "ProblemStatus = 'Open'"; 

Wie kann ich meine InnerJoin Abfrage ausführen und meine Datagridview aktualisieren?

Antwort

1

Die BindingSource.Filter wendet einen Filter auf die Daten an, die bereits in Ihre DataGridView geladen wurden. Wenn Sie also Konten haben und nach einem bestimmten Konto suchen, würden Sie diese Daten nach Kontonummer filtern.

Die Filter, kann nicht eine andere SQL-Abfrage für Sie ausführen.

Wenn Sie für diese Daten eine INNER JOIN durchführen möchten, müssen Sie eine weitere Suche durchführen und die DataGridView laden. Es klingt so, als ob Sie keinen Filter ausführen möchten, aber Sie möchten zwei separate Sätze für Daten im selben Raster anzeigen.

Ihre grundlegende Prozess wäre:

  1. laden Sie datagridview
  2. Verwenden Sie den Filter oder Datensätze auswählt sie wollen
  3. Führt eine zweite Suche mit INNER JOIN
  4. laden Sie Ihre Datagridview mit dem neuen Daten.

EDIT hier einige Code, der Ihre gestartet bekommen könnte:

How to: Bind Data to the Windows Forms DataGridView Control

private void GetData(string selectCommand) 
{ 
    try 
    { 
     // Specify a connection string. Replace the given value with a 
     // valid connection string for a Northwind SQL Server sample 
     // database accessible to your system. 
     String connectionString = 
      "Integrated Security=SSPI;Persist Security Info=False;" + 
      "Initial Catalog=Northwind;Data Source=localhost"; 

     // Create a new data adapter based on the specified query. 
     dataAdapter = new SqlDataAdapter(selectCommand, connectionString); 

     // Create a command builder to generate SQL update, insert, and 
     // delete commands based on selectCommand. These are used to 
     // update the database. 
     SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); 

     // Populate a new data table and bind it to the BindingSource. 
     DataTable table = new DataTable(); 
     table.Locale = System.Globalization.CultureInfo.InvariantCulture; 
     dataAdapter.Fill(table); 
     bindingSource1.DataSource = table; 

     // Resize the DataGridView columns to fit the newly loaded content. 
     dataGridView1.AutoResizeColumns( 
      DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); 
    } 
    catch (SqlException) 
    { 
     MessageBox.Show("To run this example, replace the value of the " + 
      "connectionString variable with a connection string that is " + 
      "valid for your system."); 
    } 
} 

private void Button1_Click(object sender, EventArgs e) 
{ 
    // Bind the DataGridView to the BindingSource 
    // and load the data from the database. 
    dataGridView1.DataSource = bindingSource1; 
    GetData("select * from Customers"); 
} 

Sobald die Daten an das Raster gebunden ist, dann würden Sie dem Benutzer eine Möglichkeit zu filtern bieten, aber Sie möchten, dass sie die Daten erneut durchsuchen. Sie werden also im Code eine Art verwenden wollen, um auszuwählen, welche SQL Sie ausführen werden. So könnte man die SQL in GetData() als String übergeben, die Sie auf der Basis der Benutzer-Auswahl eingestellt haben

private void Button1_Click(object sender, EventArgs e) 
{ 
    // Bind the DataGridView to the BindingSource 
    // and load the data from the database. 
    dataGridView1.DataSource = bindingSource1; 

    string sqlQuery = string.Empty; 

    if(your check goes here) 
    { 
     sqlQuery = "select * from Customers"; 
    } 
    else 
    { 
     sqlQuery = "your new SQL"; 
    } 

    GetData(sqlQuery); 
} 

dann würden Sie Ihre Daten erneut binden basierend auf der neuen Abfrage.

+0

Ja, aber ich bin verwirrt. Bevor ich den visuellen Datenbinder in VS10 verwendet habe, um ein Dataset zu erstellen, binde und verwende die visuellen Tools, um meine Spalten und deren Header zu konfigurieren. Wie lade ich meine neuen Daten neu und führe die Inner Join-Abfrage durch? –

+0

Haben Sie Code, um die Daten an Ihr Datagrid zu binden? Wenn nicht, dann werde ich ein Beispiel für Sie finden. – Taryn

+0

Ich habe bisher 0 Zeilen Code. Alles wurde visuell gemacht. Aber können beide Wege gleichzeitig existieren? –

1

Ändern Sie Ihre Datenquelle.

erstellen Sie eine Ansicht mit dem Join.

Verwenden Sie diese Ansicht als Datenquelle für die Datenbindung.

und verwenden Sie den Filter, falls erforderlich.

Denken Sie daran, dass der Filter Teil der Where-Klausel wird.