来自 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 的长查询的主要内容,如果未能解决你的问题,请参考以下文章

更新查询在node-oracledb模块中挂起

ORA-00900: 无效的 SQL 语句 - 使用 node-oracledb 运行查询时

“npm ERR!errno 3221225477”使用 oracledb 进行查询时节点出错

npm install node-oracledb 失败

linux上的Node-oracledb无效的ELF标头

我正在尝试从面临以下错误的节点连接到 oracledb