我要做的是在许多 Oracle 数据库(至少十几个)上运行相同的 SQL 选择,并在 Gridview 中显示输出。
我已经拼凑了一些可行的东西,但不幸的是它很慢。我认为,十几个数据库中至少有一个总是无法访问或处于错误状态的事实加剧了这种情况。
除了很慢,我不禁认为这不是最好的方法,也不是很像“.NET”。
我在过去写过类似的东西,作为 PHP 中的一个简单循环,它只是依次连接到每个数据库,运行 sql 并写入另一个<tr>
,对于给定的查询,它的运行速度至少快两倍。但我对此并不满意,我想提高我的知识!
我正在学习 C# 和 ASP.NET,所以请原谅可怕的代码 :)
public void BindData(string mySQL)
{
OracleConnection myConnection;
OracleDataAdapter TempDataAdapter;
DataSet MainDataSet = new DataSet();
DataTable MainDataTable = new DataTable();
DataSet TempDataSet;
DataTable TempDataTable;
string connectionString = "";
Label1.Visible = false;
Label1.Text = "";
foreach (ListItem li in CheckBoxList1.Items)
{
if (li.Selected)
{
connectionString = "Data Source=" + li.Text + "";
connectionString += ";Persist Security Info=True;User ID=user;Password=pass;Unicode=True";
myConnection = new OracleConnection(connectionString);
try
{
TempDataAdapter = new OracleDataAdapter(mySQL, myConnection);
TempDataSet = new DataSet();
TempDataTable = new DataTable();
TempDataAdapter.Fill(TempDataSet);
TempDataTable = TempDataSet.Tables[0].Copy();
/* If the main dataset is empty, create a table by cloning from temp dataset, otherwise
copy all rows to existing table.*/
if (MainDataSet.Tables.Count == 0)
{
MainDataSet.Tables.Add(TempDataTable);
MainDataTable = MainDataSet.Tables[0];
}
else
{
foreach (DataRow dr in TempDataTable.Rows)
{
MainDataTable.ImportRow(dr);
}
}
}
catch (OracleException e)
{
Label1.Visible = true;
Label1.Text = Label1.Text + e.Message + " on " + li.Text + "<br>";
}
finally
{
if (myConnection != null)
{
myConnection.Close();
myConnection = null;
}
TempDataSet = null;
TempDataAdapter = null;
TempDataTable = null;
}
}
}
GridView1.DataSourceID = String.Empty;
if (MainDataSet.Tables.Count != 0)
{
GridView1.DataSource = MainDataSet;
if (GridView1.DataSource != null)
{
GridView1.DataBind();
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
BindData(TextBox1.Text);
}
谢谢!
更新:SQL 代码各不相同,为了测试,我使用了非常简单的查询,例如select sysdate from dual
or select name from v$database
。在最终使用中,它会复杂得多,我的想法是我应该能够运行几乎任何东西,因此BindData(TextBox1.Text)
更新:从 ASP.NET 代码连接到许多数据库而不是一个或所有数据库上的存储过程或复制到一个数据库的原因是双重的。首先,有问题的数据库是几个类似生产环境(通常是开发、测试和支持每个客户端)的频繁更新副本,因此对实际数据库所做的任何事情都必须定期更新或重做,因为它们无论如何都会重新加载。其次,我事先不知道可能会运行什么样的查询,这种形式让我只需select count (name) from dbusers
针对十几个数据库键入例如,而无需首先考虑将 dbusers 表复制到主数据库。