Я пытаюсь запустить один и тот же SQL-выбор для многих баз данных Oracle (не менее десятка) и отобразить вывод в Gridview.
Я взломал что-то, что работает, но, к сожалению, это очень медленно. Я думаю, что это усугубляется тем фактом, что по крайней мере 1 из дюжины баз данных всегда будет недоступна или иным образом в состоянии ошибки.
Помимо того, что я медленный, я не могу не думать, что это не самый лучший способ сделать это и не очень похожий на .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
. В конечном счете, это будет намного сложнее, идея в том, что я должен быть в состоянии запустить почти все, поэтому BindData(TextBox1.Text)
ОБНОВЛЕНИЕ: Причина подключения к многим базам данных из кода ASP.NET, а не хранимого процесса на одном или всех БД, или репликации на один БД имеет две причины. Во-первых, рассматриваемые базы данных - это часто обновляемые реплики нескольких похожих производственных сред (как правило, разработка, тестирование и поддержка каждого клиента), поэтому все, что делается с фактическими базами данных, необходимо будет регулярно обновлять или переделывать, поскольку они все равно перезагружаются. Во-вторых, я не знаю заранее, какой запрос может быть запущен, эта форма позволяет мне просто напечатать, например. select count (name) from dbusers
против дюжины баз данных без необходимости сначала думать о репликации таблицы dbusers в главную базу данных.