Oracle数据库连接问题,高手请进。

asd1308855 2014-01-10 01:50:07
先贴代码。
Command = Connection.CreateCommand();
Command.CommandText = string.Format("select {0}.nextval from dual", country.SequenceName);
int id = int.Parse(Command.ExecuteScalar().ToString());
if (cellarray.ContainsKey("ID"))
cellarray["ID"] = id;
else
cellarray.Add("ID", id);
StringBuilder cell_sb = new StringBuilder();
cell_sb.AppendFormat("INSERT INTO {0}(", country.oracleTableName);
StringBuilder values_sb = new StringBuilder("VALUES(");
int i = 0;
foreach (KeyValuePair<string, object> cell in cellarray)
{
if (i != 0)
{
cell_sb.Append(',');
values_sb.Append(',');
}
cell_sb.AppendFormat("\"{0}\"", cell.Key);
string paramName = string.Format(":{0}", cell.Key);
values_sb.Append(paramName);
Command.Parameters.Add(new Oracle.DataAccess.Client.OracleParameter(paramName, cell.Value));
i++;
}
Command.CommandText = string.Format("{0}) {1})", cell_sb, values_sb);
Command.ExecuteNonQuery();

方法用来拼接一个INSERT语句,最后执行。
需求是讲Excel中的数据,导入到Oracle数据库中,当连续执行40+万次,大概运行2小时左右,执行到红色代码位置,程序就停住不动。不会报异常,这是关掉本地连接后重新打开,红色语句报错。否则会卡在这里不运行。
尝试过的解决办法但都失败:
连续执行10万次后重新new OracleConnection,任然会遇到同样的问题。google了几篇文章,据说是由于连接池中的连接过期导致,但我是持续的执行INSERT操作,怎么会过期呢。采用Oracle.DataAccess.Client.OracleConnection.ClearAllPools()方法清空连接池后,问题依然存在。
请问有何其他解决办法?

...全文
304 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
a82344626 2014-01-22
  • 打赏
  • 举报
回复
Oracle.DataAccess.Client.OracleCommand.ArrayBindCount 这个设置下 然后付值就只要付一个数组
zhaolei_zsy 2014-01-22
  • 打赏
  • 举报
回复
引用 19 楼 zhaolei_zsy 的回复:
你一直在用序列去查出 Command.CommandText = string.Format("select {0}.nextval from dual", country.SequenceName); int id = int.Parse(Command.ExecuteScalar().ToString()); 我不清楚你要做什么,但我想是不是讲序列和触发器用作一起,那样你插入的时候就不需要再去序列去查询了。你要思考一下,40几万的数据,那样的数据量也不算小。
再接一下,你最好是在sql语句上好好下下功夫。
zhaolei_zsy 2014-01-22
  • 打赏
  • 举报
回复
你一直在用序列去查出 Command.CommandText = string.Format("select {0}.nextval from dual", country.SequenceName); int id = int.Parse(Command.ExecuteScalar().ToString()); 我不清楚你要做什么,但我想是不是讲序列和触发器用作一起,那样你插入的时候就不需要再去序列去查询了。你要思考一下,40几万的数据,那样的数据量也不算小。
leeya66 2014-01-17
  • 打赏
  • 举报
回复
是不是可以分批执行啊
水目 2014-01-17
  • 打赏
  • 举报
回复
一个Excel 40W+ 数据 是不是太大了???
asd1308855 2014-01-16
  • 打赏
  • 举报
回复
引用 15 楼 qq7413755 的回复:
我就说我现在看到的吧,,你每次读取数据后,然后打开连接,这是判断连接打开没有,如果没有,就把连接打开,然后将输入导入,导入完后,关闭连接,然后继续循环,这样绝对不会再出问题了吧
这个办法没用的。
黑黑黑眼圈 2014-01-16
  • 打赏
  • 举报
回复
我就说我现在看到的吧,,你每次读取数据后,然后打开连接,这是判断连接打开没有,如果没有,就把连接打开,然后将输入导入,导入完后,关闭连接,然后继续循环,这样绝对不会再出问题了吧
asd1308855 2014-01-16
  • 打赏
  • 举报
回复
继续等答案。 知情者请进~!
asd1308855 2014-01-15
  • 打赏
  • 举报
回复
引用 12 楼 F546445693 的回复:
[quote=引用 11 楼 zhaolei_zsy 的回复:] 你一直在循环读取excle的内容,十几万的数据,你拼接sql语句就需要2个小时。你打开数据库没有操作,没有关闭,最后只能是超时。
正解 连接一直在等待操作。 这么搞貌似数据库被你一个人挂起了吧! 别人还能用?? 个人觉得不建议这么用吧[/quote] 请注意看我的代码,2个小时不是什么事都没错。 每条数据拼接完成后都会立即提交到数据库。
F546445693 2014-01-14
  • 打赏
  • 举报
回复
引用 11 楼 zhaolei_zsy 的回复:
你一直在循环读取excle的内容,十几万的数据,你拼接sql语句就需要2个小时。你打开数据库没有操作,没有关闭,最后只能是超时。
正解 连接一直在等待操作。 这么搞貌似数据库被你一个人挂起了吧! 别人还能用?? 个人觉得不建议这么用吧
zhaolei_zsy 2014-01-14
  • 打赏
  • 举报
回复
你一直在循环读取excle的内容,十几万的数据,你拼接sql语句就需要2个小时。你打开数据库没有操作,没有关闭,最后只能是超时。
asd1308855 2014-01-13
  • 打赏
  • 举报
回复
周一了。 高手请进啊。
asd1308855 2014-01-11
  • 打赏
  • 举报
回复
恩 感谢你的提醒,我现在改为使用ODP的批量插入,已经挂上事务了,同时上传速度也有显著提升。 我就想搞懂,为啥会卡在哪不懂。什么原因。·
dianaly122 2014-01-11
  • 打赏
  • 举报
回复
你有事务写吧,你插入的数据很多,当你关闭的时候有可能还没插完,当你再次运行的时候又要重新开始插入,而你插入的是新的语句,没有调用update。所以有事务,到你停止的时候数据会自动回滚的 我用的是sql server我觉得原理应该一样
asd1308855 2014-01-11
  • 打赏
  • 举报
回复
有高手来帮忙解答吗?
asd1308855 2014-01-10
  • 打赏
  • 举报
回复
批量导入的方式可以提高程序性能,正在尝试修改。但我觉得可能还会遇到连接超时的问题。 这个问题造成的原因是什么呢? 求解。
lyc305213781 2014-01-10
  • 打赏
  • 举报
回复
看你用的是ODP.NET,既然你是批量导入几十万数据,为什么不适用它提供的大批量数据导入的API呢,安装ODP.NET之后应该都有例子的吧,可以照葫芦画瓢
asd1308855 2014-01-10
  • 打赏
  • 举报
回复
这个方法主要是负责拼接和执行一条INSERT语句。 cellarray只一个字典,其中包含了从Excel读取过来的所有列、值对。 外部是有方法来循环调用这个插入方法的。
_小黑_ 2014-01-10
  • 打赏
  • 举报
回复
看了 你的代码 你 只是 连续拼接 sql语句 并没有 连续执行 插入数据 方法 具体 如何 做 还是 看看 高手 吧

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