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语句尽量相同。

调用PostgreSQL存储过程,找不到函数名的问题的更多相关文章

  1. Mybatis调用PostgreSQL存储过程实现数组入参传递

    注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于Pos ...

  2. myBatis调用postgreSQL存储过程

    1.调用没有OUT参数的存储过程: 创建存储过程: create or replace function get_code(a1 varchar(32)) returns varchar(32) as ...

  3. dll 导出函数名的那些事

    dll 导出函数名的那些事 关键字: VC++  DLL  导出函数 经常使用VC6的Dependency或者是Depends工具查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导 ...

  4. python 获取当前调用函数名等log信息

    import sys funcName = sys._getframe().f_back.f_code.co_name #获取调用函数名 lineNumber = sys._getframe().f_ ...

  5. 某些情况下调用函数为什么要在函数名前加“(void)”

    我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...

  6. day11函数的参数,函数对象 - 函数名,函数的嵌套调用

    复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发效率 ...

  7. python3 获取当前调用函数名

    import sys funcName = sys._getframe().f_back.f_code.co_name #获取调用函数名lineNumber = sys._getframe().f_b ...

  8. Delphi 调用C/C++的Dll(stdcall关键字, 会导致函数名分裂. 此时函数名变成_stdadd@8)

    delphi调用C++写的Dll, 当然这个Dll要求是非MFC的Dll, 这样子才能被delphi调用. 根据C++定义函数的情况, Delphi有不同的相对应的处理方法.1. 声明中不加__std ...

  9. js如何通过变量调用函数,函数名在变量里面

    js如何通过变量调用函数,函数名在变量里面. 有时候函数名是动态定义的,这时候我们就需要用到这个方法了. //赋值函数名称 var a = "b"; //定义函数 function ...

随机推荐

  1. UniCode 下 CString 转 char* 的方法

    今天进行文件操作时,将CString的GetBuffer()后直接倒到char数组后写入文件发现 每个字符与字符之间都有一个空格存在,而且有内容丢失.原来CString类对象GetBuffer(),后 ...

  2. 【转载】Linux 系统时间查看 及 时区修改(自动同步时间)

    1:使用date命令查看时区 [root@db-server ~]# date -R   Sun, 11 Jan 2015 07:10:28 -0800   [root@db-server ~]#   ...

  3. mysql-connector-python 源码安装

    一.下载mysql-connector-python的源码包: 下载页面: https://dev.mysql.com/downloads/connector/python/ 我这下载的是mysql- ...

  4. 利用ngModel相关属性及方法自定义表单验证指令

    这是一个只能输入偶数的验证指令

  5. cocos2d-x与ISO内存管理(转)

    一,IOS与图片内存 在IOS上,图片会被自动缩放到2的N次方大小.比如一张1024*1025的图片,占用的内存与一张1024*2048的图片是一致的.图片占用内存大小的计算的公式是:长*宽*4.这样 ...

  6. wpa_cli 连接 wifi(转)

    wpa_cli 连接 wifi 转自:http://hi.baidu.com/yyangjjun/item/9dfe8e175439fc7a1009b5ba   1: run wpa_supplica ...

  7. Windows Phone 性能优化(二)

    这篇文章的 demo 是在 (一)的基础上进行的调整,逻辑基本相似.本文只列和 上一篇出不同的代码. 为了实现自定义的虚拟化,把上一篇文章的 ListBox 换成 ScrollViewer + Ite ...

  8. Jmeter测试带加密参数的接口

    在做接口测试时,很多时候我们都会碰到带有加密参数的接口,这种接口一般来讲都会有统一的加密方法,找开发要就好,Jmeter怎么去测呢 1.整体结构如下所示: 2.操作步骤 (1)将加密方法打成jar包放 ...

  9. 获取Oracle数据库中字段信息

    select t.DATA_PRECISION,t.DATA_SCALE,t.DATA_LENGTH,t.DATA_TYPE,t.COLUMN_NAME, t.NULLABLE,t.DATA_DEFA ...

  10. spring oauth2相关资料

    理解OAuth 2.0  *****http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html Secure REST API with oauth2 ...