發表文章

DataTable幾種讀取資料的效能比較

圖片
DataTable迴圈的讀取方式一般常見的有for、foreach、 DataTableReader 這幾種,這三種方法各自運用或考量點會根據當時的狀況不同使用的方式也不同,因此這裡只是單純的進行三種方式的效能比較。 下圖為實際比較的結果,從數據上看在資料量少的時候,使用for迴圈再效能上是最優異的,但隨著資料量越來越大,foreach迴圈的優勢就慢慢顯現出來了,DataTableReader的效能則是最差的,但實際的使用情境還是要視情況來自行決定了。

GoogleMap API v2再見

Google 正式宣布 2013.11.19停止支援GoogleMap API v2的版本,全面迎向API v3,R.I.P~,不過也就是這樣先前使用舊版API v2的程式將全部失效。v3和v2的版本再程式上的寫法有很大的不同,所以幾乎沒有辦法調整些許的JavaScript語法就可以直接套用,至於修改了哪些部份就不在一一說明。

程式中使用ReportingService發送報表

圖片
Reporting Service一直不是我的強項,但最近因為需要發送一個報表給大老闆,因此稍為查看了一下Reproting報表的發送方式,意外的發現了一個先前自己都沒有用過的方式,一般而言,我們在使用報表伺服器來設定發送電子郵件都是使用訂閱的方式來傳送(下圖所示)。

Application閒置過久關閉

好久沒有寫網誌了,感覺這裡都快要生蜘蛛網了,今天朋友問了如何判斷一個WindowsForm表單閒置過一定的時間後,自動關閉程式,原本想說使用Form MouseMove & Form Click兩個Event加上Timer來判斷,時間到了自動關閉,但後來確發現要是Form上面有一個很大的Component占據了Form的頁面,這時候Form的Event將抓取不到。 後來發現Application本身有提供一個 Event Idle ,Idle本身在表單停止任何動作的時候會進入一次,如此一來就可以搭配Timer來處理關閉程式的動作了,相關程式碼如下,不過這裡還有一個地方需要注意, Timer在執行的過程中並不算系統Idle ,因此我下面的代碼做了點手腳,在Timer檢查的時候判斷的時間點要比Idle的時間點還要早100毫秒,這樣就可以巧妙的通過檢查了。

開發iOS後的一些感觸

首先,我必須承認我是一個Microsoft派的Programmer,且我是站在開發者角度來觀察,因此我的感觸可能會有些偏頗。 在還沒有接觸之前都只是從賈伯斯和User的說法來得知Apple的產品,他們口中的Apple的產品幾乎就是一個美感、高品質、高效能的代表。甚至幾年前我還從網路的文章中看過一段對話,A問:為什麼Apple電腦沒有防毒軟體? B答:因為麥金塔本身就是最佳的防毒軟體。

ASP.NET產生Excel的幾種方式

圖片
還記得剛跨進程式設計這個領域的時候,當時有處理到一個問題,使用者在Web上面產生Excel檔造成記憶體崩潰的問題。查看了程式發現那時候的開發方式是使用【 Excel 物件模型來存取 】,但這種方式主要是運用在單機使用上,若在Web上面使用常常會有很多問題產生,例如 : 記憶體無法釋放等問題。 那時候剛進行,完全不知道該如何解決,老闆只好請我跟微軟詢問該如何解決,得到的答案確是Microsoft 不建議在Server端使用直接存取 Excel 物件模型的方式來控制 Excel 檔案,後來因為某些因素就離開了該公司,也沒有解決此問題,這個問題變成我寫程式以來最挫折的事情。但很幸運的是,後來所接觸的程式開發,除了報表外(可以透過ReportViewer幫我們產生),要匯出Excel的檔案都不是很複雜的,因此都可以使用Html表格畫表在透過改變ContentType的方式來產生,日子久了也漸漸淡忘這個悲慘的往事 ~"~。

Android 開發GoogleMap專案

