2014年7月1日 星期二

如何設定在同一台主機上的 SQL Server 2014 和 SQL Server 2012

當 SQL Server 2014 和 SQL Server 2012 被安裝在同一台 Windows Server 2012 伺服器上時,其中一個資料庫實體可能會發生無法從遠端連線的狀況,其實 SQL Server 2014 的連線方式和之前的版本並無不同,都要啟用 TCP/IP 的通訊協定,由於預設是不啟用的,這便是造成多數遠端 Client 無法連線的主因。然而,當在同一台主機上安裝了多種版本的資料庫之後,情況又會變得更複雜,我們必須啟動 SQL Browser 服務,讓 SQL Browser 能幫助 Client 連線到正確的資料庫,此時防火牆可能又跑出來攪局,讓人更加摸不著頭緒,不知無法遠端連線的問題究竟出在哪裡?

以下的說明,希望能有助於類似問題的解決。

1. 開啟 TCP/IP 通訊協定
下圖上方是 SQL Server 2014 的組態管理畫面,下方是  SQL Server 2012 的組態管理畫面,我們可以發現 SQL Server 2014 的組態管理竟然少了 SQL Server 2012 的網路組態設定,必須啟用二者的 TCP/IP 通訊協定,才能讓 Client 遠端連線這二種資料庫,所以如果只是使用 SQL Server 2014 的組態管理,將會被誤導而忘記啟用 SQL Server 2012 的 TCP/IP 通訊協定。


2. 確認 TCP/IP 通訊協定內容
下圖上方是 SQL Server 2014 的 TCP/IP 的 IP 位址設定,IP1 ~ IP9 皆可不啟用(預設),我們只要記住 IPALL 的 TCP 動態通訊埠的值即可(可自設),此例為:49204,下圖下方是 SQL Server 2012 的 TCP/IP 的 IP 位址設定,同樣保留 IP1 ~ IP9 不啟用(預設),記住 IPALL 的 TCP 動態通訊埠的值,此例為:49205,這二個 Port 值之後必須在防火牆中開啟。

 SQL Server 2014 的 TCP/IP 的 IP 位址設定


 SQL Server 2012 的 TCP/IP 的 IP 位址設定

3. 確認 SQL Server Browser 正在執行
由組態管理員的 SQL Server 服務確認 SQL Server Browser 是否正在執行,若無法在組態管理員中啟動,請自行至 Windows 服務中啟動。


4. 確認 SQL Server Browser 可通過防火牆
1. 確認防火牆輸入規則已啟用 SQL Browser Service EXE 的 TCP 及 UDP

2. 確認防火牆已允許 SQL Browser Service EXE 通過

5. 新增輸入規則,以開啟資料庫連接埠



經由以上設定,遠端 Client 便可正確連線到這台 Windows Server 2012 上的任何一個 SQL Server 了。






2014年6月18日 星期三

製作可自動切換語言的 Windows Form 應用程式

在開發一個跨國性產品時,將遇到動態切換使用者介面(UI)文字語言的需求,.Net 的 Windows Form 應用程式早已具備當地語系化的架構,只要依循己設計妥當的開發方式,十分容易就能完成一個能表示多國語言的應用程式,並且能隨時動態切換顯示文字。

我們須具備一個觀念:應用程式的文字都是一種資源,切換顯示文字只不過是在切換資源。所以,在多語言應用程式的開發上,要注意的是以下幾點:

  1. 不同的語言內容,定義在各自的資源檔中。
  2. 程式中使用索引鍵 (Key) 取用文字。
  3. 設定系統作用中的語系,讓系統自動取得正確的文字語言。

以下文章已詳細說明基本的使用過程:

MSDN: 逐步解說:將 Windows Form 當地語系化
http://msdn.microsoft.com/zh-tw/library/y99d1cd3(v=vs.110).aspx

不過文中所說明的方法,只能在程式啟動時,決定一種要顯示的語言,如果我們必須在執行時期即時切換語言的話,要怎麼作呢?

範例:按下按鈕,即時變更顯示語言。



程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void BtnChinese_Click(object sender, EventArgs e)
        {
            ChangeLanguage("zh-TW");
        }

        private void BtnEnglish_Click(object sender, EventArgs e)
        {
            ChangeLanguage("en-US");
        }


        private void ChangeLanguage(string lang)
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
            ComponentResourceManager res = new ComponentResourceManager(typeof(Form1));
            ChangeLanguage(this, res);
        }

        private void ChangeLanguage(Control ctrl, ComponentResourceManager res)
        {
            res.ApplyResources(ctrl, ctrl.Name, Thread.CurrentThread.CurrentUICulture);
            foreach (Control c in ctrl.Controls)
            {
                ChangeLanguage(c, res);
            }
        }
    }
}

2012年8月8日 星期三

HTML 使用 Javascript 執行 PostBack 並傳遞參數回 Server 的做法


<!-- Client -->
    <div>
        <ul>
            <li style="cursor:pointer" onclick="javascript: __doPostBack('','SortSNDesc');" >User SN Desc</li>
            <li style="cursor:pointer" onclick="javascript: __doPostBack('','SortName');">User Name</li>
        </ul>
    </div>


' Server Code Behind
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If IsPostBack Then
            Select Case Request("__EVENTARGUMENT")
                Case "SortSNDesc"
                    ListView1.Sort("UserSN", SortDirection.Descending)
                Case "SortName"
                    ListView1.Sort("FullName", SortDirection.Ascending)
            End Select
        End If
    End Sub