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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Npgsql的使用  

2013-04-15 15:50:52|  分类: 数据库技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Npgsql的使用

最近正在封装对POSTGRESQL这个数据库的操作,结果发现真是悲剧了,这个开源库封装的不是很好,结果好些在SQL中使用的方法在这里都变了样子,把这些记下来,做为对一周工作的一个总结,以防以后再犯类似的错误。
选择操作和使用命令进行CURD是都可以保证与SQL SERVER的封装是一样的。关键是对datatable.update这个函数的操作。
                this.m_Adapter.InsertCommand = new NpgsqlCommand(sqlStr, this.m_Connection);
                this.m_Adapter.InsertCommand.Parameters.Add(new NpgsqlParameter("a", DbType.Int32));
                this.m_Adapter.InsertCommand.Parameters.Add(new NpgsqlParameter("b", DbType.AnsiString));
                this.m_Adapter.InsertCommand.Parameters[0].Direction = ParameterDirection.Input;
                this.m_Adapter.InsertCommand.Parameters[1].Direction = ParameterDirection.Input;
                this.m_Adapter.InsertCommand.Parameters[0].SourceColumn = "myid";
                this.m_Adapter.InsertCommand.Parameters[1].SourceColumn = "lenname";

                this.m_Command.CommandText = sqlStr;
                this.m_CommandBuilder.RefreshSchema();
                this.m_Adapter.Update(dt);
依稀记得这是NET1.1中好像这样用。原来是这样写的:
            try
            {
                this.m_Command.CommandText = sqlStr;
                this.m_CommandBuilder.RefreshSchema();
                this.m_Adapter.Update(dt);
            }
            catch (SqlException sex)
            {
                MessageBox.Show(sex.ToString());
                return false;
            }
            return true;
结果每次都会报一个“当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand。”,怎么做都不成,后来查找手册时才发现,最上面的写法,才知道,开源的库落后了真是不少。没有办法,用人家的东西,就只能这样了。
这里还要顺道说一下,再第二次进行封装时(更详细参考fmTestPostGreSqllib这个工程):
            try
            {
                this.m_Adapter.InsertCommand = new NpgsqlCommand();
                string sql = this.GetInsertCmdStr(name);
                this.m_Adapter.InsertCommand.Connection = this.m_Connection;
                this.m_Adapter.InsertCommand.CommandText = sql;

                this.m_Command.CommandText = sql;
                this.m_CommandBuilder.RefreshSchema();
                this.m_Adapter.Update(dt);
            }
            catch (NpgsqlException pe)
            {
                return false;
            }


        public string GetInsertCmdStr(string tablename)
        {
            string sRet = "";
            string sUp = "insert into "+tablename+"(";
            string sDown = ") values(";
            string sEnd = ")";
            for (int len = 0; len < this.m_list.Count; len++)
            {
                //处理字符串
                if (len < this.m_list.Count - 1)
                {
                    sUp +=  this.m_list[len].colName + ",";
                    sDown += ":" + this.m_list[len].colParsName + ",";
                }
                else
                {
                    sUp += this.m_list[len].colName;
                    sDown += ":" + this.m_list[len].colParsName ;
                }

                //处理参数
                this.m_Adapter.InsertCommand.Parameters.Add(new NpgsqlParameter(m_list[len].colParsName, m_list[len].type));
                this.m_Adapter.InsertCommand.Parameters[len].Direction = ParameterDirection.Input;
                this.m_Adapter.InsertCommand.Parameters[len].SourceColumn = m_list[len].colName;
            }

            sRet = sUp + sDown + sEnd;

            return sRet;
        }
总是报一个错误:成员XX的值为空。后来测试了半天,认为可能不支持这种动态封装,但心里又觉得不可能,又试了小半天,才发现了一个非常低级的错误,就是绑定的列表字写成了输入参数的对应列的变量名。
还有一个与SQL SERVER不同的地方就是支持存储过程,在PSQL中,只有函数,没有存储过程,或者你可以把函数当成存储过程:
        public int ExecuteSqlProc(string funC)
        {
            NpgsqlCommand command = new NpgsqlCommand(funC, this.m_Connection);//funC="funcC()"
            command.CommandType = CommandType.StoredProcedure;

           
            try
            {
                Object result = command.ExecuteScalar();
                return 0;
            }
            catch (NpgsqlException pe)
            {
                this.m_Command.CommandType = CommandType.Text;
                return -2;
            }
        }
带参的方法类似,只不过要像上面的更新一样,解读参数。
书到用时方恨少,事非经过不知难。







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

历史上的今天

评论

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

页脚

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