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

PostgreSQL的.NET驅(qū)動(dòng)程序Npgsql中參數(shù)對(duì)象的一個(gè)Bug

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù) PostgreSQL
最近將公司的項(xiàng)目從SqlServer移植到PostgreSQL數(shù)據(jù)庫(kù)上來(lái),在調(diào)用數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程(自定義函數(shù))的時(shí)候,發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題,老是報(bào)函數(shù)無(wú)法找到。

最近將公司的項(xiàng)目從SqlServer移植到PostgreSQL數(shù)據(jù)庫(kù)上來(lái),在調(diào)用數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程(自定義函數(shù))的時(shí)候,發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題,老是報(bào)函數(shù)無(wú)法找到。

先看一個(gè)PgSQL存儲(chǔ)過(guò)程:

  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中,函數(shù)和存儲(chǔ)過(guò)程沒(méi)有區(qū)別,這里我們把沒(méi)有返回值的函數(shù)叫做存儲(chǔ)過(guò)程吧,也許表訴的不太準(zhǔn)確,還望大蝦指正。

上面定義一個(gè)存儲(chǔ)過(guò)程updateattention,它有一個(gè)自定義類型 citext,用于將字符串中類型換成不區(qū)分大小寫的類型,它的定義如下:

  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; 

下面是調(diào)用updateattention存儲(chǔ)過(guò)程的代碼:

  1. //獲取PostgreSQL的數(shù)據(jù)訪問(wèn)對(duì)象  
  2. PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");  
  3. //獲取PostgreSQL的參數(shù)對(duì)象  
  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數(shù)據(jù)開(kāi)發(fā)框架)的數(shù)據(jù)訪問(wèn)對(duì)象AdoHelper來(lái)進(jìn)行相關(guān)的數(shù)據(jù)訪問(wèn)操作,它采用反射工廠模式,根據(jù)系統(tǒng)的配置實(shí)例化具體的數(shù)據(jù)訪問(wèn)類,這里使用的是PostgreSQL數(shù)據(jù)訪問(wèn)類。

運(yùn)行該程序,出現(xiàn)下面的錯(cuò)誤:

PDF.NET AdoHelper 查詢錯(cuò)誤:

  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框架內(nèi)置了日志對(duì)象和異常對(duì)象,它能夠?yàn)槟銙伋鲈敿?xì)的錯(cuò)誤信息。

如果采用下面的方式調(diào)用,又沒(méi)有問(wèn)題:

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

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

盡管該方式可以作為一種替代方案,但要用select * from 這種方式調(diào)用存儲(chǔ)過(guò)程,總覺(jué)得很別扭,還得找到問(wèn)題的真正原因。

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

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

文中有人說(shuō),可能是參數(shù)的類型轉(zhuǎn)換問(wèn)題,但我這里只是將參數(shù)進(jìn)行了大小寫轉(zhuǎn)換,應(yīng)該不會(huì)有類似Int32到Int64這類問(wèn)題。

無(wú)賴,只有將調(diào)用存儲(chǔ)過(guò)程的.NET程序代碼一個(gè)一個(gè)排查,當(dāng)注釋掉

para.DbType = DbType.AnsiString;

的時(shí)候,程序居然能夠正常運(yùn)行通過(guò)了!

之前也曾經(jīng)懷疑過(guò)是不是DbType的問(wèn)題,但是當(dāng)把鼠標(biāo)放到VS2010的編輯器中para 對(duì)象下面的時(shí)候,智能提示顯示 DbType="{String}".

默認(rèn)情況下,參數(shù)對(duì)象的DbType屬性值是

DbType.String

難道

DbType.AnsiString==DbType.String ??

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

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

到此,問(wèn)題似乎解決了,但還沒(méi)完:

VS2010的智能提示有Bug?

***次有這個(gè)念頭我都覺(jué)得不可思議,因?yàn)橐郧霸赩S2008的時(shí)候曾經(jīng)調(diào)試過(guò)類似的代碼,趕緊將上面的.net代碼中的參數(shù)對(duì)象換成其它數(shù)據(jù)庫(kù)類型的參數(shù)對(duì)象試試看:

  1. //獲取PostgreSQL的數(shù)據(jù)訪問(wèn)對(duì)象  
  2. PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");  
  3. //使用 SqlServer 的參數(shù)對(duì)象  
  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 }); 

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

