我已经创建了对oracle db的查询
Dictionary<decimal, decimal> Dict = new Dictionary<decimal, decimal>();
string strSelectIdWork = "SELECT COLUMN FROM my_tb WHERE ROW='" + Row + "'";
dataAdapter.Fill(ds, "my_tb");
foreach (DataRow row in ds.Tables["my_tb"].Rows)
{
foreach (DataColumn column in ds.Tables["my_tb"].Columns)
{
Dict.Add(Dict.Count + 1, Convert.ToDecimal(row[column]));
}
}
foreach (decimal someVar in Dict.Values)
{
OleDbCommand command = myAccessConn.CreateCommand();
OleDbTransaction trans = myAccessConn.BeginTransaction();
command.Transaction = trans;
command.CommandText = "SELECT COLUMN FROM my_tb2 WHERE ROW='" + someVar + "'";
command.ExecuteNonQuery();
nb = Convert.ToString(command.ExecuteScalar());
comboBox2.Items.Add(nb;
trans.Commit();
}
它正在运行,但执行需要很长时间,而且我的函数中有很多查询。 如何更改代码以减少请求的时间?
答案 0 :(得分:1)
我不太确定你想要实现的目标,但是你是否意识到你在这里建立了无数的数据库连接?...
foreach (decimal someVar in Dict.Values)
{
OleDbCommand command = myAccessConn.CreateCommand();
OleDbTransaction trans = myAccessConn.BeginTransaction();
command.Transaction = trans;
command.CommandText = "SELECT COLUMN FROM my_tb2 WHERE ROW='" + someVar + "'";
command.ExecuteNonQuery();
nb = Convert.ToString(command.ExecuteScalar());
comboBox2.Items.Add(nb;
trans.Commit();
}
无论此查询返回的总行数是多少......
"SELECT COLUMN FROM my_tb WHERE ROW='" + Row + "'"
将等于您将要打开的数据库连接总数...不要提及您将要打开的总交易量。您真的需要为此选择查询运行事务吗?
为什么不将所有字典值检索到数组中...
var values = Dict.Values.ToArray();
然后将值加入CSV字符串....
var @param = string.Join(",", values);
并将此@params
字符串传递给IN
子句
command.CommandText = "SELECT COLUMN FROM my_tb2 WHERE ROW IN(" + @param + ")";
var reader = command.ExecuteReader();
while(reader.Read())
{
comboBox2.Items.Add(reader["COLUMN"].ToString());
}
为了清楚起见,我省略了一些细节,但如果您需要澄清,请告诉我
答案 1 :(得分:0)
你真的需要在这种情况下使用绑定变量。 Oracle会将您查询的每个问题解析为一个完整的新查询,这会大大减慢速度。我不是开发人员,因此我无法告诉您如何将其应用于C#,但您应该首先阅读有关该主题的有用文章: