調用PostgreSQL預存程序,找不到函數名的問題

來源:互聯網
上載者:User

標籤:int   title   color   erb   bsp   使用   ret   images   from   

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預存程序,找不到函數名的問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.