【问题标题】:ASP.Net: DataTable not passed by reference to function?ASP.Net:DataTable 没有通过引用传递给函数?
【发布时间】:2016-01-06 14:17:01
【问题描述】:

我正在尝试编写一个应用程序,该应用程序必须处理多个数据表并为每个数据表多次查询 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)。

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

【问题讨论】:

  • 如果需要,您可以使用ref,但我会从方法中返回此DataTable。所以将其重命名为GetDataTable 并将void 更改为DataTable。但是您不应该将查询字符串传递给方法,这将是一个 sql 注入漏洞。而是为每个任务提供有意义的方法,例如 GetUsers 并使用 sql 参数。只将值传递给方法。
  • @TimSchmelter 这种方式确实有效,谢谢 :) 对于漏洞提示,我也没有考虑过使用这种方法的影响。

标签: c# sql asp.net sql-server datatable


【解决方案1】:

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

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

【讨论】:

  • 刚刚检查过,是的,就是这样。我没想到在这样的操作之后它会像这样“迷失”表格,但它确实如此。替换为Table.Clear() 可以让问题消失,并且仍然可以实现我最初想做的事情(确保我可以用全新的数据填充 DataTable 或轻松添加。谢谢 :)
【解决方案2】:

您的方法必须返回一个 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();
}

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2017-08-12
    • 2012-03-19
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2012-05-16
    • 2015-03-28
    • 2011-12-07
    相关资源
    最近更新 更多