2010年4月8日 星期四

Microsoft.Jet.OLEDB.4.0 提供者並未登錄於本機電腦上

最近開發的一支 .NET程式,使用OLEDB 4.0去開啟Excel檔

但發現一個問題

該程式執行於Windows 7 x64版本的電腦上

會出現「Microsoft.Jet.OLEDB.4.0' 提供者並未登錄於本機電腦上」的問題

錯誤訊息如下圖:

clip_image002

其原因是:Microsoft Jet 沒有支援 64 位元的版本的Driver

解決方式:

不要將 .NET應用程式編譯為 64 位元(x64)或「Any CPU」(預設值) 的應用程式

而必須編譯為 32 位元(x86)的應用程式,才可以使用 Microsoft Jet

請參考:http://social.msdn.microsoft.com/Forums/zh-TW/238/thread/c55decf8-53a4-4c82-8aa3-d9f3e6c627c0

若使用Visual Studio,請在方案總管中的專案節點上按右鍵,然後選擇「屬性」以打開專案屬性視窗

請點選左方的「建置」頁籤,然後在平台目標旁的下拉方塊中,選擇「x86」,如下圖:

clip_image004

然後再編譯你的程式,你的程式應該就可正常執行。

2010年3月27日 星期六

TortoiseSVN Tips: Rename Folder

用了好一陣子 SVN
昨天才發現一個問題
已經 Commit 到 SVN 的 Folder
請不要用檔案總管直接將它 rename
否則 rename folder 後
新 folder 中檔案的變更將無法再 Commit
正確的方式是要用 "TortoiseSVN" -> "Rename"
的方式來 rename folder

如下圖:

clip_image001

以上的經驗提供給大家參考

Excel 傳回的值當作 NULL(使用 OLEDB 將Excel當作DB使用)

今天遇到一個問題

我在 .NET中使用 OLEDB 將Excel工作表讀入成 DataTable

但有一個怪異的現象

就是某一欄在 Excel 中看到的都是日期

而讀進來的卻有些是正確的,而有些是 Null

其原因如下

  1. 在Excel看到的日期值,其本身的 DataType 不一定是日期
  2. 將 Excel 讀入DataTable時,欄位的DataType只靠前幾列來判斷,所以可能誤判。
    以我的例子來說,其自動判斷資料型別的為 string,而Excel底層若為string則不會傳回Null(DBNull)
    若 Excel該欄位本身為日期,則會回傳Null。

解決方式如下:

將 Conntion String 改為如下:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"

HDR=Yes 表示工作表第一列包含了欄位名稱

IMEX=1 表示要使用匯入模式驅動程式。這會強制轉換成文字混合的資料。

若要更可靠的匯入資料,你可能也要修改registry 中的TypeGuessRows 值

例如,TypeGuessRows=8 表示會使用前8列資料來判斷其資料型別

目前我並沒有更改此機碼值

機碼的位置如下:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

詳細資訊請參考:PRB: Excel Values Returned as NULL Using DAO OpenRecordset

如何讓 ASP.NET 3.5 的 Web 應用程式執行在 Windows Server 2008 R2

今年已是 2010 年,沒想到 Windows Server 2003 也已經用了這麼多年了

Windows Server 2008 R2 的版本也早已悄悄的來臨了

先前都沒有時間裝 Windows Server 2008 來玩玩看

今天裝了之後,才發現原來 .NET Framework 3.5 SP1 已內建在 Server 2008 R2 中

根本不必另外下載 .NET Framework 3.5

而 Server 2008 與 Server 2003 一樣,安裝好後,只有最基本的選項,並不會安裝你不要的服務。

所以,ASP.NET 3.5 的 Web 應用程式要能執行在 Windows Server 2008 R2上

就必須安裝兩個項目:IIS 7 和 .Net Framework 3.5

通常我們是使用「伺服器管理員」來安裝

在安裝前我們先看一下它初始的狀態:

1. 按下「開始」->「系統管理工具」->「伺服器管理員」。

2. 點選左邊樹狀目錄的「角色」節點,會看到如下圖,初始狀態是未安裝任何角色的:
clip_image002

3. 再點選左邊樹狀目錄的「功能」節點,會看到如下圖,初始狀態也是未安裝任何功能的:
clip_image004

4. 所以,如果你果你看到是如上面兩個圖的初始狀態,那就表示尚未安裝IIS 7 和 .Net Framework 3.5。

底下我列出安裝這兩個元件的步驟:

l 安裝 IIS 7

1. 按下「開始」->「系統管理工具」->「伺服器管理員」。

2. 點選左邊樹狀目錄的「角色」節點。

3. 按下右邊視窗中的「新增角色」連結。會開啟如下的「新增角色精靈」視窗:
clip_image006

請按「下一步」繼續。

4. 請勾選「網頁伺服器 (IIS)」,如下所示:
clip_image008

請按「下一步」繼續。

5. 此時會看到如下畫面:
clip_image010

請按「下一步」繼續。

