C# 在tableadapter上执行自定义查询

C# 在tableadapter上执行自定义查询,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,我希望能够对我拥有的表适配器执行自定义SQL查询。有可能这样做吗?或者,我只能在“数据集设计”视图中的每个表适配器上使用预定义查询吗 如果我不能做到这一点,我将如何对表执行SQL查询,并在绑定到表适配器的datagridview中显示结果 谢谢 编辑:我没有正确地解释我自己。我知道如何使用数据集设计器向tableadapter添加查询。我的问题是,我需要执行一个定制的SQL脚本,该脚本是根据现有的表适配器动态构建的 在数据集设计器中将查询添加到TableAdapter的步骤 在数据集设计器中打开

我希望能够对我拥有的表适配器执行自定义SQL查询。有可能这样做吗?或者,我只能在“数据集设计”视图中的每个表适配器上使用预定义查询吗

如果我不能做到这一点,我将如何对表执行SQL查询,并在绑定到表适配器的datagridview中显示结果

谢谢

编辑:我没有正确地解释我自己。我知道如何使用数据集设计器向tableadapter添加查询。我的问题是,我需要执行一个定制的SQL脚本,该脚本是根据现有的表适配器动态构建的

在数据集设计器中将查询添加到TableAdapter的步骤

在数据集设计器中打开数据集。有关详细信息,请参见如何:在数据集设计器中打开数据集

右键单击所需的TableAdapter,然后选择添加查询

-或-

将查询从工具箱的“数据集”选项卡拖到设计器上的表上

将打开TableAdapter查询配置向导


完成向导;查询被添加到TableAdapter。

我发布了一条注释,指向使用VB创建扩展TableAdapter的类的示例。我将展示如何在不创建扩展TableAdapter的类的情况下实现这一点,而不是使用VB示例并用C重写它

基本上创建一个BackgroundWorker来执行sql查询。你不必这么做,但那会很好。根据用户的输入生成查询字符串

    private void queryBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //Initialize sqlconnection
        SqlConnection myConnection;

        //Convert date in to proper int format to match db
        int fromDate = int.Parse(dateTimePickerStartDate.Value.ToString("yyyyMMdd"));
        int toDate = int.Parse(dateTimePickerEndDate.Value.ToString("yyyyMMdd"));

        //Setup Parameters
        SqlParameter paramFromDate;
        SqlParameter paramToDate;
        SqlParameter paramItemNo;
        SqlParameter paramCustomerNo;

        //Fill the data using criteria, and throw any errors
        try
        {
            myConnection = new SqlConnection(connectionString);
            myConnection.Open();
            using (myConnection)
            {
                using (SqlCommand myCommand = new SqlCommand())
                {
                    //universal where clause stuff
                    string whereclause = "WHERE ";

                    //Add date portion
                    paramFromDate = new SqlParameter();
                    paramFromDate.ParameterName = "@FromDate";
                    paramFromDate.Value = fromDate;

                    paramToDate = new SqlParameter();
                    paramToDate.ParameterName = "@ToDate";
                    paramToDate.Value = toDate;

                    myCommand.Parameters.Add(paramFromDate);
                    myCommand.Parameters.Add(paramToDate);

                    whereclause += "(TableName.date BETWEEN @FromDate AND @ToDate)";

                    //Add item num portion
                    if (!string.IsNullOrEmpty(itemNo))
                    {
                        paramItemNo = new SqlParameter();
                        paramItemNo.ParameterName = "@ItemNo";
                        paramItemNo.Value = itemNo;

                        myCommand.Parameters.Add(paramItemNo);

                        whereclause += " AND (Tablename.item_no = @ItemNo)";
                    }

                    //Add customer number portion
                    if (!string.IsNullOrEmpty(customerNo))
                    {
                        paramCustomerNo = new SqlParameter();
                        paramCustomerNo.ParameterName = "@CustomerNo";
                        paramCustomerNo.Value = customerNo;

                        myCommand.Parameters.Add(paramCustomerNo);

                        whereclause = whereclause + " AND (Tablename.cus_no = @CustomerNo)";
                    }


                    string sqlquery = "SELECT * FROM TableName ";
                    sqlquery += whereclause;

                    //MessageBox.Show(sqlquery);

                    myCommand.CommandText = sqlquery;
                    myCommand.CommandType = CommandType.Text;
                    myCommand.Connection = myConnection;

                    this.exampleTableAdapter.ClearBeforeFill = true;
                    this.exampleTableAdapter.Adapter.SelectCommand = myCommand;
                    this.exampleTableAdapter.Adapter.Fill(this.ExampleDataSet.ExampleTable);
                }
            }
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

我个人喜欢编写一个扩展TableAdapter的类,但这是回答OP问题的一种简单快捷的方法。抱歉花了一年的时间:

我知道这已经有一年了,但我觉得很奇怪,没有人在c中记录解决方案。当我完成我的项目时,如果我还记得的话,我会在这里发布一个解决方案,但这里有一个链接,显示了如何在VB中完成它: