来自 OracleDB 的长查询
Posted
技术标签:
【中文标题】来自 OracleDB 的长查询【英文标题】:Long Query from OracleDB 【发布时间】:2014-02-24 06:52:55 【问题描述】:我创建了一个对 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();
它正在工作,但执行需要很长时间,而且我的函数中有很多查询。 如何更改代码以减少请求时间?
【问题讨论】:
你想做什么,能用文字描述一下吗? 这看起来像是您可以在单个查询中执行的操作,但正如建议的那样,实际上描述您想要实现的目标,而不是期望我们从没有 cmets 的复杂代码中解决它是个好主意。 用户选择词=行;程序获取对 ROW = 用户字的表的请求,然后程序获取对另一个表的请求,其中包含来自第一个查询的数据。并将第二个数据添加到组合框 你明白我的意思吗? )) 【参考方案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());
为了清楚起见,我省略了一些细节,但如果您需要一些说明,请告诉我
【讨论】:
【参考方案2】:在这种情况下,您确实需要使用绑定变量。 Oracle 会将您的查询的每一次出现都解析为一个全新的查询,这将大大减慢速度。我不是开发人员,所以我不能告诉你如何将它应用到 C#,但你应该先阅读这篇关于该主题的有用文章:
http://www.akadia.com/services/ora_bind_variables.html
【讨论】:
以上是关于来自 OracleDB 的长查询的主要内容,如果未能解决你的问题,请参考以下文章
ORA-00900: 无效的 SQL 语句 - 使用 node-oracledb 运行查询时