我试图编写一个必须兼顾多个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)。
我对任何网络编程都很陌生,所以这种行为对我来说非常令人费解。有人知道这段代码有什么问题吗?
答案 0 :(得分:1)
这可能是因为您正在创建新数据表的下面的代码块。您的方法签名QueryExec(string Query, DataTable Table, bool append = false)
,而您正在调用QueryExec(Query, OrderList)
。因此,变量append = false
以及下面的代码块最终会创建一个新的DataTable实例。
if (!append)
Table = new DataTable();
答案 1 :(得分:0)
您的方法必须返回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();
}