2014年2月24日 星期一

Life cycle

今天對一支Winform程式做Code review的時候,發現 ... 為什麼執行後沒有馬上跑出Form??

原來是開發者在Form Load的時候,已經開始在查詢資料庫; 如果我是USER,真的會摸不著頭緒,可能會以為AP沒有開始執行,或是以為系統有問題呢~

這個問題可能發生在
1.  對於Winform Event Life cycle不熟悉
2.  未以USER和客戶的角度思考UI/UX
3.  系統設計上未做最佳化 test case太少

後面兩點可能需要經驗的累積,但是程式的Life cycle 應該是基本具備的~
Order of Events in Windows Forms


雖然這支程式可以正常執行及跑出正確結果, 但是設計上可以先顯示一些訊息給USER 或建立另一條Thread去處理繁雜的作業。

2014年2月21日 星期五

Too many parameters provided in the RPC request trouble-shooting

內送的表格式資料流 (TDS) 遠端程序呼叫 (RPC) 通訊協定資料流不正確。此 RPC 要求中提供了太多參數。最大值為 2100。

The incoming tabular data stream(TDS) remote procedure call (RPC) protocol stream is incorrect.Too many parameters provided in the RPC request.The maximum is 2100.


原本以為Sql Server上了patch可以解決這個問題,但是後來參考其他文章才發現是程式設計上的問題, 所以最後是以修改程式的方式解決。


Reference

Too many parameters were provided in this RPC request. The maximum is 2100.?

2014年2月19日 星期三

[TFS] 刪除工作區

因為在TFS中有離職同仁lock的檔案(鎖定簽出)

所以無法直接從TFS總管解除lock或刪除檔案 ... 必須手動下指令解除。

1.   打開「VS2013 開發人員命令提示字元」
2.   查詢該人員的工作區
tf workspaces /owner:[
網域帳號] [/Server:http://XXX/tfs]

顯示結果
集合: http://XXXXX:8080/tfs/defaultcollection
工作區    擁有人 電腦      註解
--------- ------ --------- ----------------------------------------------------
P202XXXX
XX  P202XXXX
SHANXX   
XX  SHANXX

3.   可以使用以下指令嘗試簽出該工作區所有簽出的檔案
tf lock /lock:none /workspaces:
[工作區名稱];[網域帳號] /recursive $/

如果TFS Server有開啟鎖定簽出的功能,則可能會出現以下警告
TF10152:
項目 $/icxxx-TMS/DOC/SA/icxxx-XXX-SA-系統分析書.doc 必須保持鎖定,因為它的檔案類型不允許多重簽出。


4.   最乾脆的做法是直接將該人員所有的工作區刪除,則檔案自動會解除鎖定,TFS Server上也省了一些空間。
tf workspace /delete /server:
[TFS server url] [工作區名稱];[網域帳號]

Example :

tf workspace /delete /server:http://p20XXXXX:8080/tfs shaxxx;p20xxxxx
無法復原刪除的工作區。
伺服器 'http://xxxxxxx:8080/tfs' 上的工作區 'shaxxx;p202xxxxx' 45 項暫止的變更。
您確定要刪除這個工作區? (/)

5.   完成~






2014年2月18日 星期二

TFS組建失敗:lost System.Web.Optimization

更新到Web API 2.1 Client  5.1.1後,
發現Check in 到TFS的組建一直失敗,顯示的資訊是找不到System.Web.Optimization

後來看了幾篇文章,也無法讓TFS的組建成功,最後解決的方式是使用nuget再更新一次 System.Web.Optimization的DLL

PM> Install-Package Microsoft.AspNet.Web.Optimization


[C#] Starup IIS express in UnitTest

在寫單元測試的時候,因為有些測試需要先啟動IIS Express的服務(Web api, web service … etc),所以實作了以下程式碼,方便直接在單元測試啟動某個服務。

Example :

[TestMethod]
public void TestStartIisexpress()
{
String siteName = "Icash.Rw.Service";
using(Startup startUp = new Startup())
{
startUp.StartIisexpress(siteName);
}
}


啟動IIS Express的程式碼
/// <summary>
/// 啟動相關服務或程式
/// </summary>
    public class Startup : IDisposable
    {
        private Process _iisProcess;

        /// <summary>
        /// 啟動IIS Express服務
        /// </summary>
        public void StartIisexpress(String siteId)
        {
            try
            {
                var thread = new Thread(new ParameterizedThreadStart(openIisExpress)){ IsBackground = true };
                thread.Start(siteId);
            }
            catch (Exception)
            {
                throw;
            }
        }


        private void openIisExpress(object siteId)
        {
            var startInfo = new ProcessStartInfo
            {
                WindowStyle = ProcessWindowStyle.Normal,
                ErrorDialog = true,
                LoadUserProfile = true,
                CreateNoWindow = false,
                UseShellExecute = false,
                //Arguments = string.Format("/path:\"{0}\" /port:{1}", appLocation, port)
                Arguments = string.Format("/site:{0}", siteId)
            };

            var programfiles = string.IsNullOrEmpty(startInfo.EnvironmentVariables["programfiles"])
                                ? startInfo.EnvironmentVariables["programfiles(x86)"]
                                : startInfo.EnvironmentVariables["programfiles"];

            startInfo.FileName = programfiles + "\\IIS Express\\iisexpress.exe";

            try
            {
                this._iisProcess = new Process { StartInfo = startInfo };

                this._iisProcess.Start();
                this._iisProcess.WaitForExit();
            }
            catch
            {
                this._iisProcess.CloseMainWindow();
                this._iisProcess.Dispose();
            }
        }

        /// <summary>
        /// Dispose
        /// </summary>
        public void Dispose()
        {
           
        }

    }

2014年2月12日 星期三

Hi/Lo Algorithm Reference

雖然前一版的 HiLo Web Service 舊程式堪用,

但是和新的前端 framework 搭配總是覺得有點卡卡的。

所以今天用Web Api 的架構改寫掉了。

也順便查到幾篇Hi/Lo algorithm的相關好文章~

RavenDB - The HiLo what how and why

What's the Hi/Lo algorithm?

2014年2月7日 星期五

[C#] Null value in SqlParameter

If you assign a null value to a SqlParameter object, it will cause an Error.
So the correct way is using DBNull.Value

For example,

sqlObj.SqlParams = new SqlParameter[]{
                    new SqlParameter("@TRANS_AMT", transLog.TransAmt),
                    new SqlParameter("@LEFT_BAL", transLog.LeftBal),
                    new SqlParameter("@LOG_TIME", transLog.LogTime)
                };
foreach(SqlParameter pa in sqlObj.SqlParams)
{
if(pa.Value==null)
{
   pa.Value =
DBNull.Value;
}
}


When executing the sql query, the column in Database will be a NULL value when it’s assigned as DBNull.Value.

Reference
How to assign null to a sqlparameter?