私がやろうとしているのは、多くの Oracle データベース (少なくとも 12 個) で同じ SQL 選択を実行し、出力を Gridview に表示することです。
機能するものをハックしましたが、残念ながら非常に遅いです。ダースのデータベースのうち少なくとも 1 つが常に到達不能であるか、エラー状態にあるという事実によって悪化していると思います。
遅いだけでなく、それが最善の方法ではなく、「.NET」のようなものでもないと思わずにはいられません。
過去に、各データベースに順番に接続し、SQL を実行して別の を書き込むだけの単純なループを PHP で作成し<tr>
たことがあります。これは、特定のクエリに対して少なくとも 2 倍の速さで動作します。でも、それだけでは満足できないので、知識を増やしたいと思います!
私は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)
更新: 1 つまたはすべてのデータベースのストアド プロシージャではなく、ASP.NET コードから多くのデータベースに接続する理由、または 1 つのデータベースに複製する理由は 2 つあります。まず、問題のデータベースは、いくつかの同様の本番環境 (通常は各クライアントの開発、テスト、およびサポート) の頻繁に更新されるレプリカであるため、実際のデータベースに対して行われることはすべて、いずれにせよリロードされるため、定期的に更新またはやり直す必要があります。第二に、実行される可能性のあるクエリの種類が事前にわかりません。このフォームを使用するselect count (name) from dbusers
と、最初に dbusers テーブルをマスター データベースに複製することを考える必要なく、12 のデータベースに対して入力するだけで済みます。