用了好一陣子 SVN
昨天才發現一個問題
已經 Commit 到 SVN 的 Folder
請不要用檔案總管直接將它 rename
否則 rename folder 後
新 folder 中檔案的變更將無法再 Commit
正確的方式是要用 "TortoiseSVN" -> "Rename"
的方式來 rename folder
如下圖:
以上的經驗提供給大家參考
用了好一陣子 SVN
昨天才發現一個問題
已經 Commit 到 SVN 的 Folder
請不要用檔案總管直接將它 rename
否則 rename folder 後
新 folder 中檔案的變更將無法再 Commit
正確的方式是要用 "TortoiseSVN" -> "Rename"
的方式來 rename folder
如下圖:
以上的經驗提供給大家參考
今天遇到一個問題
我在 .NET中使用 OLEDB 將Excel工作表讀入成 DataTable
但有一個怪異的現象
就是某一欄在 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
今年已是 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. 點選左邊樹狀目錄的「角色」節點,會看到如下圖,初始狀態是未安裝任何角色的:
3. 再點選左邊樹狀目錄的「功能」節點,會看到如下圖,初始狀態也是未安裝任何功能的:
4. 所以,如果你果你看到是如上面兩個圖的初始狀態,那就表示尚未安裝IIS 7 和 .Net Framework 3.5。
底下我列出安裝這兩個元件的步驟:
l 安裝 IIS 7
1. 按下「開始」->「系統管理工具」->「伺服器管理員」。
2. 點選左邊樹狀目錄的「角色」節點。
3. 按下右邊視窗中的「新增角色」連結。會開啟如下的「新增角色精靈」視窗:
請按「下一步」繼續。
請按「下一步」繼續。
請按「下一步」繼續。
請勾選「應用程式開發」下的「ASP.NET」。此功能可以用來執行 ASP.NET 2.0 的應用程式。當勾選後會開啟如下的視窗:
請按下「新增所需的角色服務」。然後會看到如下的畫面,表示已勾選「ASP.NET」:
請按「下一步」繼續。
9. 此時會看到如下畫面,表示已安裝「網頁伺服器 (IIS)」角色:
l 安裝 .Net Framework 3.5 SP1
1. 按下「開始」->「系統管理工具」->「伺服器管理員」。
2. 點選左邊樹狀目錄的「功能」節點。會看如下的畫面:
請點選右方視窗的「新增功能」連結。此時會開啟「新增功能精靈」視窗。
3. 請展開「.NET Framework 3.5.1功能」,再勾選「.NET Framework 3.5.1」,如下畫面所示:
請按「下一步」繼續。
底下說明在 ASP.NET 匯出頁面內容到 Excel 或 Word 的步驟 如果要將整個頁面匯出
需在 .aspx 的 Page 指示詞中加入 EnableEventValidation=“false”
範例如下:
<%@ Page Language="C#" AutoEventWireup="true"匯出 Excel 或 Word 的程式碼如下:
CodeFile="UseCase4.aspx.cs" Inherits="UseCase4" Debug="true"
EnableEventValidation="false"%>
protected void btnExportExcel_Click(object sender, EventArgs e)若只匯出某個 Control(例如:GridView1) 時, 需 override VerifyRenderingInServerForm(), 裡頭不必寫任何的程式碼。
{
//匯出 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();
}
範例如下:
public override void VerifyRenderingInServerForm(Control control)參考連結:
{
}
//方法一:使用 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"));
底下說明如何提供檔案給使用者下載(不必提供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();
}
最近要比對兩個不同環境的 DB Schema
但兩邊的 Script 不盡相同,而且 Table 的順序可能不會相同
所以用類似 UltraEdit 的文字比對功能來比對,可能很困難
若一個一個比對,花的時間可能不少
其實是有現成的工具
因為此次我只是比對資料表的差異性
所以,我用的方法如下:
※上述的方式有一個缺點,就是沒有比對到預設值。
等以後有空時,再使用現成工具,看看比對的效果如何。
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 /?,或參考「說明及支援」。
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" 的其中一支
昨天不小找到一個小工具:GExperts
因為一直都覺得在 C++ Builder 6 裡寫 Code 不如 Visual Studio 2005 好用
尤其是對一段 Code 作註解,要在前後加上 /* */,就覺得很麻煩
安裝了這個工具後,就可像Visual Studio 2005 一樣
選取一段程式碼,然後按下快速鍵,將所有選取的程式碼每一行前面都加上 //
底下是這個工具的簡短說明:
GExperts 是一組免費工具,透過增加幾項功能到IDE,以提高 Delphi 和 C++ Builder 程式設計師的生產力。GExperts 被開發為開放原始碼軟體。
下載連結:
GExperts 1.22 - January 5, 2005
for C++Builder 6.03 (1.3 MB): http://prdownloads.sourceforge.net/gexperts/GXC6-122.exe?download