成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PostgreSQL的.NET驅動程序Npgsql中參數對象的一個Bug

數據庫 其他數據庫 PostgreSQL
最近將公司的項目從SqlServer移植到PostgreSQL數據庫上來,在調用數據庫的存儲過程(自定義函數)的時候,發現一個奇怪的問題,老是報函數無法找到。

最近將公司的項目從SqlServer移植到PostgreSQL數據庫上來,在調用數據庫的存儲過程(自定義函數)的時候,發現一個奇怪的問題,老是報函數無法找到。

先看一個PgSQL存儲過程:

  1. CREATE OR REPLACE FUNCTION updateattention(dm citext)  
  2. RETURNS void AS 
  3. $BODY$  
  4. DECLARE 
  5. BEGIN 
  6. update ZB set gzd=COALESCE(gzd,0)+1 where ZB.dm=$1 ;  
  7. END;  
  8. $BODY$  
  9. LANGUAGE plpgsql VOLATILE  
  10. COST 100;  
  11. ALTER FUNCTION updateattention(citext) OWNER TO postgres; 

在PostgreSQL中,函數和存儲過程沒有區別,這里我們把沒有返回值的函數叫做存儲過程吧,也許表訴的不太準確,還望大蝦指正。

上面定義一個存儲過程updateattention,它有一個自定義類型 citext,用于將字符串中類型換成不區分大小寫的類型,它的定義如下:

  1. CREATE OR REPLACE FUNCTION citext(character)  
  2. RETURNS citext AS 
  3. 'rtrim1' 
  4. LANGUAGE internal IMMUTABLE STRICT  
  5. COST 1;  
  6. ALTER FUNCTION citext(character) OWNER TO postgres; 

下面是調用updateattention存儲過程的代碼:

  1. //獲取PostgreSQL的數據訪問對象  
  2. PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");  
  3. //獲取PostgreSQL的參數對象  
  4. IDataParameter para = db.GetParameter();  
  5. para.ParameterName = "@dm";  
  6. para.DbType = DbType.AnsiString;  
  7. para.Value = "KF0355";  
  8. db.ExecuteNonQuery("updateattention",  
  9. System.Data.CommandType.StoredProcedure,  
  10. new System.Data.IDataParameter[] { para }); 

程序使用PDF.NET(PWMIS數據開發框架)的數據訪問對象AdoHelper來進行相關的數據訪問操作,它采用反射工廠模式,根據系統的配置實例化具體的數據訪問類,這里使用的是PostgreSQL數據訪問類。

運行該程序,出現下面的錯誤:

PDF.NET AdoHelper 查詢錯誤:

  1. DataBase ErrorMessage:ERROR: 42883: function updatefundattention(text) does not exist  
  2. SQL:updatefundattention  
  3. CommandType:StoredProcedure  
  4. Parameters:  
  5. Parameter["@jjdm"] = "KF0355" //DbType=String 

PDF.NET框架內置了日志對象和異常對象,它能夠為你拋出詳細的錯誤信息。

如果采用下面的方式調用,又沒有問題:

  1. db.ExecuteNonQuery("select * from updateattention(@dm)",  
  2. System.Data.CommandType.Text,  
  3. new System.Data.IDataParameter[] { para }); 

------------------------------------------------------------------------------------

盡管該方式可以作為一種替代方案,但要用select * from 這種方式調用存儲過程,總覺得很別扭,還得找到問題的真正原因。

這個 "function ... does not exist" 的問題很難搜索,最終在國外找到一篇文章討論類似的問題:

http://pgfoundry.org/forum/forum.php?thread_id=637&forum_id=519

文中有人說,可能是參數的類型轉換問題,但我這里只是將參數進行了大小寫轉換,應該不會有類似Int32到Int64這類問題。

無賴,只有將調用存儲過程的.NET程序代碼一個一個排查,當注釋掉

para.DbType = DbType.AnsiString;

的時候,程序居然能夠正常運行通過了!

之前也曾經懷疑過是不是DbType的問題,但是當把鼠標放到VS2010的編輯器中para 對象下面的時候,智能提示顯示 DbType="{String}".

默認情況下,參數對象的DbType屬性值是

DbType.String

難道

DbType.AnsiString==DbType.String ??

看了一下定義,它們是有區別的,DbType.AnsiString表示非Unicode的變長字符串,DbType.String 表示Unicode的變長字符串。

一般情況下,ANSI編碼表示當前系統編碼,所以我猜想AnsiString在我的機器上是Gb2312編碼的,查了一下數據庫的編碼,它是UTF-8格式的,難怪難怪,PostgreSQL給我提示找不到 updatefundattention(text) 函數,注意下,實際上這個函數的參數不是text類型的,它實際上應該是 character 類型,PostgreSQL可以定義同名的函數,但函數可以有不同的參數類型,有點像C#的方法重載。