6. 此時會看到如下畫面,它預設會勾選預設的基本功能:
clip_image012

請勾選「應用程式開發」下的「ASP.NET」。此功能可以用來執行 ASP.NET 2.0 的應用程式。當勾選後會開啟如下的視窗:
clip_image014
請按下「新增所需的角色服務」。然後會看到如下的畫面,表示已勾選「ASP.NET」:
clip_image016
請按「下一步」繼續。

7. 此時會看到如下的畫面,表示安裝正在進行中。
clip_image018

8. 當看到如下畫面,表示安裝完成:
clip_image020
請按下「關閉」。

9. 此時會看到如下畫面,表示已安裝「網頁伺服器 (IIS)」角色:
clip_image022

l 安裝 .Net Framework 3.5 SP1

1. 按下「開始」->「系統管理工具」->「伺服器管理員」。

2. 點選左邊樹狀目錄的「功能」節點。會看如下的畫面:
clip_image024
請點選右方視窗的「新增功能」連結。此時會開啟「新增功能精靈」視窗。

3. 請展開「.NET Framework 3.5.1功能」,再勾選「.NET Framework 3.5.1」,如下畫面所示:
clip_image026
請按「下一步」繼續。

4. 此時會看到如下畫面:
clip_image028
請按「安裝」繼續。

5. 此時會出現如下畫面,表示安裝正在進行中:
clip_image030

6. 當出現如下畫面時,表示安裝已完成。
clip_image032
請按下「關閉」。

7. 此時會出現如下的畫面。表示已安裝了「.NET Framework 3.5 SP1」。
clip_image034

ASP.NET Export To Excel & Word

底下說明在 ASP.NET 匯出頁面內容到 Excel 或 Word 的步驟 如果要將整個頁面匯出
需在 .aspx 的 Page 指示詞中加入 EnableEventValidation=“false”
範例如下:

<%@ Page Language="C#" AutoEventWireup="true"  
CodeFile="UseCase4.aspx.cs" Inherits="UseCase4" Debug="true"
EnableEventValidation="false"%>
匯出 Excel 或 Word 的程式碼如下:
protected void btnExportExcel_Click(object sender, EventArgs e)
{
//匯出 Excel 或 Word
string fileName = "UseCase4.xls"; //excel
//string fileName = "UseCase4.doc"; //word
Response.Clear();
//指定下載的檔名
Response.AddHeader("content-disposition",
"attachment;filename="
+ fileName );
Response.ContentType = "application/vnd.ms-excel"; //excel
//Response.ContentType = "application/vnd.ms-word"; //word

//加入下面兩行才可正常顯示中文
Response.Write("<head><meta http-equiv=Content-Type content=text/html;" +
"charset=big5></head>");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("big5");

System.IO.StringWriter sw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);
this.RenderControl(htw);
//若要只匯出 GridView1, 請將 this 改為 GridView1
Response.Write(sw.ToString());
Response.End();
}
若只匯出某個 Control(例如:GridView1) 時, 需 override VerifyRenderingInServerForm(), 裡頭不必寫任何的程式碼。

範例如下:

public override void VerifyRenderingInServerForm(Control control)
{

}
參考連結:

使用ASP.NET的GridView滙出/儲存資料至Excel,Word,Txt檔

將 GridView 資料匯出成 Excel、Word

使用 .NET 取得各種系統路徑

//方法一:使用 Environment.SpecialFolder 列舉常數來取得

