我想要做的是在許多Oracle數據庫(至少一打)上運行相同的SQL選擇,並在GridView中顯示輸出。在ASP.NET中查詢許多數據庫的好方法
我把一些有用的東西一起砍了,但不幸的是它很慢。我認爲這個事實加劇了這樣一個事實,即至少有一個數據庫總是無法訪問,或者處於錯誤狀態。
除了緩慢,我不禁認爲這不是最好的方式,也不是'.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
或select name from v$database
。在最終的使用中,它會複雜得多,我的想法是,我應該可以運行任何東西,因此可以運行幾乎所有的東西,因此更新:從ASP.NET代碼連接到許多數據庫而不是在一個或所有dbs上存儲過程,或複製到一個db,是雙重的。首先,有問題的dbs經常更新幾個類似生產環境的副本(通常是爲每個客戶端開發,測試和支持),因此對於實際的dbs所做的任何事情都必須定期更新或重新定義,因爲它們無論如何都會被重新加載。其次,我不知道什麼樣的查詢可以運行,這個表單可以讓我輸入例如select count (name) from dbusers
而不必先考慮將dbusers表複製到主數據庫。
非常晚的更新...你的代碼實際上幾乎是完美的! 如果更改: MainDataAdapter.SelectCommand.ConnectionString = connectionString to: MainDataAdapter.SelectCommand.Connection.ConnectionString = connectionString; 它很好地工作 – 2009-01-15 11:51:19