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當跳板做事總要犧牲一點吧.

2009年12月29日 星期二

http 方式連結 analysis server

連線到olap server 時,如果USER不加入DOMAIN,則無法連線.

在msdn看到文章說,可以透過http的方式來連線,這樣就不會受限於是否為DOMAIN USER.

這篇是說明AS2000的做法, 記得, sql 2000 要上service pack 3 以上.
Microsoft SQL Server 2000 Analysis Services 中增強的 Web 連線功能

按著文件建置後,連到網站http://localhost/olap/msolap.asp一直發生找不到這個頁面, 照文件的步驟該開的權限都開了,但還是找不出原因.
最後才發現, 原來是windows 2003 的 IIS 網頁延伸服務中,Active Server Pages的狀況為已禁止, 啟動後,就ok了. 也讓我花了半天的時間.
文件說,畫面為空白頁面表示連結成功.

接著, 更改程式中,olap的連線字串


"Data Source=http://SQL2000/OLAP/;Initial Catalog=TEST;Provider=MSOLAP.2"

測試程式, 連線成功....

這篇是說明SSAS20005的做法,
在 Microsoft Windows Server 2003 上設定 SQL Server 2005 Analysis Services 的 HTTP 存取
這個設定比2000簡單一些, 照著做, 很順利就連線成功了.

另外,寫了一個網頁,想要透過owc元件連結到analysis server 2005的cube進行瀏覽.有幾個額外步驟
1.client 機器要安裝owc元件,這個元件隨著office授權
2.要將網站加入信任網站,不然會出現無法跨網域存取的錯誤訊息
3.要安裝SQLServer2005_ASOLEDB9.msi, 這是最重要的一步.






2009年12月22日 星期二

insert into 還是 select into ?

Recovery mode is bulk logging.
If you are using the bulk-logged model, SELECT INTO will perform much better.

測試結果, INSERT INTO .. SELECT ..FROM ....
log快速的長大

2009年12月14日 星期一

sql server clr user defined functions

需要可以在sql server中直接批次更改使用者密碼的function

利用既有的加解密function,在visual studio新建一個database project ,稍微改一下function把他變成 Microsoft.SqlServer.Server.SqlFunction()

function 寫法可以參考 msdn上的範例

寫好後有二個方式可以放到sql server上
1.直接在vs project 中,按右鍵選 deploy, 會將有所有帶
Microsoft.SqlServer.Server.SqlFunction() 的function都部署到sql server, 這個方式比較適合開發測試用,按一下就可以直接用了.

2.把compile好的.dll檔 複製到sql server主機的任一路徑下,執行下列scripts.

--Step 1, congfigure database
USE [tempDB]
GO
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

--Step 2, drop depency objects
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[zfnEncryption]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [zfnEncryption]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[zfnDecryption]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [zfnDecryption]
GO

--Step 3. create assembly
IF EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'sqlUtility')
DROP ASSEMBLY [sqlUtility]
GO
CREATE ASSEMBLY sqlUtility
FROM 'c:\test\sqlUtility.dll' -- depends on what server you are in
WITH PERMISSION_SET = safe
GO

--Step 4, create clr function
--Step 4.1, Encryption function
CREATE FUNCTION zfnEncryption(@pwd nvarchar(128))
returns nvarchar(128)
as EXTERNAL NAME [sqlUtility].[sqlUtility.UserDefinedFunctions].[Encryption]
GO

--Step 4.2, Decryption function
CREATE FUNCTION sr.zfnDecryption(@pwd nvarchar(128))
returns nvarchar(128)
as EXTERNAL NAME [sqlUtility].[sqlUtility.UserDefinedFunctions].[Decryption]

--Step 999, test function
select userid,dbo.zfnEncryption('prefix'+ userid) as encryptionPwd
from test

2009年12月9日 星期三

Request.ServerVariables["REMOTE_HOST"] 無法回傳機器名稱

在客戶的環境中, 有一段取client機器名稱的程式碼
Request.ServerVariables["REMOTE_HOST"] 一直無法取得機器名稱,只回傳ip address
但在自已的開發環境卻ok

看到這篇KB 297795

1.打開DOS命令提示字元
2. cd C:\Inetpub\Adminscripts.
3. set w3svc/EnableReverseDNS TRUE

設置了IIS 的EnableReverseDNS 後, 就OK了

KB里頭提到
Warnings
Enabling reverse DNS on your IIS server can affect the performance of your Web server and DNS servers. Some examples are:
Resources such as CPU utilization and network bandwidth may be taken up.
Client requests can take longer to process.
Client requests can be blocked if IP restrictions by DNS domain names are used.

這些警告.....待觀察啊

IIS 網站無法下載中文檔名檔案因為取消高位元字元

 網址+中文檔案名稱方式下載檔案顯示 404 - 找不到檔案或目錄。 但英數字檔案名稱則可下載。 因為設定GCB IIS,其中1項 將高位元字元預設取消勾選了。 27 TWGCB-04-014-0028 要求篩選與其他限制模組 允許高位元字元 這項原則設定決定查詢...