搜尋此網誌

2014年12月3日 星期三

VISUAL STUDIO 2008 DEFAULT BROWSER(預設瀏覽器)

我們在安裝好VS2008開發工具時,一般都會使用內建網頁伺服器來做測試、除蟲…等工作,但有個問題一直困擾我,就是VS2008預設啟動的「瀏覽器」是IE,但各位也知道,IE雖然是市佔率最高的瀏覽器,但它可不是最好debug的瀏覽器,所以我一直在想,有沒有辦法可以改變這個預設值。

但我找遍VS2008裡「工具」→「選項」所有細項,沒有就是沒有,也慢慢養成,VS2008開IE,我再打開Firefox,把IE裡的網址copy過去,再關閉IE,開始在Firefox工作。

這樣的步驟很多餘,我一直想要按「在瀏覽器中檢視」→「Firefox」→「debug,工作」。

今天終於找到了解決辦法。@.@""

「檔案」→「瀏覽方式」;


就那麼簡單,想要什麼自己加,你也可以在已加入的列表點兩下,使用選擇的瀏覽器來開啟內建網頁伺服器,「Ctrl+S」好用,「Ctrl+Shift+S」「Ctrl+Shift+W」也還不錯,但還是把「功能表列」看清楚,設定的東西玩玩無差,不要亂按確定就好。

2014年12月1日 星期一

C# WINFORM 取得執行程式所在的路徑方法

1.取得和設置當前目錄(即該進程從中啟動的目錄)的完全限定路徑。
string str = System.Environment.CurrentDirectory;
結果: C:\xxx\xxx

2.取得啟動了應用程序的可執行文件的路徑,不包括可執行文件的名稱。
string str = System.Windows.Forms.Application.StartupPath;
結果: C:\xxx\xxx

3.取得應用程序的當前工作目錄。
string str = System.IO.Directory.GetCurrentDirectory();
結果: C:\xxx\xxx

4.取得當前 Thread 的當前應用程序域的基目錄,它由程序集衝突解決程序用來探測程序集。
string str = System.AppDomain.CurrentDomain.BaseDirectory;
結果: C:\xxx\xxx\

5.取得和設置包含該應用程序的目錄的名稱。
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
結果: C:\xxx\xxx\

6.取得啟動了應用程序的可執行文件的路徑,包括可執行文件的名稱。
string str = System.Windows.Forms.Application.ExecutablePath;
結果: C:\xxx\xxx\xxx.exe

7.取得當前執行的exe的文件名。
string str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
結果: C:\xxx\xxx\xxx.exe

8.取得當前進程的完整路徑,包含文件名。
string str = this.GetType().Assembly.Location;
結果: C:\xxx\xxx\xxx.exe

2014年11月4日 星期二

長時間執行stored procedrue設定方式

1. 先試試在connection string加上 ;Connect Timeout=0;Connection Lifetime=100


2. 不行的話,就改
     SqlCommand DBCommand = new SqlCommand();
     DBCommand.CommandTimeout = 100000;

2014年11月2日 星期日

DBNull.Value 別和 null 混為一談

在 .NET Framework 中,時常為了要判斷來自資料庫的值是不是 NULL,通常都會大傷腦筋,而有些開發人員會使用 if (myField.Value == null) 來判斷,其實這是不對的~

資料庫的 NULL 值是一個標記,標示說資料庫目前這個欄位是空的,它的本質和空字串也不同,所以用 string.IsNullOrEmpty(myField.Value) 是無法判斷它是否為 NULL 值的,這也就是為什麼 DataRow 要提供一個 IsNull() 方法,而 DataReader 要多一個 IsDBNull() 的方法,就是因為 NULL 值的獨特性。

.NET Framework 官方文件也有提到:

請勿將物件導向程式語言中 Null 參照 (即 Visual Basic 中的 Nothing) 的概念與 DBNull 物件混為一談。在物件導向程式語言中,Null 參照 (即 Visual Basic 中的 Nothing) 表示物件的參考不存在。DBNull 則表示未初始化的變數或不存在的資料庫資料行。

那是否有一定可以在程式中判斷 NULL 值的?其實有的,System.DBNull 類別所提供的成員 Value (DBNull.Value) 就是代表資料庫中的 NULL 標記,因此開發人員可以使用如下的程式碼來判斷是否為 NULL 值:

public bool IsNull(object compareValue)
{
   return (DBNull.Value.Equals(compareValue));
}

