注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

sql大数据量插入的问题之四POSTGRESQL中的COPY的小错误  

2015-03-09 22:48:46|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

sql大数据量插入的问题之四POSTGRESQL中的COPY的小错误

在上面的Copy的博客中,封装了NpgsqlCopyIn这个类,应用到了现场上也没有问题,觉得就没有问题了。可是新同事误用了一种方法,也就是直接操作Copy,不调用任何其它动作。结果就是报一个空值异常。

反复复现这个问题,找不到原因,偶然间,提前做了一个Db.Select(“select *from  table”,””)这个动作,发现就能存储了。到数据库查找,发现确实成功。

回来后找到自己最初的测试库,发现前面也有Select语句,去除后,也无法保存。一时没了主意。上官网查了下资料。发现了问题,原来这些东西的配置里,其它的都无所谓,只有命令是动态生成的。也就是说,其它命令是直接操作的实时的字符串命令。

修改,测试了一下,OK。就想,会不会有类似于Builder中的刷新呢?试了几把,没有成功。如果大家有知道的可以教我。非常感谢。具体的代码如下:

不成功的:

            using (NpgsqlTransaction ntrans = this.BeginTransaction())

            {

                try

                {

                    string commandString = "COPY " + tableName + "  from STDIN";

                    this._command.CommandText = commandString;

                    //NpgsqlCommand cmd = new NpgsqlCommand(commandString,_connection);

                    this._nCopyIn = new NpgsqlCopyIn(this._command, this._connection,ms);

                    this._nCopyIn.Start();

                    ntrans.Commit();

                }

                catch (NpgsqlException ne)

                {

                    string s = ne.Message.ToString();

                    this._nCopyIn.Cancel(s);

                    ntrans.Rollback();

                    return -1;

                }

                finally

                {

                    this._nCopyIn.End();

                }

            }

成功的:

            using (NpgsqlTransaction ntrans = this.BeginTransaction())

            {

                try

                {

                    string commandString = "COPY " + tableName + "  from STDIN";

                    this._command.CommandText = commandString;

                    NpgsqlCommand cmd = new NpgsqlCommand(commandString,_connection);

                    this._nCopyIn = new NpgsqlCopyIn(cmd, this._connection,ms);

                    this._nCopyIn.Start();

                    ntrans.Commit();

                }

                catch (NpgsqlException ne)

                {

                    string s = ne.Message.ToString();

                    this._nCopyIn.Cancel(s);

                    ntrans.Rollback();

                    return -1;

                }

                finally

                {

                    this._nCopyIn.End();

                }

            }

看上面的对NpgSqlCommand使用的方法不同,一个是使用的初始化的,一个是实时创建的,后者可以成功而前者不可以。

多看文档,多看资料。

  评论这张
 
阅读(685)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017