將上面的代碼放到VS2008中再次驗(yàn)證,智能提示正確,看來(lái)不是VS2010的Bug,呵呵。

故此,得到的結(jié)論:

PostgreSQL的.NET數(shù)據(jù)訪問(wèn)驅(qū)動(dòng)程序的參數(shù)對(duì)象DbType屬性存在一個(gè)設(shè)置成AnsiString之后查看該屬性的結(jié)果卻是String的Bug!

PS:雖然查看屬性的確有這樣一個(gè)Bug,但好像程序內(nèi)部做了正確的處理,要不我的程序最終是無(wú)法運(yùn)行通過(guò)的。

后記

PostgreSQL的.NET數(shù)據(jù)驅(qū)動(dòng)程序的這個(gè)問(wèn)題引起的問(wèn)題使得我困擾了2天左右的時(shí)間,不得不發(fā)帖說(shuō)明一下這個(gè)過(guò)程,現(xiàn)在國(guó)內(nèi)有關(guān)PostgreSQL的資料太少,寫點(diǎn)東西供大家參考一下。

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

【編者推薦】

  1. 思科推新數(shù)據(jù)中心解決方案支持SQL Server
  2. 數(shù)據(jù)庫(kù)日常維護(hù)常用的腳本部分收錄
  3. SQL Server表最小行的一個(gè)糾結(jié)問(wèn)題
  4. 云端數(shù)據(jù)庫(kù):微軟SQL Azure及其應(yīng)用場(chǎng)景
  5. SQL點(diǎn)滴之收集SQL Server線程等待信息

 

 

責(zé)任編輯:艾婧 來(lái)源: 博客園
相關(guān)推薦

2011-05-31 10:38:14

PostgreSQL

2011-05-20 08:54:35

PostgreSQL

2017-10-24 17:03:48

Linux驅(qū)動(dòng)程序編譯

2009-09-14 17:08:02

WebFormView

2015-08-24 10:07:13

程序員bug

2010-05-10 15:53:24

Unix系統(tǒng)

2013-10-31 16:29:10

Linux內(nèi)核

2018-08-29 13:33:02

Windows 10修復(fù)驅(qū)動(dòng)程序

2009-07-06 18:17:46

JDBC驅(qū)動(dòng)程序

2011-01-06 16:29:08

linuxtasklet機(jī)制

2009-06-15 14:18:00

netbeans配置JDBC驅(qū)動(dòng)程序

2022-03-08 09:25:52

數(shù)據(jù)庫(kù)系統(tǒng)MongoDB

2022-05-19 08:33:53

漏洞惡意軟件

2021-05-06 13:45:54

漏洞網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2021-11-29 07:55:45

Linux GPIO Linux 系統(tǒng)

2009-11-04 13:14:59

Windows Emb驅(qū)動(dòng)程序

2018-11-19 10:15:26

Windows 10WiFi驅(qū)動(dòng)程序

2025-02-13 07:00:00

Dubbo-goJava服務(wù)端

2009-07-20 18:01:38

Oracle JDBC

2019-03-27 13:20:31

Windows 10更新驅(qū)動(dòng)程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 免费特黄视频 | 成人在线观看免费 | 久久久久久久久精 | 韩日一区二区 | 激情欧美一区二区三区 | 亚洲精品在线播放 | 日韩在线精品强乱中文字幕 | 亚洲精品久久 | 色欧美片视频在线观看 | 中文字幕国产精品视频 | 一本久久a久久精品亚洲 | 成人国产在线视频 | 国产高清精品在线 | 国产精品久久久久久久久免费丝袜 | 日韩一区二区在线视频 | 亚洲精品一区二区三区蜜桃久 | 亚洲福利在线观看 | 激情网站 | a级大毛片 | av在线二区 | 国产精品无码专区在线观看 | 99久久中文字幕三级久久日本 | 精品免费在线 | 成人精品一区二区 | 午夜a区 | 国产成人jvid在线播放 | 日韩国产高清在线观看 | 亚洲国产欧美日韩 | 久综合| 精品国产乱码久久久久久牛牛 | 久久只有精品 | 日韩精品一区二区三区中文字幕 | 自拍在线| 国产91在线 | 中日 | 久久精品国产久精国产 | 青青草精品 | 久久国产精品久久国产精品 | 91精品久久久久久久 | 网站国产 | 日韩一二三区视频 | 6080亚洲精品一区二区 |