圖片
前幾天把一個先前已開發好的GoogleMap專案移到另外一台電腦上開啟,卻發現GoogleMap地圖沒有辦法正常work,找了好久才突然想起,若要在模擬器開發GoogleMap的程式必須先去註冊一組debug key(金鑰),這個很重要每次都忘記~"~。 在Android上面開發GoogleMap並不是直接接元件拉過去就可以使用了,必須先去註冊一組Key,而且模擬器和實體機器(發佈版本)的使用方式又有些許不同,下面我就記錄一下整個開發的步驟。

HTC Sense3.0待機(鎖屏or關屏)模式下無法使用Toast提示訊息

圖片
最近在開發手機來電監聽的APP,有個需求就是要有電話打進來的時候,要跳出客製的來電訊息,等到我一切在模擬器上面測試都OK的時候,放到實體機器上面測試,馬上就破功,電話打進來的時候毫無反應,一開始我想說會不會是Android的版本關係,於是我就換了其它版本的模擬器,還是正常可以正常執行,但是我在這時候發現原來實機上面是會運作的,只是在待機模式下面程式都沒有反應。

解決Reflection找不到繼承其它類別之類別

圖片
前幾天說明了如何使用dynamic來取代Reflection的功能,寫完文章後自己又玩了一下,卻無意間發現另外的問題,如果要操作的類別與繼承的類別並不是在相同的dll的話會取不到類別,dynamic與 Reflection的結果都一樣, 在發生問題的當下以為是namespance寫錯的關係,不過反覆調整了幾次發現都不是,於是就陷入了混亂的思緒,這時候就證明了當你以呈現混亂的思緒還是離開當下的環境比較好,回到家洗完澡後就想到一個問題,會不會是子類別讀不到父親類別的參考(雖然我編譯時期有參考)但是編譯成dll檔後它們並不互相認識,於是我就很天才的把兩個dll放在同一目錄底下,然後很開心的一試,還是掛掉(理所當然的吧),再把父親類別跟子類別放在同一個專案下編譯就正常,當下覺得很奇怪。

NET4.0新特性 dynamic

圖片
以往我們如果有一個dll檔,如果要使用C#來呼叫,我們都會使用反射(Reflection)的方式來呼叫相關的Methods,我先前也有一篇文章有提到關於 Reflection的基本操方式 。 最近因為因緣巧合的情況之下發現了NET4.0所提供的新特性 dynamic ,根據MSDN的說法  dynamic 型別可讓它發生所在的作業略過編譯時期型別檢查 ,講白話文的意思就是dynamic可以讓C#語法有了類似VB的特性弱型別語言的特性,宣告的時候不需要知道型別,且編譯的過程中編譯器預設也不會對dynamic進行檢查。

動態Included JavaScript的問題

圖片
在寫元件的時候常常會需要Included一些JavaScript檔,最近遇到一個問題就是需要Included一個jQuery檔案,但是NET所提供的【Page.ClientScript.RegisterClientScriptInclude】會把檔案放在<form></form> 中間,這樣一來會有一些問題產生。 通常我們在寫JavaScript的時候,會習慣把JS寫在 <head><head>中間,如果頁面中有用到jQuery的話,必須要把jquery.x.x.js檔放在自己寫的JS上面,不然會發生找不到物件的情形產生。舉個例子來說,最近要寫一個在iframe載入完畢後要自動調整寬高,理論來說這麼簡單的語法,只需要透過JavaScript就可以輕易達成了( 之前的文章也有提到 ),但最近發現先前所提到的寫法在不同瀏覽器計算出來的高度有誤,或者無法正常運作的情況產生,經過多次測試後發現,其實使用jQuery就可以輕易的取得我們所需要的iframe的寬高(測試幾個瀏覽器IE7,IE9,Chrome,Firefox都正常),於是我就想說寫一個IFrame的元件來用。

VS2005 連接 TFS2010 無法正常連線解決辦法

