我們在安裝好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月3日 星期三
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
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;
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);
}
資料庫的 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;
將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範圍才會正確
最近做一個小功能,要判斷傳入字串是否含有中文,再作後續的動作。這邊記錄判斷邏輯的寫法,程式的邏輯
為當傳入參數只要是字串中有任何一個中文字都會回傳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);
}
}
}
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 的勾勾去掉
因此編譯器"提醒"說會長時間沒有回應(因為要算很久)
按下"繼續"即可
或是想將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
《範例》
.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);
}
///字串轉全形
///</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
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月7日 星期二
2014年10月1日 星期三
賦予table使用者權限
grant select,insert,update,delete on paysys.payccs1 to paysys_role;
create synonym pay.payccs1 for paysys.payccs1;
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" );
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);
}
}
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
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#';
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真是蘊藏著無窮的奧妙啊!
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 還提供了另一種解決方案,讓網站管理員可以透過設定 HTTP Header 或 HTML META Tag 的方式,讓 IE8 自動選擇「相容性檢視」進行顯示網頁,如此一來你就不用害怕你的網站在 IE8 會亂掉的問題了。
第一種宣告方式:設定整個網站都以 IE7 相容模式顯示網頁 ( HTTP HEADER )
若以設定 IIS6 為例,你可以在 網際網路資訊服務 (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', ' ');
如此內服外敷,即可藥到病除。
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
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:有權限的都能依權限範圍使用
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'
底下就改成了「單一使用者」了
訂閱:
文章 (Atom)