或者是直接用 == 算符也可以:

public bool IsNull(object compareValue)
{
   return (compareValue == DBNull.Value);
}

2014年10月22日 星期三

如何過濾及排序DataTable並複製到新的DataTable

1.前言
將DataTable經由過濾,排序得到新的資料表。

2.說明
提供兩個方法,一種是將DataTable轉成DataView,利用DataView的RowFilter及Sort方法得到所需資料,然後再將DataView轉成DataTable。
另一種方法是利用DataTable.Select().CopyToDataTable()方式得到資料表。

private DataTable DataTableFilterSort(DataTable oTable, string filterExpression, string sortExpression)
{
    DataView dv = new DataView();
    dv.Table = oTable;
    dv.RowFilter = filterExpression;
    dv.Sort = sortExpression;
    DataTable nTable = dv.ToTable();
    return nTable;
}

private DataTable DataTableFilterSort(DataTable oTable, string filterExpression, string sortExpression)
{
    DataTable nTable = oTable.Select(filterExpression, sortExpression).CopyToDataTable();
    return nTable;
}

3.應用

DataTable oTable = GetDataTable("cars");
DataTable nTable = DataTableFilterSort(oTable, "SPEED='10'", "DIST asc");
dataGridView1.DataSource = nTable;

2014年10月20日 星期一

判斷字串中是否有中文字

Demo Code Ver. :.NET Framework 4.0

最近做一個小功能,要判斷傳入字串是否含有中文,再作後續的動作。這邊記錄判斷邏輯的寫法,程式的邏輯

為當傳入參數只要是字串中有任何一個中文字都會回傳True

謝謝Allen kuo指正,小弟這邊有一個地方沒有考慮到,應該還要多考慮一個中文的Unicode範圍,這樣才會精準

Unicode字元範圍

3400~4DFFh:中日韓認同表意文字擴充A區,總計收容6,582個中日韓漢字。
4E00~9FFFh:中日韓認同表意文字區,總計收容20,902個中日韓漢字。
A000~A4FFh:彝族文字區,收容中國南方彝族文字和字根。
AC00~D7FFh:韓文拼音組合字區,收容以韓文音符拼成的文字。
F900~FAFFh:中日韓兼容表意文字區,總計收容302個中日韓漢字。
FB00~FFFDh:文字表現形式區,收容組合拉丁文字、希伯來文、阿拉伯文、中日韓直式標點、小符號、半角符號、全角符號等。

public static bool isChinese(string strChinese)
{
    bool bresult = true;
    int dRange = 0;
    int dstringmax=Convert.ToInt32("9fff", 16);
    int dstringmin=Convert.ToInt32("4e00", 16);
    for (int i = 0; i < strChinese.Length; i++)
    {
        dRange = Convert.ToInt32(Convert.ToChar(strChinese.Substring(i, 1)));
        if (dRange >= dstringmin && dRange <dstringmax )
        {
            bresult = true;
  break;
        }
        else
        {
            bresult = false;
        }
    }

    return bresult;
}

驗證結果程式

Console.WriteLine(isChinese("中文").ToString());
Console.WriteLine(isChinese("Chinese").ToString());

Console.WriteLine(isChinese("AA中").ToString());



必須要考慮到unicode範圍才會正確





2014年10月19日 星期日

C# 讀取和寫入.TXT

進行寫入動作

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        // Create an instance of StreamWriter to write text to a file.
        // The using statement also closes the StreamWriter.
        using (StreamWriter sw = new StreamWriter("TestFile.TXT"))   //小寫TXT    
        {
            // Add some text to the file.
            sw.Write("This is the ");
            sw.WriteLine("header for the file.");
            sw.WriteLine("-------------------");
            // Arbitrary objects can also be written to the file.
            sw.Write("The date is: ");
            sw.WriteLine(DateTime.Now);
        }
    }
}