圖片
這幾天因為環境的關係,不得已必須使用Visual Studio2005透過Internet來連線Team Foundation Server 2010,但是VS2005預設是沒有安裝Team Explorer,所以沒有辦法連線,網路上找了一下資訊,發現 程湘之間 有教人家如何安裝,我就大概說明要安裝哪些東西

GridView轉出Excel時出現System.OutOfMemoryException 的問題

這幾天在改善系統問題時出現了 System.OutOfMemoryException 的問題,由於這個錯誤訊息提示的關係,直覺是記憶體不足嗎?所以到了Server上執行該程式並監看記憶體使用狀況,似乎沒有很誇張,Google了一下,保哥有提到遇到此問題的解決辦法,按照保哥的方式調整發現,問題還在,所以就是程是本身的問題了。 

T-SQL使用遞迴的方式來查詢同一資料表

最近要調整公司原有系統機制的時候,由於資料架構的關係不得以必須使用到SQL來遞迴查詢一些資料,一開始我的想法本來是跟程式的觀念一下寫一個Function然後遞迴呼叫自己,但想來想去覺得這樣好像怪怪的,資料量大的時候怕會有效能問題,於是就上Google查了一下,果然有SQL本身就有提供類似遞迴的語法(SQL Server2005 + 的版本才支援)。

Windows Phone 7 取得GPS訊號

圖片
要取得GPS的訊號主要是透過 GeoCoordinateWatche 來取得,下面的範例是一個簡單的取得經緯度的語法。

Windows Phone 7 開發GoogleMap基礎說明

圖片
1. 要開發Bing Maps App前,必須先到官網註冊一組程式中必須使用到的Key才可以繼續進行下一個步驟。 Register Key  畫面如下:

Windows Server 2008 安裝 Windows Phone SDK 7.1

圖片
Windows Phone SDK 7.1正式釋出了,但是微軟的 官網 明確的說明該SDK支援的作業系統為Windows 7或Windows Vista。網路找一下答案,果然有人分享如何破解這個限制,先說明一下 kylin 分享的是線上安裝的調整方式,我試著用一樣的步驟來執行離線安裝檔的方式會失敗,但是只要把線上安裝的baseline.dat Copy到離線安裝檔那,就可以正常運作了。

C# WinForm使用新字型

圖片
前幾天突然有個問題,以前如果我們需要一個新的字型要使用,我們會將下載回來的字型檔安裝到字型裡面後才繼續使用,但是問題來了,如果我寫了一支程式然後那支程式裡面需要使用到非系統預設的新字型,那麼我們就必須要想辦法讓動態的載入或者安裝字型,因此我上網搜尋了一下整理出以下幾種方式可以進行。

Objective-C 字串相加方法

在C#中如果只要使用同一變數的字串相加只需要使用+=就可以達到我們想要的結果,可是Objectiv-C可就沒有簡單了,必須透過字串的Methods來完成,自己記一下免得下次又忘了,詳見以下語法。

讀寫app.conifg檔案

有時候我們在寫WinForm程式的時候,若沒資料庫而又必須儲存一些參數以方便後續使用的時候,有幾種方法。1. 自己寫文字檔或xml檔儲存,這個我就不在說明了。2. 利用app.conifg來進行資料存取,下面我就針對這項進行簡單的說明。 由於我要利用appSettings來進行存取,因此要存放的檔案必須為基本資料型態的格式,也就是如果你要存放的檔案有多筆、陣列、DataSet、DataTable(雖然可序列化)等等,皆不適用本範例。

WinForm程式實做多語系

