0

私は BindingSource を使用しており、SQL コードを使用して内部結合を実行したいと考えています。これに対する私のコードは機能しません

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'";

しかし、以下は機能します

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

InnerJoin クエリを実行してデータグリッドビューを更新するにはどうすればよいですか?

4

2 に答える 2

1

データソースを変更します。

結合を使用してビューを作成します。

そのビューをデータバインディングのデータソースとして使用します。

必要に応じてフィルターを使用します。

フィルタがwhere句の一部になることを忘れないでください。

于 2012-04-12T15:25:05.993 に答える
1

BindingSource.Filter、 にすでにロードされているデータにフィルタを適用しますDataGridView。したがって、アカウントが表示されていて、1 つの特定のアカウントを探している場合は、そのデータをアカウント番号でフィルター処理します。

Filter、別の SQL クエリを実行できません。

そのデータに対して を実行する場合INNER JOINは、別の検索を実行して をロードする必要がありますDataGridView。フィルターを実行したくないように聞こえますが、同じグリッド内のデータに 2 つの別々のセットを表示したいと考えています。

基本的なプロセスは次のとおりです。

  1. DataGridView を読み込みます
  2. 使用して、必要なフィルターまたはレコードを選択します
  3. INNER JOIN で 2 回目の検索を実行します
  4. 新しいデータで DataGridView をリロードします。

ここで編集して、開始する可能性のあるコードをいくつか示します。

方法: Windows フォーム DataGridView コントロールにデータをバインドする

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

データがグリッドにバインドされたら、ユーザーに何らかのフィルター方法を提供しますが、ユーザーにデータを再度検索してもらいたいとします。そのため、実行する SQL を選択するために何らかの方法でコードを使用する必要があります。したがって、ユーザーの選択に基づいて設定した文字列として SQL を GetData() に渡すことができます。

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

次に、新しいクエリに基づいてデータを再バインドします。

于 2012-04-12T15:16:23.993 に答える