PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题。
问题描述:
 
下面的示例测试代码:

PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");
            IDataParameter para = db.GetParameter();
            para.ParameterName = "@jjdm";
            para.DbType = DbType.AnsiString  ; 
            para.Value = "KF0355";
            int count= db.ExecuteNonQuery("updatefundattention",
                System.Data.CommandType.StoredProcedure,
                new System.Data.IDataParameter[] { para });
运行该存储过程,出现下面的错误:
DataBase ErrorMessage:ERROR: 42883: function updatefundattention(text) does not exist
SQL:updatefundattention
CommandType:StoredProcedure
Parameters:
Parameter["@jjdm"]    =    "KF0355"              //DbType=String
 
 
实际上,PostgreSQL的函数updatefundattention 参数类型不是 text,而是自定义的类型 citex ,下面是函数定义:

CREATE OR REPLACE FUNCTION updatefundattention(jjdm citext)
  RETURNS void AS
$BODY$
DECLARE
  
BEGIN
  update JJZB set gzd=COALESCE(gzd,0)+1 where JJZB.Jjdm=$1 ;
  --return 1;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION updatefundattention(citext) OWNER TO postgres;
昨天分析可能PostgreSQL的字符型参数不能使用AnsiString参数类型,需要使用String类型,但今天测试发现
para.DbType = DbType.String  ; 
 
问题依然没有解决。
重新建立一个测试函数updatefundattention,只是参数类型为 varchar:

CREATE OR REPLACE FUNCTION updatefundattention2(jjdm character varying)
  RETURNS void AS
$BODY$
DECLARE
  
BEGIN
  update JJZB set gzd=COALESCE(gzd,0)+1 where JJZB.Jjdm=$1 ;
  --return 1;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION updatefundattention2(character varying) OWNER TO postgres;
运行测试程序,不论

para.DbType = DbType.AnsiString  ; 
还是
para.DbType = DbType.String  ; 
 
调用函数updatefundattention2 均能通过,故此得到结论:
目前自定义的 citext 类型.NET程序无法设置正确的DbType,从而会出现找不到函数的错误!
 
问题影响:
 
在WFT中,所有使用.NET程序调用PostgreSQL存储过程的代码,如果存储过程的参数使用了自定义的类型(例如citex),均会受影响。
 
解决方案:
 
a,建议不要在PostgreSQL函数的参数中使用自定义的类型,如果要想对参数进行大小写转换,建议在函数体中使用另外一个Pgsql变量,函数中执行查询的SQL语句使用这个新变量,而不是直接使用这个函数参数;
b,修改Sql-Map中的SQL语句,例如


<Select CommandName="AddGuanZhuDu" Method="" CommandType="StoredProcedure" Description="增加关注度" ResultClass="ValueType"><![CDATA[
      UpdateFundAttention
      #jjdm : String#
      ]]></Select>
修改成下面的方式:
<Select CommandName="AddGuanZhuDu" Method="" CommandType="Text" Description="增加关注度" ResultClass="ValueType"><![CDATA[
      select * from UpdateFundAttention (#jjdm: String#)
      ]]></Select>
但这种修改方式会造成SqlServer与PostgreSQL的SQL-MAP语句不相同,增加程序的维护量,理想的方式是SQL-MAP语句尽量相同。

最新文章

  1. ThinkPHP开启事物
  2. hibernate----N-N--(人与地点)
  3. java 24 - 5 GUI之 鼠标移动改变窗体背景颜色
  4. javascript自定义滚动条插件,几行代码的事儿
  5. SignalR + MVC5 简单示例
  6. http://jingyan.baidu.com/album/03b2f78c4cc0ad5ea337ae7d.html
  7. Machine Learning in Action &ndash; PCA和SVD
  8. AutoLayout框架Masonry使用心得
  9. 使用OKHttp模拟登陆知乎,兼谈OKHttp中Cookie的使用!
  10. Entity Framework OData filter inherit
  11. JS判断,今天所在季度,第几周, 季度的第几周,年度第几周
  12. MVC EF 增 删 改 查
  13. 前端 PC端兼容性问题总结
  14. Sersync+Rsync实现触发式文件同步
  15. 【java】多线程同步生产者消费者问题
  16. tar、scp、sftp、rsync简单使用
  17. kubernetes 简单yaml文件运行例子deployment
  18. SpringMVC源码阅读入门
  19. WPF在XAML的资源中定义空字符串String.Empty
  20. MySQL数据库语法(一)

热门文章

  1. 查看Linux磁盘空间大小命令
  2. http跨域访问
  3. static 成员变量、static 成员函数、类/对象的大小
  4. springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
  5. Python黑魔法,一行实现并行化
  6. Out of Hay(poj2395)(并查集)
  7. CBiontCache
  8. javaweb reponse 写出文件
  9. vue 单元测试
  10. [shell]system和execlp简单示例