Console.WriteLine("[Desktop]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
Console.WriteLine("[Programs]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.Programs));
Console.WriteLine("[Personal]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.Personal));
Console.WriteLine("[MyDocuments]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
Console.WriteLine("[Favorites]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites));
Console.WriteLine("[Startup]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.Startup));
Console.WriteLine("[Recent]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.Recent));
Console.WriteLine("[SendTo]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.SendTo));
Console.WriteLine("[StartMenu]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu));
Console.WriteLine("[MyMusic]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.MyMusic));
Console.WriteLine("[DesktopDirectory]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
Console.WriteLine("[MyComputer]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.MyComputer));
Console.WriteLine("[Templates]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.Templates));
Console.WriteLine("[ApplicationData]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
Console.WriteLine("[LocalApplicationData]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
Console.WriteLine("[InternetCache]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache));
Console.WriteLine("[Cookies]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.Cookies));
Console.WriteLine("[History]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.History));
Console.WriteLine("[CommonApplicationData]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
Console.WriteLine("[System]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.System));
Console.WriteLine("[ProgramFiles]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles));
Console.WriteLine("[MyPictures]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));
Console.WriteLine("[CommonProgramFiles]\r\n{0}",
  System.Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles));
//方法二:使用環境變數來取得
Console.WriteLine("[%USERPROFILE%]\r\n{0}",
System.Environment.GetEnvironmentVariable("USERPROFILE"));

ASP.NET Download File

底下說明如何提供檔案給使用者下載(不必提供URL給使用者點選)


程式碼如下:

protected void Button1_Click(object sender, EventArgs e)
{
string fileName = @"c:\FAXTEST.doc";
Response.Clear();
//指定下載的檔名
Response.AddHeader("content-disposition", "attachment;filename=test.doc");
Response.ContentType = @"application/octet-stream";
System.IO.FileStream downloadFile =
new System.IO.FileStream(fileName, System.IO.FileMode.Open);
downloadFile.Close();
Response.WriteFile(fileName);
Response.Flush();
Response.End();
}

SQL Server 2005 如何匯出完整的指令碼(包含Index)

SQL Server 2005 匯出指令碼時,預設是不包含索引的

必須另外將「編寫索引的指令碼」選項設為 True(預設為False)

如下圖:

clip_image002

SQL DB Schema 的比對

最近要比對兩個不同環境的 DB Schema
但兩邊的 Script 不盡相同,而且 Table 的順序可能不會相同
所以用類似 UltraEdit 的文字比對功能來比對,可能很困難
若一個一個比對,花的時間可能不少

其實是有現成的工具

因為此次我只是比對資料表的差異性
所以,我用的方法如下:

  1. 把兩個要比對的 Script 在同一台 SQL Server 上各自建成一個資料庫
  2. 重新產生 Script,每一個 Table 產生一個 .sql 檔案。
    產生指令碼之前,先將 "包含描述性標頭", "編寫 USE DATABASE 的指令碼", "編寫預設值的指令碼" 等選項設成 false。
  3. 使用 WinMerge 這套軟體做比對,因為它可以比對兩個目錄中,相同檔名的差異性,而且可以將比對結果匯成 HTML 格式的檔案。

※上述的方式有一個缺點,就是沒有比對到預設值。
等以後有空時,再使用現成工具,看看比對的效果如何。

Windows 下的 grep 指令 –> Findstr

Windows 下的 grep 指令
很多人都知道 Unix 下有個 grep 很好用,可以用來找單一或多個檔案中的某個字串,並將結果顯示出來。
其實 Windows 上也有對應的程式,先前我有用過 grepwin,它比 Windows  的「搜尋」功能更好,還可以執行「取代」,只可惜不能將結果顯示出來,所以美中不足。
今天我才發現,原來 Windows XP 和 Windows Server 2003 早就有一個對應 grep 的內建 Command Line 指令:findstr。它不只可以搜尋多個檔案,也可以遞迴搜尋子目錄,並將結果顯示出來。
使用的範例如下:
findstr /i /c:"send mail" *.*

/i: 表示不管大小寫

/c: 用來指定含有空白字元的字串, 因為預設情況下字串中若有多個字以空白分隔, 會被認為是 OR 條件, 也就是可以一次搜尋多個字串,例如:

findstr /i "send mail" *.*

會搜尋檔案中有 "send" 或 "mail" 的內容

最後一個參數就是指定檔名

詳細的資訊,請輸入 findstr /?,或參考「說明及支援」。

將一個很大的文字檔每一行前固定幾個字作輸出到 Console 或文字檔

Unix 上有很多很好用的文字檔處理工具,最受歡迎的就屬 GNU tools。而 GNU 也另外發起一個專案,叫做 GnuWin32 專案,它讓這些工具也有 Win32 的版本。

如題,要完成此項工具,可以使用 cut 指令來完成

範例如下:

cut -f 1-6 UMSG20091024.Log > UMSG20091024_cut.Log

上面的範例用來將 "UMSG20091024.Log" 裡前 6 欄位的資料產生到 "UMSG20091024_cut.Log" 檔案

cut 的 -f 參數用來指定抓那幾欄的資料,欄位分隔字元預設為 TAB 字元

cut 工具下載網址如下:

http://gnuwin32.sourceforge.net/packages.html

連上網頁後請找到 "CoreUtils" 那一行

點選最後面的 "Setup" 即可下載安裝檔

"CoreUtils" 包含了 File utilities、Text utilities、Shell utilities 這三類工具

cut 只是 "Text utilities" 的其中一支

[軟體] C++ Builder Powerful third party plugins - GExperts

昨天不小找到一個小工具:GExperts

因為一直都覺得在 C++ Builder 6 裡寫 Code 不如 Visual Studio 2005 好用

尤其是對一段 Code 作註解,要在前後加上 /* */,就覺得很麻煩

安裝了這個工具後,就可像Visual Studio 2005 一樣

選取一段程式碼,然後按下快速鍵,將所有選取的程式碼每一行前面都加上 //

底下是這個工具的簡短說明:

GExperts 是一組免費工具,透過增加幾項功能到IDE,以提高 Delphi 和 C++ Builder 程式設計師的生產力。GExperts 被開發為開放原始碼軟體。

官方網站:http://www.gexperts.org

下載連結:

GExperts 1.22 - January 5, 2005

for C++Builder 6.03 (1.3 MB): http://prdownloads.sourceforge.net/gexperts/GXC6-122.exe?download