讀取動作

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        try { // Create an instance of StreamReader to read from a file.
            // The using statement also closes the StreamReader.
            using (StreamReader sr = new StreamReader("TestFile.TXT"))     //小寫TXT
            {
                String line;
                // Read and display lines from the file until the end of
                // the file is reached.
                while ((line = sr.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
            }
        }
        catch (Exception e)
        {
            // Let the user know what went wrong.
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
}

CLR在過去60秒一直無法從COM內容

原因為程式碼有大量的迴圈運算

因此編譯器"提醒"說會長時間沒有回應(因為要算很久)

按下"繼續"即可

或是想將ContextSwitchDeadlock的提醒關掉

可以從 偵錯(D) > 例外狀況(X) > Managed Debugging Assistants

將 ContextSwitchDeadlock 的勾勾去掉


2014年10月17日 星期五

[C#] 計算字串的長度方式

怕之後年紀大會忘記,趕緊記下來先
.NET Framework 中有內建類別(Encoding )取得字串的長度 
想要取得字串中是否含有中文字串的實際長度,有下列作法
Ⅰ、Length:取得目前 String 物件中字元的數目,僅計算字串長度(中文 2 byte,英文 1 byte)
Ⅱ、GetByteCount:計算編碼一組字元所產生的位元組數目(判斷多少位元組會編碼一組 Unicode 字元)
Ⅲ、GetBytes:計算解碼位元組序列所產生的字元數目(執行實際的編碼作業)
PS:記得先參考 System.Text
《範例》

string myString = "讓你媽媽NEW一下";
// Length
Response.Write("Length:" + myString.Length);

// GetByteCount:使用目前系統的編碼方式
Response.Write("GetByteCount:" + Encoding.Default.GetByteCount(myString));

// GetBytes
Response.Write("GetBytes:" + Encoding.Default.GetBytes(myString).Length.ToString());

int myStringCount = 0;
for (int i = 0; i < myString.Length; i++)
{
  byte[] tIntByte = Encoding.Default.GetBytes(myTextBoxText.Substring(i, 1));
                
  // 中文字
  if (tIntByte.Length == 2)
  {
    //To Do Something
  }

  myStringCount += tIntByte.Length;
}
Response.Write("GetBytes(FOR):" + myStringCount.ToString());

《結果》
另外需要注意的一點,如果你是使用 GetBytes 計算字串長度的話
需要注意網頁編碼的方式,有可能因為編碼方式的不同,使用 GetBytes 時會有不同的結果
所以如果取得的字串長度跟你想像中的有差異,可以檢查看看網頁編碼的方式喔!
《範例》
Response.Write("GetBytes(big5):" + Encoding.GetEncoding("big5").GetBytes(myString).Length.ToString());
Response.Write("GetBytes(utf-8):" + Encoding.GetEncoding("utf-8").GetBytes(myString).Length.ToString());
《結果》

2014年10月16日 星期四

全形半形轉換

///<summary>
///字串轉全形
///</summary>
///<param name="input">任一字元串</param>
///<returns>全形字元串</returns>
private static string ToWide(string input)
{
    //半形轉全形:
    char[] c = input.ToCharArray();
    for (int i = 0; i < c.Length; i++)
    {
        //全形空格為12288,半形空格為32
        if (c[i] == 32)
        {
            c[i] = (char)12288;
            continue;
        }
        //其他字元半形(33-126)與全形(65281-65374)的對應關係是:均相差65248
        if (c[i] < 127)
            c[i] = (char)(c[i] + 65248);
    }
    return new string(c);
}

///<summary>
///字串轉半形
///</summary>
///<paramname="input">任一字元串</param>
///<returns>半形字元串</returns>
private static string ToNarrow(string input)
{
    char[] c = input.ToCharArray();
    for (int i = 0; i < c.Length; i++)
    {
        if (c[i] == 12288)
        {
            c[i] = (char)32;
            continue;
        }
        if (c[i] > 65280 && c[i] < 65375)
            c[i] = (char)(c[i] - 65248);
    }
    return new string(c);
}

2014年10月8日 星期三

[Oracle] PL/SQL 的常用函數

nvl(expr1,expr2) - 檢查null,回傳參數1 or 2
ex: select nvl('a','b') from dual  ==> a
      select nvl(null,'b') from dual  ==> b

to_number(string1) - 轉換文字型態為數字(varchar to number)
ex: select to_number('234') from dual  ==> 234

to_date(string1,[foramt_mark],[nls_language]) - 轉換文字型態為日期格式(varchar to date)
ex: to_date('2009/07/09', 'yyyy/mm/dd') ==> 2009/7/9
      to_date('20090709', 'yyyymmdd') ==> 2009/7/9
      to_date('200907'),'yyyymm') ==> 2009/7/1

last_day(date1) - 日期月份的最後一天
ex: select last_day(sysdate) from dual ==> 月底,系統本月的最後一天
      select last_day(add_months(sysdate,1)) from dual ==> 下個月月底
      select last_day(sysdate)+1 from dual ==> 下個月1號

decode(條件, 條件1, 結果1, [條件2, 結果2]... [, default] ) - 條件等於條件1則傳回結果1,條件2則結果2,類似MSSQL 的 Case When應用。
ex:  select decode('C','a1','a2','b1','b2','c1') from dual ==> c1
       UPDATE UPDDATE= decode(PRICE,InputPRICE,UPDDATE,SYSDATE) ==> 我常用的語法,當輸入價格不同時,才更新Update

cast(column_name as DataType) - 變更欄位資料型態與長度
ex:  select cast('1000' as number) from dual
       select cast('abc' as varchar2(100)) from dual

instr(string1,string2) - 查詢字串位置
ex: select INSTR('aaabbbcdddeee','c') from dual ==> 7

2014年10月1日 星期三

賦予table使用者權限

grant select,insert,update,delete on paysys.payccs1 to paysys_role;

create synonym pay.payccs1 for paysys.payccs1;

2014年9月29日 星期一

C# 取得自己Hostname 及 IP

C# 取得自己Hostname 及 IP

C# 要取得自己的 hostname 及所有介面的ip,可以使用以下的方法:

using System.Net;

// 取得本機hostname的方法
localhostname = Environment.UserDomainName;

//取得遠端hostname得到IP的方法
IPHostEntry ipHostInfo = Dns.GetHostEntry(hostname);

//得到遠端IP個數
int ipaddrnum = ipHostInfo.AddressList.GetLength(0);

// ipHostInfo 中有所有的 IPAddress
foreach (IPAddress ipaddress in  ipHostInfo.AddressList){}

// 把字串轉成IP的方法
IPAddress ip = IPAddress.Parse ( "x.x.x.x" );

2014年9月25日 星期四

SQL Server 2005 如何解開 Lock


使用 select object_id('TABLE_NAME') 或是 select object_name('OBJECT_ID') 去查出該 Lock 是屬於哪個 Table

使用 sp_lock 去查詢被 Lock 的資料有哪些, 因為他不會直接列出 Table 名稱, 所以可透過上述取得OBJID

接下來針對SPID去下指令即可

kill 81

2014年9月3日 星期三

db command

using System.Data.SqlClient;
using System.Configuration;
using Oracle.DataAccess.Client;
using System.Collections;      

        public static SqlConnection CPCIS1Conn = new SqlConnection(ConfigurationSettings.AppSettings["ConncetionStringCPCIS1"].ToString());
        public static OracleConnection ORASRVConn = new OracleConnection(ConfigurationSettings.AppSettings["ConncetionStringORASRV01"].ToString());

        public static ArrayList tSQL = new ArrayList();
        public static ArrayList oSQL = new ArrayList();

        protected DataTable GetDataSQL(string Command, string TableName)
        {
            DataTable Dt = new DataTable();
            CPCIS1Conn.Close();
            CPCIS1Conn.Open();
            try
            {
                Dt.TableName = TableName;
                string sTranstionSql = Command;
                SqlCommand cmd = new SqlCommand(sTranstionSql, CPCIS1Conn);
                SqlDataReader sdr = cmd.ExecuteReader();
                Dt.Load(sdr);
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
            CPCIS1Conn.Close();
            return Dt;
        }

        protected DataTable GetDataORACLE(string Command, string TableName)
        {
            DataTable Dt = new DataTable();
            ORASRVConn.Close();
            ORASRVConn.Open();
            try
            {
                Dt.TableName = TableName;
                string sTranstionSql = Command;
                OracleCommand cmd = new OracleCommand(sTranstionSql, ORASRVConn);
                OracleDataReader sdr = cmd.ExecuteReader();
                Dt.Load(sdr);
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
            ORASRVConn.Close();
            return Dt;
        }

        protected bool WriteDataSQL(ArrayList SQL)
        {
            try
            {
                SqlCommand DBCommand = new SqlCommand();
                SqlTransaction DBTransaction;
                SqlConnection DBConnection = new SqlConnection();
                DBConnection.ConnectionString = ConfigurationSettings.AppSettings["ConncetionStringCPCIS1"].ToString();
                DBConnection.Open();
                DBCommand = DBConnection.CreateCommand();
                DBTransaction = DBConnection.BeginTransaction("SQLTransaction");
                DBCommand.Connection = DBConnection;
                DBCommand.Transaction = DBTransaction;
                try
                {
                    for (Int32 i = 0; i < SQL.Count; i++)
                    {
                        DBCommand.CommandText = SQL[i].ToString();
                        DBCommand.ExecuteNonQuery();
                    }
                    DBTransaction.Commit();
                    tSQL.Clear();
                    return true;
                }
                catch (Exception ex)
                {
                    DBTransaction.Rollback();
                    tSQL.Clear();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                tSQL.Clear();
                throw new Exception(ex.Message);
            }

        }

        protected bool WriteDataORACLE(ArrayList SQL)
        {
            try
            {
                OracleCommand DBCommand = new OracleCommand();
                OracleTransaction DBTransaction;
                OracleConnection DBConnection = new OracleConnection();
                DBConnection.ConnectionString = ConfigurationSettings.AppSettings["ConncetionStringORASRV01"].ToString();
                DBConnection.Open();
                DBCommand = DBConnection.CreateCommand();
                DBTransaction = DBConnection.BeginTransaction();
                DBCommand.Connection = DBConnection;
                //DBCommand.Transaction = DBTransaction;
                try
                {
                    for (Int32 i = 0; i < SQL.Count; i++)
                    {
                        DBCommand.CommandText = SQL[i].ToString();
                        DBCommand.ExecuteNonQuery();
                    }
                    DBTransaction.Commit();
                    //DBTransaction.Rollback();
                    oSQL.Clear();
                    return true;
                }
                catch (Exception ex)
                {
                    DBTransaction.Rollback();
                    oSQL.Clear();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                oSQL.Clear();
                throw new Exception(ex.Message);
            }
        }

2014年8月20日 星期三

取得Oracle資料表、欄位、索引、主鍵值資訊

SELECT
  C.OWNER, C.TABLE_NAME, C.COLUMN_ID, C.COLUMN_NAME,
  DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_DEFAULT,
  NULLABLE, COMMENTS
FROM
  ALL_TAB_COLUMNS C
JOIN ALL_TABLES T ON
  C.OWNER = T.OWNER AND C.TABLE_NAME = T.TABLE_NAME
LEFT JOIN ALL_COL_COMMENTS R ON
  C.OWNER = R.Owner AND
  C.TABLE_NAME = R.TABLE_NAME AND
  C.COLUMN_NAME = R.COLUMN_NAME
WHERE
  C.OWNER  = 'PAYSYS' AND TABLE_NAME LIKE 'PWS%'
ORDER BY C.TABLE_NAME, C.COLUMN_ID

2014年7月8日 星期二

oracle 10g 刪除咬住的session

SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID order by sid;


ALTER SYSTEM KILL SESSION 'SID,SERIAL#';

2014年6月11日 星期三

Oracle中dual表的用途

dual是一個虛擬表,用來構成select的語法規則,oracle保證dual裡面永遠只有一條記錄。我們可以用它來做很多事情,如下:

1、查看當前使用者,可以在 SQL Plus中執行下面語句 select user from dual;

2、用來調用系統函數

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--獲得當前系統時間

select SYS_CONTEXT('USERENV','TERMINAL') from dual;--獲得主機名稱

select SYS_CONTEXT('USERENV','language') from dual;--獲得當前 locale

select dbms_random.random from dual;--獲得一個亂數

3、得到序列的下一個值或當前值,用下面語句

select your_sequence.nextval from dual;--獲得序列your_sequence的下一個值

select your_sequence.currval from dual;--獲得序列your_sequence的當前值

4、可以用做計算機 select 7*9 from dual;

------

Oracle系統中dual表是一個「神秘」的表,網上有很多網友都對該表進行了測試,該表只有一行一列,其實該表和系統中的其他表一樣,一樣可以執行插入、更新、刪除操作,還可以執行drop操作。但是不要去執行drop表的操作,否則會使系統不能用,資料庫起不了,會報Database startup crashes with ORA-1092錯誤。此時也不要慌亂,可以通過執行以下步驟來進行恢復。可以用sys使用者登陸。

SQL> create pfile=’d:pfile.bak’ from spfile

SQL> shutdown immediate

在d:pfile.bak檔中最後加入一條:

replication_dependency_tracking = FALSE

重新開機資料庫:

SQL> startup pfile=’d:pfile.bak’

SQL> create table 「sys」.」DUAL」

[an error occurred while processing this directive]

=====

DUAL ? 有什麼神秘的? 當你想得到ORACLE系統時間, 簡簡單單敲一行SQL 不就得了嗎? 故弄玄虛.... 

SQL> select sysdate from dual; 

SYSDATE 

--------- 

28-SEP-03 

哈哈, 確實DUAL的使用很方便. 但是大家知道DUAL倒底是什麼OBJECT, 它有什麼特殊的行為嗎? 來,我們一起看一看. 首先搞清楚DUAL是什麼OBJECT : 

SQL> connect system/manager 

Connected. 

SQL> select owner, object_name , object_type from dba_objects where object_name like '%DUAL%'; OWNER OBJECT_NAME OBJECT_TYPE 

--------------- --------------- ------------- 

SYS DUAL TABLE PUBLIC DUAL SYNONYM 

原來DUAL是屬於SYS schema的一個表,然後以PUBLIC SYNONYM的方式供其他資料庫USER使用. 

再看看它的結構: 

SQL> desc dual Name Null? Type 

----------------------------------------- -------- ---------------------------- 

DUMMY VARCHAR2(1) 

SQL> 

只有一個名字叫DUMMY的字元型COLUMN . 

然後查詢一下表裡的資料: 

SQL> select dummy from dual; 

DUMMY 

---------- 

X 

哦, 只有一條記錄, DUMMY的值是’X’ .很正常啊,沒什麼奇怪嘛. 好,下面就有奇妙的東西出現了! 

插入一條記錄: 

SQL> connect sys as sysdba 

Connected. 

SQL> insert into dual values ( 'Y'); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select count(*) from dual; 

COUNT(*) 

---------- 

2 

迄今為止,一切正常. 然而當我們重新查詢記錄時,奇怪的事情發生了 

SQL> select * from dual; 

DUMMY 

---------- 

X 

剛才插入的那條記錄並沒有顯示出來 ! 明明DUAL表中有兩條記錄, 可就是只顯示一條! 

再試一下刪除 ,狠一點,全刪光 ! 

SQL> delete from dual; /*注意沒有限定條件,試圖刪除全部記錄*/ 

1 row deleted. 

SQL> commit; 

Commit complete. 

哈哈,也只有一條記錄被刪掉, 

SQL> select * from dual; 

DUMMY 

---------- 

Y 

為什麼會這樣呢? 難道SQL的語法對DUAL不起作用嗎?帶著這個疑問,

我查詢了一些ORACLE官方的資料. 原來ORACLE對DUAL表的操作做了一些內部處理,儘量保證DUAL表中只返回一條記錄.當然這寫內部操作是不可見的 . 看來ORACLE真是蘊藏著無窮的奧妙啊! 

2014年4月14日 星期一

如何從 Server-side 指定 IE8 瀏覽器應使用的瀏覽器模式

IE8 就快要正式推出了,在這個時刻,身為網頁開發者的你是否已經準備應戰了呢?IE 相容性問題一直以來都是網頁開發人員的痛,光是 IE6 + IE7 就不知道讓多少人痛苦萬分。不過還好,到了 IE8 至少還有個機會喘息一下。如果來不及準備,那就要好好看看這篇文章,至少不會讓你的網站那麼快陣亡。
雖然 IE8 提供「相容性檢視」功能 (如下圖),可以讓你以 IE7 預設的文件模式顯示網頁,不過在預設的情況下,IE8 還是會選擇「Internet Explorer 8 標準模式」進行網頁的顯示,由於還是有不少地方與 IE7 不相容,所以你的網頁還是有可能會亂掉。
IE8 提供「相容性檢視」功能
除了由使用者自行設定之外,事實上,IE8 還提供了另一種解決方案,讓網站管理員可以透過設定 HTTP Header 或 HTML META Tag 的方式,讓 IE8 自動選擇「相容性檢視」進行顯示網頁,如此一來你就不用害怕你的網站在 IE8 會亂掉的問題了。

第一種宣告方式:設定整個網站都以 IE7 相容模式顯示網頁 ( HTTP HEADER )

若以設定 IIS6 為例,你可以在 網際網路資訊服務 (IIS) 管理員 中,在站台中新增一個自訂的 HTTP 標頭名為 X-UA-Compatible,並且將值設定為 IE=EmulateIE7 即可完成全站設定。
你可以在 IIS 管理員中,在站台新增一個自訂的 HTTP 標頭名為 X-UA-Compatible,並且將值設定為 IE=EmulateIE7 即可完成全站設定。
如果是 IIS7 那就更簡單了,除了透過圖形化介面修改外,也可以直接修改網站根目錄下的 web.config 檔,並在 <httpProtocol> 區段內加入以下這行即可:
<httpProtocol> 

     <customHeaders> 
          <clear /> 
          <add name="X-UA-Compatible" value="IE=EmulateIE7" /> 
     </customHeaders> 

</httpProtocol>
至於 Apache Web Server 來講,你只要啟用 mod_headers 模組後,加底下這行到你的 VirtualHost 設定即可:
Header add X-UA-Compatible IE=EmulateIE7
只要這樣設定後,你的網站在 IE8 中檢視時,就會預設以模擬 IE7 文件模式的顯示方式運作了。

第二種宣告方式:設定特定網頁以 IE7 相容模式顯示網頁 ( META TAG )

這方式可以套用在「特定頁面」中,是以「頁面」為基礎的調整,你只要在 <head> 與 </head> 之間加入以下這行 Meta Tag 即可套用完成:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
但有一點必須特別注意,這一行 Meta Tag 的宣告必須出現在 <head> ... </head> 之中,而且 <head> 一定要出現在 <body> 之前,才會正確套用 IE8 的「相容性檢視」功能,例如:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> 
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
</head>
<body>
    <h1>TEST</h1>
</body>
</html>
---
以上二種宣告方式是以「頁面」為基礎的宣告方式優先權較高,所以比較安全的設定法,通常是設定 HTTP Header 為 IE=EmulateIE7,若頁面中有支援 IE8 的頁面,才設定成 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /> 讓 IE8 顯示該網頁時得以用 Internet Explorer 8 標準模式進行網頁顯示。

2014年4月6日 星期日

SQL去除欄位前後空白及斷行字元

SQL 中的 TRIM 函數是用來移除掉一個字串中的字頭或字尾。最常見的用途是移除字首或字尾的空白。這個函數在不同的資料庫中有不同的名稱:

MySQL: TRIM(), RTRIM(), LTRIM()
Oracle: RTRIM(), LTRIM()
SQL Server: RTRIM(), LTRIM()

SQL Server及Oracle沒有TRIM()函數,因此可用下列的語法清除:

-- SQL去除斷行字元 (1st)
UPDATE [Donor]
SET [DonorList] = REPLACE(([DonorList]), CHAR(10), '');

-- SQL去除前後空白 (2rd)
UPDATE [Donor]
SET [DonorList] = LTRIM(RTRIM([DonorList]));
而UI裏該欄位也要在異動資料時,自動去除斷行及空白字元。

// C#去除斷行及空白字元
this.ctrlDonorList.Text = this.ctrlDonorList.Text.Trim('\r', '\n', ' ');

如此內服外敷,即可藥到病除。

2014年3月3日 星期一

還原被限制無法存取的DB

ALTER DATABASE CNTMGM SET OFFLINE WITH ROLLBACK IMMEDIATE

RESTORE DATABASE CNTMGM FROM  DISK='D:\CNTMGM2014三月3.BAK' WITH RESTRICTED_USER,REPLACE

2014年2月9日 星期日

密碼都對了,可是就是登不進去!!?? 可能是變成非multiple囉

 

怎麼還原資料庫(Restore)後,資料庫的名稱旁多了一個「限制的使用者」呢?該怎麼更改設定?
不要以為這是惡作劇,這不是把資料庫的名稱多加了這一串字,沒那麼無聊





在資料庫的屬性的「選項」中,可以來修改資料庫的限制存取方式

下圖中可以看到總共有三種模式:「Multiple」、「Single」與「Restricted」

  • Single User Mode :同一時間只能任一個使用者登入使用
  • Restricted User Mode : 只有db_owner、dbcreator、sysadmin 群組的人可以登入
  • Multiple User Mode:有權限的都能依權限範圍使用
當然你也可以用 T-SQL 的方式來改變限制存取的方式

ALTER DATABASE [DB_Name] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [DB_Name] SET SINGLE_USER WITH NO_WAIT
或者
EXEC sp_dboption 'DB_Name', 'single user', 'false'
EXEC sp_dboption 'DB_Name', 'single user', 'true'
底下就改成了「單一使用者」了