当前位置: 首页 > news >正文

调用PostgreSQL存储过程,找不到函数名的问题

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

相关文章:

  • CAP理论
  • HDU 2501 Tiling_easy version
  • 透明代理Transparent Proxy
  • linux 配置软连接的需要注意的一个问题
  • zookeepr集群环境搭建
  • 排球比赛积分规则---三层架构
  • [译] 看动画,学 RxJS
  • (zhuan) 一些RL的文献(及笔记)
  • java 的底层通信--Socket
  • java.util.concurrent.CountDownLatch用方法
  • PSI分析
  • Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释...
  • maven的基本原理和使用
  • cocos2d-x -Lua 字符串
  • [系统资源攻略]IO第一篇-磁盘IO,内核IO概念
  • hexo+github搭建个人博客
  • [译] 怎样写一个基础的编译器
  • 【css3】浏览器内核及其兼容性
  • 78. Subsets
  • Android框架之Volley
  • Apache Pulsar 2.1 重磅发布
  • Apache Spark Streaming 使用实例
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Javascript基础之Array数组API
  • JavaScript新鲜事·第5期
  • JavaWeb(学习笔记二)
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS实现简单的MVC模式开发小游戏
  • Redis 懒删除(lazy free)简史
  • Sass Day-01
  • 我从编程教室毕业
  • 用 Swift 编写面向协议的视图
  • 再次简单明了总结flex布局,一看就懂...
  • No resource identifier found for attribute,RxJava之zip操作符
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​iOS实时查看App运行日志
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • ###C语言程序设计-----C语言学习(6)#
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (23)Linux的软硬连接
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (剑指Offer)面试题34:丑数
  • (力扣)1314.矩阵区域和
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)h264中avc和flv数据的解析
  • (转)创业的注意事项
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net MVC中使用angularJs刷新页面数据列表
  • .net Signalr 使用笔记
  • .Net 访问电子邮箱-LumiSoft.Net,好用