2010年1月12日 星期二

ORACLE中文欄位名稱

話說SSRS有個叫query builder 的功能
這個功能是方便你可以用精靈的方式進行select sql 語法產出
當然以俺在做報表的習慣,從來不會去使用這個功能
因為要做的報表通常不是簡單的table join隨便選幾個欄位就可以把sql寫好的,
所以通常都會在專門的query工具先測試好語法,然後再貼到rdl上,
所以這個功能也就很少有機會會使用到

今天同事有個需求,想要讓很low的使用者學寫sql, 所以希望query builder能看到table欄位的中文名稱,以方便這些咖可以知道這些欄位代表的意思.
所以他就建個view, 把常用的column 給了好看的中文名稱

以下是開發環境
report designer : vs2005 Version 8.0.50727.867 (vsvista.050727-8600)
report server sql2005 9.00.4035

RDL datasorce: 採用MSDAORA(Microsoft OleDb for Oracle)
oracle db: 10g
oracle client 10.0.1



view建好後, 透過query builder 進行欄位挑選,結果點進去後,表格的定義很順利的出現了,但按下run 後出現了以下的錯誤

SQL Execution Error.

Executed SQL statement: SELECT 序號, 資料 FROM RELI_VIEW
Error Source: Microsoft OLE DB Provider for Oracle
Error Message: 處理命令時,發生一或多個錯誤。

ORA-00911: invalid character

剛開始時,把焦點都放在是不是因為provider不合的問題上, 所以幾個主要的provider都逐一測試包括 Microsoft ODBC for Oracle, OraOLEDB (Oracle Provider for OLE DB),Oracle (OracleClient)出現的問題真是千奇百怪. 同一個provider在不同的開發工具上也有不同的用法,有得合適有得則是會有錯誤.

後來同事想到了一個測試方法,就是把中文欄位名稱前面加上了一個英數字, 重建view之後,竟然就ok了

原本的view是這樣, query builder 執行有誤
create view vtest as select col1 as "欄位一", col2 as "欄位二" from test

改成以下, query builder就ok
create view vtest as select col1 as "col1_欄位一", col2 as "col2_欄位二" from test

再仔細看一下這段ora error的說明

ORA-00911:
invalid character
Cause:
identifiers may not start with any ASCII character other than letters and numbers. $#_ are also allowed after the first character. Identifiers enclosed by doublequotes may contain any character other than a doublequote. Alternative quotes (q'#...#') cannot use spaces, tabs, or carriage returns as delimiters. For all other contexts, consult the SQL Language Reference Manual
.

所以只要把中文欄位別名字首加上任一個ASCII character ,這樣SSRS就認得了.
請注意,必需要使用MSDAORA(Microsoft OleDb for Oracle)

Microsoft ODBC for Oracle...有錯,
OraOLEDB (Oracle Provider for OLE DB)...有錯
ERROR [NA000] [Microsoft][ODBC driver for Oracle][Oracle]ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
ERROR [IM006] [Microsoft][ODBC 驅動程式管理員] 驅動程式的 SQLSetConnectAttr 失敗
ERROR [01000] [Microsoft][ODBC 驅動程式管理員] 驅動程式不支援這應用程式請求的此版 ODBC 行為。(請參閱 SQLSetEnvAttr)。

Oracle (OracleClient)...也不算有錯只是中文出不來
在rdl 預覽結果時, 欄位稱都變成了col1_����,所以進到query builder也出不
就算更改了regedit 的nls_lang也沒用, 但在3rd party的query 工具查詢很正常耶.
Executed SQL statement: SELECT "col1_����", "col2_����" AS Expr1 FROM
Error Source: OraOLEDBError
Message: ORA-00904: "col1_????": invalid identifier

單純的查詢目前為止,看來很OK.
為RS啊,到底我ORACLE該餵你什麼,你才能頭好壯壯啊.


沒有留言:

張貼留言

publish error allowDefinition='MachineToApplication'

一個老舊的aspx web form專案,調了一些功能建置成功,但進行部署時顯示以下錯誤。 在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段發生錯誤。錯誤的原因可能是虛擬目錄尚未在 IIS 中設定為...