//http://www.dotblogs.com.tw/yc421206/archive/2011/02/21/21482.aspx  //http://www.wretch.cc/blog/bigdstut/15822510 string language = this.Input_Language.SelectedValue.ToString(); System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language); ResourceManager rm = new ResourceManager("PrimeEagle.Leeder.GPSViewer.Form_Setting", Assembly.GetExecutingAssembly()); this.Label_UTCTime.Text = rm.GetString("Label_UTCTime.Text"); this.Label_Heading.Text = rm.GetString("Label_Heading.Text"); this.Label_Rateofturn.Text = rm.GetString("Label_Rateofturn.Text"); this.Label_Speed.Text = rm.GetString("Label_Speed.Text"); this.GroupBox_Position.Text = rm.GetString("GroupBox_Position.Text"); this.Button_DefaultPosition.Text = rm.GetString("Button_DefaultPosition.Text");

iOS關閉螢幕小鍵盤

圖片
我們常常在設計UI畫面的時候,會希望User輸入完一個資料欄位後可以關閉小鍵盤(自動或被動皆可),iPhone並不像Android有一個回上一動作的按鈕,因此我們會希望讓User隨意點選一個地方就自動關閉螢幕小鍵盤。在實際操作的過程中,發現有兩個物件的使用方式有點不太相同,因此我在下面會針對這兩個物件進行說明。

GPS座標度分秒轉換

圖片
之前使用GPS接收器接收到的經緯度格式都是【度度.分分秒秒秒】,但是手機上卻不是這樣,手機上卻是直接發送出GPS的訊號卻是轉換過的地圖格式,這點害我吃了大虧,因此在這裡分享一下度分秒的轉換方式。 經緯度 → 度分秒(假設有個緯度是23.12345) 度數 : 整數的部分23 這個就是轉換後的度數(°) 分數 : 小數的部分0.12345 * 60 = 7.407 ,取整數的部分,因此 7(')就是轉換後的分數 秒數 : 分數計算後的小數部分,也就是0.407 * 60 = 24.42,因此24.42(")就是轉換後的秒數 因此23.12345轉換後就是23° 7' 24.42" 度分秒 → 經緯度(假設有個度數是23° 7' 24.42") 轉換公式 : x度 y分 z秒 = x + y/60 + z/3600 度 (23) + (7/60) + (24.42/3600) = 23 + 0.11666.... + 0.00678333.... = 23.123443....

GoogleMap 讀取kml檔

圖片
前一陣子網路上有一個網友寫信給我要我幫忙調整一個問題我才發現GoogleMap API本身有提供直接讀取kml檔的類別。原本我已為kml檔只能匯入GoogleEarth或者匯入Google地圖裡面,看來我不了解的是還真不少><,下面我就簡單的介紹一下GoogleMap所提供的API操作。 GoogleMap 本身有提供一個專門讀取kml檔的 KmlLayer物件,因此只要有一個正確的kml檔,就可以直接載入所需的資訊。

C#讀取DBF檔

圖片
最近有玩到一個比較陌生的資料庫,副檔名是.dbf檔,網路查一下是Visual FoxPro的資料庫格是,分享一下如何使用C#來讀取,使用C#讀取dbf檔其實一點也不難,查了一下文件大家都比較推薦使用OLE DB,首先需要下載安裝 Microsoft OLE DB Provider for Visual FoxPro 9.0 ,接下來就可以直接使用C#來操作OLE DB。 //Data Source 為資料庫資料夾的路徑 string strConnection = @"Provider=vfpoledb;Data Source=c:\;Collating Sequence=machine;"; OleDbConnection oleCon = new OleDbConnection(); oleCon.ConnectionString = strConnection; OleDbCommand oleCom = new OleDbCommand(); oleCom.Connection = oleCon; DataTable myTable = new DataTable(); //xxx.dbf為資料庫檔案名稱 string strSql = "select * from [xxxx.dbf]"; oleCom.CommandText = strSql; OleDbDataAdapter oleDap = new OleDbDataAdapter(); oleDap.SelectCommand = oleCom; oleDap.Fill(myTable); 操作畫面如下 本文附件 :  VFPOLEDBSetup.msi  : Visual FoxPro9.0 ReadDBF.rar : Sample Code (需要密碼請留言給我) bar.DBF : 測試資料庫