ASP.Net:DataTable不是通过引用传递给函数的

本文关键字:引用 函数 Net DataTable ASP | 更新日期: 2023-09-27 18:29:14

我正试图编写一个应用程序,该应用程序必须处理多个DataTables,并为每个DataTables多次查询SQL服务器。我最终创建了这个函数:

        protected void QueryExec(string Query, DataTable Table, bool append = false) {
        if (!append)
            Table = new DataTable();
        SqlConnection Connector = new SqlConnection(/*connection data here*/);
        SqlCommand Command = new SqlCommand(Query, Connector);
        Connector.Open();
        SqlDataAdapter Adapter = new SqlDataAdapter(Command);
        Adapter.Fill(Table);
        Connector.Close();
    }

避免每次都写同样的东西。然而,现在我正在尝试实际运行代码,我遇到了一个问题。如果我在页面加载/按下按钮期间执行以下功能:

        protected void OrderListGrab() {
        var Query = "query";
        QueryExec(Query, OrderList);
        MainGridView.AllowPaging = true;
        MainGridView.DataSource = OrderList;
        MainGridView.DataBind();
        MainGridView.Font.Size = 9;
    }

我最后得到了一个空的数据表。然而,如果我用这行代替:

        QueryExec(Query, OrderList);

有了这个:

        SqlConnection Connector = new SqlConnection(/*connection data here*/);
        SqlCommand Command = new SqlCommand(Query, Connector);
        Connector.Open();
        SqlDataAdapter Adapter = new SqlDataAdapter(Command);
        Adapter.Fill(OrderList);
        Connector.Close();

然后一切都很好,数据在我的DataTable中(可以看到它被放入DataGridView并正确导出到Excel)。

我对任何网络编程都很陌生,所以这种行为让我很困惑。有人知道这段代码出了什么问题吗?

ASP.Net:DataTable不是通过引用传递给函数的

这可能是因为下面的代码块正在创建一个新的数据表。您的方法签名为QueryExec(string Query, DataTable Table, bool append = false),并且您正在调用QueryExec(Query, OrderList)。因此,变量append = false以及下面的代码块最终创建了一个新的DataTable实例。

    if (!append)
        Table = new DataTable();

您的方法必须返回DataTable,因为在您的方法中,您没有发送对DataTable 的引用

 protected DataTable QueryExec(string Query,DataTable Table, bool append = false) {
    if (!append)
        Table = new DataTable();
    SqlConnection Connector = new SqlConnection(/*connection data here*/);
    SqlCommand Command = new SqlCommand(Query, Connector);
    Connector.Open();
    SqlDataAdapter Adapter = new SqlDataAdapter(Command);
    Adapter.Fill(Table);
    Connector.Close();
    return Table;
}

如果您想将指针传递给您的对象,也可以使用ref

 protected void QueryExec(string Query,ref DataTable Table, bool append = false) {
    if (!append)
        Table = new DataTable();
    SqlConnection Connector = new SqlConnection(/*connection data here*/);
    SqlCommand Command = new SqlCommand(Query, Connector);
    Connector.Open();
    SqlDataAdapter Adapter = new SqlDataAdapter(Command);
    Adapter.Fill(Table);
    Connector.Close();
}