到此,問題似乎解決了,但還沒完:

VS2010的智能提示有Bug?

***次有這個念頭我都覺得不可思議,因為以前在VS2008的時候曾經調試過類似的代碼,趕緊將上面的.net代碼中的參數對象換成其它數據庫類型的參數對象試試看:

  1. //獲取PostgreSQL的數據訪問對象  
  2. PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");  
  3. //使用 SqlServer 的參數對象  
  4. IDataParameter para = new SqlParameter();  
  5. para.ParameterName = "@dm";  
  6. para.DbType = DbType.AnsiString;  
  7. para.Value = "KF0355";  
  8. db.ExecuteNonQuery("updateattention",  
  9. System.Data.CommandType.StoredProcedure,  
  10. new System.Data.IDataParameter[] { para }); 

再此將光標放到para.DbType 上,這次提示正確了,是“{AnsiString}”;

將上面的代碼放到VS2008中再次驗證,智能提示正確,看來不是VS2010的Bug,呵呵。

故此,得到的結論:

PostgreSQL的.NET數據訪問驅動程序的參數對象DbType屬性存在一個設置成AnsiString之后查看該屬性的結果卻是String的Bug!

PS:雖然查看屬性的確有這樣一個Bug,但好像程序內部做了正確的處理,要不我的程序最終是無法運行通過的。

后記

PostgreSQL的.NET數據驅動程序的這個問題引起的問題使得我困擾了2天左右的時間,不得不發帖說明一下這個過程,現在國內有關PostgreSQL的資料太少,寫點東西供大家參考一下。

原文鏈接:http://www.cnblogs.com/bluedoctor/archive/2011/05/18/2050276.html

【編者推薦】

  1. 思科推新數據中心解決方案支持SQL Server
  2. 數據庫日常維護常用的腳本部分收錄
  3. SQL Server表最小行的一個糾結問題
  4. 云端數據庫:微軟SQL Azure及其應用場景
  5. SQL點滴之收集SQL Server線程等待信息

 

 

責任編輯:艾婧 來源: 博客園
相關推薦

2011-05-31 10:38:14

PostgreSQL

2011-05-20 08:54:35

PostgreSQL

2017-10-24 17:03:48

Linux驅動程序編譯

2009-09-14 17:08:02

WebFormView

2015-08-24 10:07:13

程序員bug

2010-05-10 15:53:24

Unix系統

2013-10-31 16:29:10

Linux內核

2018-08-29 13:33:02

Windows 10修復驅動程序

2009-07-06 18:17:46

JDBC驅動程序

2011-01-06 16:29:08

linuxtasklet機制

2009-06-15 14:18:00

netbeans配置JDBC驅動程序

2022-03-08 09:25:52

數據庫系統MongoDB

2022-05-19 08:33:53

漏洞惡意軟件

2021-05-06 13:45:54

漏洞網絡安全網絡攻擊

2021-11-29 07:55:45

Linux GPIO Linux 系統

2009-11-04 13:14:59

Windows Emb驅動程序

2018-11-19 10:15:26

Windows 10WiFi驅動程序

2025-02-13 07:00:00

Dubbo-goJava服務端

2009-07-20 18:01:38

Oracle JDBC

2019-03-27 13:20:31

Windows 10更新驅動程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人一区二区三区片免费 | www.亚洲一区二区 | 日韩伦理一区二区 | 少妇淫片aaaaa毛片叫床爽 | 成人一区在线观看 | 毛片免费观看 | 成人在线视频看看 | 亚洲精品二区 | 9久久精品 | 国产精品久久久久久婷婷天堂 | 中文字幕一区二区三区乱码图片 | 午夜小视频在线播放 | 欧美一区二区三区在线观看 | 亚洲精品一区二三区不卡 | 免费一级黄色录像 | 99成人| 国产综合精品一区二区三区 | 日本黄色免费视频 | 成人av在线播放 | 伊人99| 亚洲视频区 | 国产成人亚洲精品自产在线 | 精品综合久久久 | 日日操夜夜操视频 | 亚洲人a | www.se91| 成人黄色av网址 | 成人在线精品视频 | 国产在线麻豆精品入口 | 日韩久久久久久 | 亚洲精彩免费视频 | 理论片免费在线观看 | 亚洲欧美日韩一区二区 | 天天操网| 欧美aa在线 | 亚洲日本欧美日韩高观看 | 91动漫在线观看 | 免费一区 | 国产羞羞视频在线观看 | 一区在线观看 | 男人的天堂久久 |