2010年1月31日 星期日

Excel application in Windows 7

把WINDOWS在2003的網站轉移到WINDOWS 7 IIS7 上

被WINDOWS 7 的IIS設定搞得七葷八素的,
UI界面完全不一樣,功能拆得很細項, 完全無法在一時間用正常的邏輯來猜想下一步應該要怎麼設定
試了二個多小時,終於把網站轉移成功.....好辛苦, 是我年紀大到這般程度了嗎?

逐一測試每個頁面,試到一個含有動態產生EXCEL檔案的功能, 出現了以下的錯誤,
幸好IE8的JAVASCRIPT錯誤已經可以COPY PASTE...

網頁錯誤詳細資料


使用者代理程式: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; MALC)


時間戳記: Sun, 31 Jan 2010 08:19:49 UTC 


訊息: Sys.WebForms.PageRequestManagerServerErrorException: 由於發生下列錯誤,為具有 CLSID {00024500-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80070005。

想起了以前WINDOWS 2003時曾遇見過相同錯誤,要在元件服務中去更改DCOM  的network service帳號的存取權限.(可以參考這篇討論區的做法...)

到了windows 7的元件服務看了半天,不知是不是因為只安裝office2007的關係,找了半天,根本看不到microsof excel 的dcom元件

最後在茫茫谷海中,看到要在web.config 的加入 identity impersonate="true" username="" password=""  利用模擬身份方式去授權.而且要用具ADMIN權限的帳號...

雖然解決了,但不知原來設定DCOM權限的方法有沒解呢? 而且這樣模擬的身份會不會太大了?
測試時,順便觀察到,原本在舊的環境是IIS6+OFFICE2003+OFFICE2007共存, 用DSOFRAMER開啟excel時, 工作管理員會有一個excel的process, 不管你開多少個excel, 似乎都只有一個excel

在windows 7 64位元下, 用dsoframer開excel時,只看到officelivesign.exe,看不到excel,
但直接開啟office excel 2007 , 卻又可看到excel的process

見鬼了,今天測試又不是這麼一回事了, 先開EXCEL再開DSOFRAMER,excel process又是只有一個了...,而且畫面也切不回原來開啟的EXCEL..

一頭霧水, windows 7 變好多, 一時間真是無法掌握...

目前唯一讓我感到波棒好的是windows 7 64位元 加上光世代來上網, 那速度真的快到只是一眨眼間呢.
facebook上的animal paradise里頭的動物, 似乎每隻小動物都是在快走中...
差很大

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該餵你什麼,你才能頭好壯壯啊.


2010年1月5日 星期二

RS 2000 中的openquery

有一張報表需求會同時用到sql 2000和informix 的table.
採用linked server的方式,分散式查詢最好要組好完成sql語句,再送到遠端伺服器進行查詢後傳回結果.
之前使用者為了方便,把openquery的語法建成view, 像這樣
create view vTest as
select * from openquery (linkedsvr, 'select * from remoteTable")

想當然耳, 雖然查詢時 select * from vTest where condiditon.... 有指定條件,
但以openquery 來說, 可是會先把remote table所有的資料下傳回sql server後再進行處理的.
造成整個resource都被吃光了.

所以改寫成以sp_executesql的方法組出sql字串送到 remote db去查詢完成後送回結果

declare @sql as nvarchar(4000)
set @sql = N'select * into #tmpTest from openquery (linkedsvr, ''select * from remoteTabl where condition'') ;

select * from #tmpTest inner join tableInSQLServer ......'
exec sp_executesql @sql

這樣就可以利用tmp table, 一次包在同一個transaction與sql server 的table做join查詢了

雖然很不方便 ,但拿sql server當跳板做事總要犧牲一點吧.

publish error allowDefinition='MachineToApplication'

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