搜尋此網誌

2011年7月30日 星期六

如何使用登錄檔(.reg)進行新增、修改或刪除登錄機碼和值

操作登錄項目(Registry)是我經常做的事情,所以也常累積不少登錄檔(*.reg)隨時可供設定或移除,不過一般人可能比較少這樣處理,在此我就分享幾個操作登錄項目的一些小技巧。

匯出登錄機碼
無論如何,在測試修改機碼之前最好還是先備份一下,以一整個 "機碼" 為單位匯出(左側的每個資料夾都叫做機碼或稱子機碼),匯出成 *.reg 檔後,日後若改錯或出問題時,點兩下即可修復機碼。



匯出後的格式像以下這樣,而我就是經常設定這種 *.reg 的檔案幫我更新、刪除一些系統常用機碼設定:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\SearchScopes]
"DefaultScope"="{05C72334-11F3-4e9f-8740-98128F52EFB9}"
"Version"=dword:00000001
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\SearchScopes\{xxxx-xxxx}]
"DisplayName"="Google"
"URL"=http://www.google.com/search?hl=zh-TW&esrch=BetaShortcuts&q={searchTerms}&lr=
新增或更新機碼值
我這陣子處理了許多開發環境的問題,其中幾天前講的 [ 安裝 Visual Studio .NET 2003 開發主機筆記 ] 就有提到如何解決 [HTTP - 401.1 未授權登入失敗] 的問題,這問題基本上只要新增一個機碼就能夠解決,而我就將這個「新增機碼」的動作儲存成 *.reg 檔,以後有其他電腦要設定環境時,直接 Double Click 就可以解決問題。
像這個問題需要在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 機碼中新增一筆 DisableLoopbackCheck 的 DWORD 值,假設檔名我取成 Set-DisableLoopbackCheck.reg 內容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
"DisableLoopbackCheck"=dword:00000001
備註:若「機碼」本身不存在,執行 *.reg 的時候會自動建立所有不認識的機碼,無須在特別另外建立。

刪除機碼值
如上一個範例,若要將 DisableLoopbackCheck 的 DWORD 值刪除,就可以用以下語法進行刪除:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
"DisableLoopbackCheck"=-
這裡的重點就是設定值的地方要設定成一個減號 ( - ),這就代表著「刪除」的意思。

刪除登錄機碼
跟身除機碼值不同,刪除機碼將會連同機碼、機碼值、與所有子機碼都一併刪除,算是個殺傷力相當大的語法,必須小心使用。
若你想將 Visual Studio 2008 最近開啟的專案(Recent Projects)全部清空的話,可以利用以下 reg 檔直接刪除機碼並重建機碼。
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\ProjectMRUList]
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\ProjectMRUList]相關連結

2011年7月27日 星期三

本機安全性紀錄檔已滿清除方法

[開始]->[控制台]->[系統管理工具]->[事件檢視器],用滑鼠在[應用程式]、[安全性]、[系統]三類日誌上,分別按下右鍵後出現選單,按[清除所有事件]即可。

2011年7月21日 星期四

2011年7月18日 星期一

壓縮 SQL Server Log 檔案 for SQL Server 2008

use 資料庫名稱

-- 備份資料庫,並壓縮log檔
/*
當資料庫使用簡單復原模式時,便會自動截斷交易記錄。
如果您必須從資料庫中移除記錄備份鏈結,請切換到簡單復原模式。
*/

--01 將資料庫 Northwind 切換為「簡單復原模式」,便會自動截斷交易記錄。
ALTER DATABASE 資料庫名稱 SET RECOVERY SIMPLE WITH NO_WAIT
GO

DBCC SHRINKFILE ('資料庫_Log', 2)
GO

--02 若決定要備份交易記錄檔(*.ldf),再將資料庫 Northwind 切換回「完整復原模式」
ALTER DATABASE 資料庫名稱 SET RECOVERY FULL WITH NO_WAIT
GO

壓縮 SQL Server Log 檔案 for SQL Server 2005 (含以前)

在資料庫使用一段時間後, 會發現Log.ldf資料變的非常龐大
比主資料庫*.mdf還大的情況, 這時候我們可以用下面的指令壓縮*.ldf(SQL Server Log)

語法如下
--(1)截斷交易記錄檔
BACKUP LOG [資料庫名稱] WITH TRUNCATE_ONLY
--(2)顯示資料庫檔案,找出交易記錄檔的邏輯檔名
EXEC sp_helpdb '資料庫名稱'    --SBODemoCN1012為資料庫名稱
--(3)壓縮交易記錄檔
USE 資料庫名稱
DBCC SHRINKFILE([資料庫_log],2)    --ldf檔的邏輯檔名,在(2)可以找出

2011年7月17日 星期日

關閉 Sql server sa 密碼

在 [物件總管] 中,展開 [安全性]、展開 [登入]、以滑鼠右鍵按一下 [sa],然後按一下 [屬性]。
在 [一般] 頁面上,將[強制執行密碼原則]取消

變更伺服器驗證模式


在安裝期間,SQL Server Database Engine 會設為 [Windows 驗證模式] 或 [SQL Server 及 Windows 驗證模式]。此主題描述如何在安裝之後變更安全性模式。


如果在安裝期間選取 [Windows 驗證模式],就會停用 sa 登入而且安裝程式會指派密碼。即使稍後將驗證模式改成 [SQL Server 及 Windows 驗證模式],sa 登入也會保持停用狀態。若要使用 sa 登入,請使用 ALTER LOGIN 陳述式來啟用 sa 登入並指派新的密碼。


安全性注意事項
sa 帳戶是已知的 SQL Server 帳戶,而且經常是惡意使用者的攻擊目標。除非您的應用程式需要,否則請勿啟用 sa 帳戶。請務必針對 sa 登入使用一個增強式密碼。
sa 登入只能使用 SQL Server 驗證連接到伺服器。


變更安全性驗證模式


在 SQL Server Management Studio 的 [物件總管] 中,以滑鼠右鍵按一下伺服器,然後按一下 [屬性]。
在 [安全性] 頁面上的 [伺服器驗證] 中,選取新的伺服器驗證模式,然後按一下 [確定]。
在 SQL Server Management Studio 對話方塊中,按一下 [確定] 以確認需要重新啟動 SQL Server。
在 SQL Server Management Studio 中重新啟動 SQL Server
在 [物件總管] 中,以滑鼠右鍵按一下伺服器,然後按一下 [重新啟動]。如果 SQL Server Agent 正在執行,也必須將它重新啟動。




使用 Transact-SQL 來啟用 sa 登入
執行下列陳述式,以啟用 sa 密碼並指派密碼。
ALTER LOGIN sa ENABLE ;
GO
ALTER LOGIN sa WITH PASSWORD = '<enterStrongPasswordHere>' ;
GO




使用 Management Studio 來啟用 sa 登入
在 [物件總管] 中,展開 [安全性]、展開 [登入]、以滑鼠右鍵按一下 [sa],然後按一下 [屬性]。
在 [一般] 頁面上,您可能需要為 sa 登入建立並確認密碼。
在 [狀態] 頁面的 [登入] 區段中按一下 [啟用],然後按一下 [確定]。

如何隱藏磁碟區

在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explore r下新增一DWORD值 名稱為NoDrives
值得設定如下
A=1 , B=2 , C=4 ,D=8 , E=16 , F=32 , G=64 , H=128 , I=256 , J=512 , K=1024 , L=2048 , M=4096 , N=8129 , O=16384, P=32768 , Q=65536 , R=131072 , S=262144 , T=524288 , U=1048576 , V=2097152 , W=4194304 , X=8388608 , Y=16777216 , Z=3554432 都是2的次方

如果要隱藏A,C碟 只要將NoDrives的值設成5即可 5=A+C=1 + 4
如果要隱藏A,C,E碟 只要將NoDrives的值設成21即可 21=A+C+E=1+ 4 + 16

2011年7月13日 星期三

防止儲存需要資料表重建的變更

[SQL] Microsoft SQL Server 2008 Management Studio  防止儲存需要資料表重建的變更
解決方法其實很簡單:工具->選項->左邊選單 Designers,裡面把防止儲存需要資料表重建的變更,取消掉,就可以了

2011年7月8日 星期五

C#常用函數和方法集匯總

1、DateTime 數字型

System.DateTime currentTime=new System.DateTime();
1.1 取當前年月日時分秒

currentTime=System.DateTime.Now;
1.2 取當前年

int 年=currentTime.Year;
1.3 取當前月

int 月=currentTime.Month;
1.4 取當前日

int 日=currentTime.Day;
1.5 取當前時

int 時=currentTime.Hour;
1.6 取當前分

int 分=currentTime.Minute;
1.7 取當前秒

int 秒=currentTime.Second;
1.8 取當前毫秒

int 毫秒=currentTime.Millisecond;
(變數可用中文)
1.9 取中文日期顯示——年月日時分

string strY=currentTime.ToString(”f”); //不顯示秒
1.10 取中文日期顯示_年月

string strYM=currentTime.ToString(”y”);
1.11 取中文日期顯示_月日

string strMD=currentTime.ToString(”m”);
1.12 取當前年月日,格式為:2003-9-23

string strYMD=currentTime.ToString(”d”);
1.13 取當前時分,格式為:14:24

string strT=currentTime.ToString(”t”);

2、字符型轉換 轉為32位數字型

Int32.Parse(變數) Int32.Parse(”常量”)

3、 變數.ToString()

字符型轉換 轉為字符串
12345.ToString(”n”); //生成 12,345.00
12345.ToString(”C”); //生成 ¥12,345.00
12345.ToString(”e”); //生成 1.234500e+004
12345.ToString(”f4〃); //生成 12345.0000
12345.ToString(”x”); //生成 3039 (16進制)
12345.ToString(”p”); //生成 1,234,500.00%

4、變數.Length 數字型

取字串長度:

如: string str=”中國”;

int Len = str.Length ; //Len是自定義變數, str是求測的字串的變數名

5、字碼轉換 轉為比特碼

System.Text.Encoding.Default.GetBytes(變數)

如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str);

然後可得到比特長度:

len = bytStr.Length;

6、System.Text.StringBuilder(”")

字符串相加,(+號是不是也一樣?)

如:

System.Text.StringBuilder sb = new System.Text.StringBuilder(”");
sb.Append(”中華”);
sb.Append(”人民”);
sb.Append(”共和國”);

7、變數.Substring(參數1,參數2);

截取字串的一部分,參數1為左起始位數,參數2為截取幾位。

如:string s1 = str.Substring(0,2);

8、取遠程用戶IP地址

String user_IP=Request.ServerVariables[”REMOTE_ADDR”].ToString();

9、穿過代理伺服器取遠程用戶真實IP地址:

if(Request.ServerVariables[”HTTP_VIA”]!=null){
string user_IP=Request.ServerVariables[”HTTP_X_FORWARDED_FOR”].ToString();
}else{
string user_IP=Request.ServerVariables[”REMOTE_ADDR”].ToString();
}

10、存取Session值

Session[”變數”];
如,賦值:

Session[”username”]=”小布希”;
取值:

Object objName=Session[”username”];
String strName=objName.ToString();
清空:

Session.RemoveAll();

11、用超鏈結傳送變數

String str=Request.QueryString[”變數”];
如在任一頁中建超鏈結:<a href=Edit.aspx?fbid=23>點擊</a>

在Edit.aspx頁中取值:String str=Request.QueryString[”fdid”];

12、創建XML文檔新節點

DOC對象.CreateElement(”新建節點名”);

13、將新建的子節點加到XML文檔父節點下

父節點.AppendChild(子節點);

14、 刪除節點

父節點.RemoveChild(節點);

15、向頁面輸出:Response

Response.Write(”字串”);
Response.Write(變數);
跳轉到URL指定的頁面:

Response.Redirect(”URL地址”);

16、查指定位置是否空字符

char.IsWhiteSpce(字串變數,位數)——邏輯型;
如:

string str=”中國 人民”;
Response.Write(char.IsWhiteSpace(str,2)); //結果為:True, 第一個字符是0位,2是第三個字符。

17、查字符是否是標點符號

char.IsPunctuation('’字符'’) –邏輯型
如:

Response.Write(char.IsPunctuation('’A'’)); //返回:False

18、把字符轉為數字,查代碼點,注意是單引號。

(int)'’字符'’

如:

Response.Write((int)'’中'’); //結果為中字的代碼:20013

19、把數字轉為字符,查代碼代表的字符:(char)代碼

如:

Response.Write((char)22269); //返回“國”字。

20、 清除字串前後空格: Trim()

21、字串替換

字串變數.Replace(”子字串”,”替換為”)

如:

string str=”中國”;
str=str.Replace(”國”,”央”); //將國字換為央字
Response.Write(str); //輸出結果為“中央”
再如:(這個非常實用)

string str=”這是<script>腳本”;
str=str.Replace(”<”,”<font><</font>”); //將左尖括弧替換為<font> 與 < 與 </font> (或換為<,但估計經XML存諸後,再提出仍會還原)
Response.Write(str); //顯示為:“這是<script>腳本”
如果不替換,<script>將不顯示,如果是一段腳本,將運行;而替換後,腳本將不運行。

這段代碼的價值在於:你可以讓一個文本中的所有HTML標簽失效,全部顯示出來,保護你的具有交互性的站點。

具體實現:將你的表單提交按鈕腳本加上下面代碼:

string strSubmit=label1.Text; //label1是你讓用戶提交數據的控件ID。
strSubmit=strSubmit.Replace(”<”,”<font><</font>”);
然後保存或輸出strSubmit。

用此方法還可以簡單實現UBB代碼。

22、取i與j中的最大值:Math.Max(i,j)

如 int x=Math.Max(5,10); // x將取值 10

加一點吧 23、字串對比……

23、字串對比一般都用: if(str1==str2){ } , 但還有別的方法:

(1)、

string str1; str2
//語法: str1.EndsWith(str2); __檢測字串str1是否以字串str2結尾,返回布爾值.如:
if(str1.EndsWith(str2)){ Response.Write(”字串str1是以”+str2+”結束的”); }
(2)、

//語法:str1.Equals(str2); __檢測字串str1是否與字串str2相等,返回布爾值,用法同上.
(3)、

//語法 Equals(str1,str2); __檢測字串str1是否與字串str2相等,返回布爾值,用法同上.

24、搜尋字串中指定字符或字串首次(最後一次)出現的位置,返回索引值:IndexOf() 、LastIndexOf(), 如:

str1.IndexOf(”字”); //搜尋“字”在str1中的索引值(位置)
str1.IndexOf(”字串”);//搜尋“字串”的第一個字符在str1中的索引值(位置)
str1.IndexOf(”字串”,3,2);//從str1第4個字符起,搜尋2個字符,搜尋“字串”的第一個字符在str1中的索引值(位置)

25、在字串中指定索引位插入指定字符:Insert() ,如:

str1.Insert(1,”字”);在str1的第二個字符處插入“字”,如果str1=”中國”,插入後為“中字國”;

26、在字串左(或右)加空格或指定char字符,使字串達到指定長度:PadLeft()、PadRight() ,如:

<%
string str1=”中國人”;
str1=str1.PadLeft(10,'’1′’); //無第二參數為加空格
Response.Write(str1); //結果為“1111111中國人” , 字串長為10
%>

27、從指定位置開始刪除指定數的字符:Remove()

28.反轉整個一維Array中元素的順序。

har[] charArray = “abcde”.ToCharArray();
Array.Reverse(charArray);
Console.WriteLine(new string(charArray));

29.判斷一個字符串中的第n個字符是否是大寫

string str=”abcEEDddd”;
Response.Write(Char.IsUpper(str,3));

ASP.Net 中 Alert、Confirm、Prompt 的用法

Asp.net中,有的時候在執行某個操作的時候希望能夠彈出一些信息框:alert彈出的警告信息框,confirm彈出的包含確認和取消兩個按鈕的信息框,以及prompt彈出的輸入對話框。
這裡有兩種方法來實現。
一種是採用javascript函數來實現,代碼將應用與.aspx文件的源代碼(html語言)中,在HTML控件中調用javascript函數來實現Alert、Confirm、Prompt。
另一種則是在web窗體的.aspx.cs文件中使用。 alert和prompt可以用Response.Write()來直接使用,Confirm則需要將其加入到Web服務器控件的屬性上。 下面我們就分別針對這兩種方法來舉幾個例子。
1、我們創建兩個HTML按鈕來分別調用javascript函數,一個按鈕用來彈出confirm信息框,另一個用來彈出prompt信息框,操作結果用alert彈出。
代碼:
<html>
<head>
    <title></title>
    <script language="ecmascript">
    <!--
        function delCheck()
        {
            var flag=window.confirm("確實要刪除嗎?");
            if(flag==true)
                alert("已經刪除!");
        }
        function dataCheck()
        {
            var data=window.prompt("輸入一個1-10之間的數","7");
            if(data!=null)
                alert("你輸入的是:"+data);
        } 
    //-->
    </script>
</head>
<body>
    <form id="form1">
    <input name="del" type="button" id="Button2" value="刪除記錄" onclick="delCheck()">
    <input name="in" type="button" id="in" value="輸入數據" onclick="dataCheck()">
    </form>
</body>
</html>

2、在ASP.NET的.aspx.cs文件中使用:
(1)Alert的使用:
代碼:
Response.Write("<script>alert('密碼不正確!')</script>");

(2)Confirm的使用:點擊Button3按鈕的是否,彈出confirm對話框,選擇"確定"的時候則開始執行相應的按鈕操作。
在page_load添加如下代碼:
代碼:
protected void Page_Load(object sender, EventArgs e)
{
      Button3.Attributes.Add("onclick ", "return confirm( '確認要修改嗎?');"); 
}
protected void Button3_Click(object sender, EventArgs e)
{
      //Button3的按鈕操作,可自行定義
      Response.Write("您選擇的是確定操作!");
}
(3)Prompt的使用:
代碼:
Response.Write("<script> var result=window.prompt('請輸入新文件名:)' , 'ABC'); if(result!=null) alert('你輸入的是'+result);</script>");

各種資料庫 SQL 連接字串

OleDbConnection conn = new OleDbConnection(connectString);
代碼:
<add key="SQLConnString" value="Provider=SQLOLEDB;Data Source=192.168.100.20;Initial Catalog=BCH_Gamania_TW;User Id=sa;Password=;Connection Timeout=10"/>
string connectString = WebConfigurationManager.AppSettings["SQLConnString"].ToString().Trim();
SqlConnection conn = new SqlConnection(connectString);

代碼:
<add key="ConncetionString" value="Data Source=192.168.100.20;Initial Catalog=BCH_Gamania_TW;Persist Security Info=True;User ID=sa;Password=; Connection Timeout=10" />
string connectString = WebConfigurationManager.AppSettings["ConncetionString"].ToString().Trim();
SqlCeConnection sqlCeConn = new SqlCeConnection(sqlCeStr);


代碼:
static string gstrPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
static string sqlCeStr = "Data Source='" + gstrPath + "\\PDA_Gamania_TW.sdf'; Password='13126930'; Encrypt = TRUE;";

當連接資料庫需要加上埠號時 , 只需在IP後加上 ' , ' 埠號 .
代碼:
value="Data Source=192.168.100.20,1433

使用 SqlCommand.Parameters 屬性防止駭客 SQL Injection (資料隱碼)攻擊

1. 何謂"SQL Injection (資料隱碼)攻擊": 本文不廢話這邊,網路Google會有一堆,不然就看看這篇 http://www.microsoft.com/taiwan/sql/sql_injection_g1.htm

2. 如何避免使用 SqlCommand.Parameters

代碼:
//建立 SqlConnection 物件
string ConnString = "Provider=SQLOLEDB;Data Source=192.168.xxx.xxx;Initial Catalog=xxxx;User Id=xx;Password=xxxxxx;";
SqlConnection SQLConn = new SqlConnection(ConnString);


//建立 SqlCommand 物件
SqlCommand SQLComm = new SqlCommand();
SQLComm.Connection = SQLConn;


//給予 SqlCommand 物件 SQL 指令
SQLComm.CommandText = "Select * From UserTable Where UserID = @ID And UserPassword = @Password";


//第一種寫法,給予 SqlCommand 物件 SQL 指令內的參數
SQLComm.Parameters.Add("@ID", SqlDbType.Int);
SQLComm.Parameters["@ID"].Value = this.txtUserID.Text.Trim();


//第二種寫法,給予 SqlCommand 物件 SQL 指令內的參數
SQLComm.Parameters.AddWithValue("@Password", this.txtUserPassword.Text.Trim());


//取回資料內容
SQLConn.Open();
DataTable dt = new DataTable();
dt.Load(SQLComm.ExecuteReader());

模擬關閉事件給 FrmMain_FormClosing 方法

代碼:
FormClosingEventArgs e1 = new FormClosingEventArgs(CloseReason.UserClosing, false);
FrmMain_FormClosing(this, e1);

新增 Checkbox 欄位給 DataGridView 使用

其實 DataGridView 本身就有提供多選的功能,只是他選取的方式比較特別,長得像這樣


如果要關閉 DataGridView 中預設多選的功能,在屬性 "MultiSelect" 設定為 False 即可
但是今天要分享的是另一種,長得像這樣的多選


Sample Code 提供給大家,自行理解囉
代碼:
//取得DataTable資料來源
DBCommand.CommandText = "Select * From VIEW_ASTAF";
dt = CommonVariable.DBC.DBReader(DBConn, DBCommand);


//將資料與DataGrid關連
this.dgv1.DataSource = dt;


//建立一個DataGridView的Column物件及其內容
DataGridViewColumn dgvc = new DataGridViewCheckBoxColumn();
dgvc.Width = 40;
dgvc.Name = "選取";


//新增到DataGridView內的第0欄
this.dgv1.Columns.Insert(0, dgvc);


至於取得值的方式,可以參考如下
代碼:
foreach (DataGridViewRow dr in this.dgv1.Rows)
{
    if (dr.Cells[0].Value != null && (bool)dr.Cells[0].Value)
    {
        MessageBox.Show("財編號碼 " + ((System.Data.DataRowView)(dr.DataBoundItem)).Row.ItemArray[1] + " 被選取了!");
    }
}

將二個DataTable合併

一般在使用資料庫關聯或資料庫合併時,可能會將某個Table1資料先拉到DataSet1,在把某個Table2資料拉到DataSet2,在用迴圈一筆一筆的加進去。
不然就是直接在資料庫就把資料交給StoreProcedure處理。
但是現在如果是在PDA上作這動作,可能會考慮到效能,或是SQL CE沒有StoreProcedure可以使用。
這理提供一個方法,就是DataTable.Merge 有三種多載

1.DataTable.Merge (DataTable) 
將指定的 DataTable 與目前的 DataTable 合併。
合併的DataTable結構需一致。
2.DataTable.Merge (DataTable, Boolean) 
合併指定的 DataTable 與目前的 DataTable,指出是否保留目前 DataTable 中的變更。
合併的DataTable結構需一致。相同的DataRows是否要保留。
3.DataTable.Merge (DataTable, Boolean, MissingSchemaAction) 
合併指定的 DataTable 與目前的 DataTable,指出是否保留變更,以及如何處理目前在 DataTable 中缺少的結構描述。 
合併的DataTable結構無需一致,但是合併時,需告知沒有的欄位是否要加入現有欄位中(只加欄位內容為NULL)。

代碼: 
DataTable dtAA = new DataTable();
DataTable dtAB = new DataTable();

string trsql = "";
trsql = "Select AB001, AB002, AB003 , AB004 , AB005 , AB007, AB005, AB006, AB007 From BCH_INVAB ";
trsql += " Where AB001 = '" + exno + "'";
dtAB = SELECTSQLCE(trsql);
DataColumn [] key = new DataColumn[1];
key[0] = dtAB.Columns["AB003"];
dtAB.PrimaryKey = key;

trsql = "";
trsql = "Select AA001 AS AB003, AA002, AA003 + AA004 + 
(Case AA005 When '' Then '' Else '-' + AA005 + 'U' End) AS AA003_1 , AA006, ";
trsql += " AA003,AA004,AA005,AA007, AA008, AA009, AA010, AA011, AA012, AA013, AA014, 
AA015, AA016, AA017, AA018, AA019, AA020 ";
trsql += "From BCH_ASTAA Where AA001 In (Select AB003 From BCH_INVAB Where AB001 = '" + exno + "')";
dtAA = SELECTSQLCE(trsql);
DataColumn[] key1 = new DataColumn[1];
key1[0] = dtAA.Columns["AB003"];
dtAA.PrimaryKey = key1;

dtAA.Merge(dtAB,false,MissingSchemaAction.Add);


上面的程式碼中,可以看出二個Table結構完全不同,一個是AA一個是AB,但是AA001==AB003有關聯,因此就可利用這二個欄位來當作Key值來合併。

C#處理目錄與檔案名稱

string strPath = @"D:\Downloads\test.jpg"; 

Path.GetFullPath(strPath); //取得完整路徑: "D:\Downloads\test.jpg" 

Path.GetPathRoot(strPath); //取得根目錄: "D:\" 

Path.GetDirectoryName(strPath); //取得目錄名: "D:\Downloads" 

Path.GetFileName(strPath); //取得檔名: "test.jpg" 

Path.GetFileNameWithoutExtension(strPath); //取得檔名(不含副檔名): "test" 

Path.GetExtension(strPath); //取得副檔名: ".jpg" 

Path.ChangeExtension(strPath, "txt"); //變更副檔名: "D:\Downloads\test.txt" 

Path.Combine(strPath, @"path1\path2"); //結合路徑: "D:\Downloads\test.jpg\path1\path2" 

Path.GetTempPath(); //取得系統暫存資料夾: "C:\Users\Sam\AppData\Local\Temp\" 

Path.GetTempFileName(); //建立並取得唯一的暫存檔完整路徑 

Path.GetRandomFileName(); //隨機傳回一個資料夾或檔案名稱 

char a = Path.DirectorySeparatorChar; //目錄分隔字元: "\"

char b = Path.VolumeSeparatorChar; //磁碟分隔字元: ":" 

char c = Path.PathSeparator; //路徑分隔字元: ";" 

char[] d = Path.GetInvalidPathChars(); //取得系統不合法的目錄字元 

char[] e = Path.GetInvalidFileNameChars(); //取得系統不合法的檔案字元
 
補充如何取得應用程式所在路徑

代碼: 
MessageBox.Show(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase));

c# 字串格式化與轉型

C#格式化數值結果表

12345.ToString("n"); = 12,345.00 
12345.ToString("C"); = ¥12,345.00 
12345.ToString("e"); = 1.234500e+004 
12345.ToString("f4"); = 12345.0000 
12345.ToString("x"); = 3039 (16進制) 
12345.ToString("p"); = 1,234,500.00%






C# 使ComboBox與DataTable綁訂的值去除重複

假設今天需求是醬
代碼: 
this.cbo_control.DataSource = dt;

而dt的內容長得這樣


我打算做
代碼: 
this.cbo_control.DisplayMember = "入庫單別";
this.cbo_control.ValueMember = "入庫單別";

這時候我必須先將重複的資料移除,可以這樣寫
代碼: 
this.cbo_control.DataSource = GetDataTableDistinct(dt, new string[1] { "入庫單別" });

public DataTable GetDataTableDistinct(DataTable objdatatable, string[] columnsname)
{
   DataView dv = new DataView(objdatatable);
   DataTable objDataTable = dv.ToTable(true, columnsname);
   return objDataTable;
}

即可將資料變成像


DataGridView排序後,如何抓取綁定資料的正確索引值

在寫Windows From程式時,發現DataGridView在與DataTable透過BindingSource綁定,在DataGridView進行資料的排序後,DataGridView中的資料Index將會與DataTable的Index不一致。
當選定的資料在進行修改後,因Index的不一致,導致在回存資料庫的時候無法斷定該回存哪一筆Row Data,這讓我很苦惱,一度想把DataGridView的排序給關閉,不讓使用者操作。
不過想想,這也不是根本的解決之道,況且在我的程式中,這DataGridView的排序是必要的,不然會造成使用者操作的不方便....
最後終於讓我找到解決方法,方式如下:

代碼:
this.datagridview1.DataSource = dt;
DataRowView drv = this.datagridview1.Rows[this.datagridview1.CurrentRow.Index].DataBoundItem as DataRowView;
int index = dt.Rows.IndexOf(drv.Row);
string s = dt.Rows[index][0].ToString().Trim();


說明如下:
先利用 datagridview1.Rows 找到目前選擇的資料行,然後轉換成DataRowView
在DataRowView中有一個屬性叫做Row,其代表DataTable中的DataRow
最後再利用DataTable.rows.IndexOf()方法回傳當前的Index。

C# 鍵盤 KeyChar 值的取得

代碼:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
     char Key_Char = e.KeyChar;//判斷按鍵的 Keychar
     MessageBox.Show(((int)(Key_Char)).ToString());//轉成整數顯示
}

Result:
Key Char
1 2 3 4 5 6 7 8 9 0 Enter a
49 50 51 52 53 54 55 56 57 58 13 97
 
Sample Code

代碼:
if (e.KeyChar == Convert.ToChar(13))
{
      //Do Something;
}

替 Web站台設定 Cookie 的 TimeOut 時間長度

找到 <system.web> 標籤後,加入 <sessionState mode="InProc" cookieless="true" timeout="500"/>,For Example

代碼:
<system.web>
       <sessionState mode="InProc" cookieless="true" timeout="500"/>
</system.web>

單位是"分鐘",timeout="500" 表示 500分鐘

實現10轉36進制範例

實現10轉36進制範例

/// <summary>
/// 10進制轉36進制
/// </summary>
/// <param name="i">10進制值</param>
/// <returns>36進制值</returns>
public static string ConvertTo36(int i)
{
    string s = "";
    int j = 0;
    while (i >= 36)
    {
        j = i % 36;
        if (j < 10)
            s += j.ToString();
        else
            s += Convert.ToChar(j + 87);
        i = i / 36;
    }
    if (i < 10)
        s += i.ToString();
    else
        s += Convert.ToChar(i + 87);
    Char[] c = s.ToCharArray();
    Array.Reverse(c);
    return Convert.ToString(new string(c)).ToUpper();          
}

其他更簡單的進制轉換
//十進制轉二進制
Console.WriteLine(Convert.ToString(69, 2));

//十進制轉八進制
Console.WriteLine(Convert.ToString(69, 8));

//十進制轉十六進制
Console.WriteLine(Convert.ToString(69, 16));

//二進制轉十進制
Console.WriteLine(Convert.ToInt32(”100111101〃, 2));

//八進制轉十進制
Console.WriteLine(Convert.ToInt32(”76〃, 8));

//C# 16進制轉10進制
Console.WriteLine(Convert.ToInt32(”FF”, 16));

2011年7月7日 星期四

先給解答,再談原理,以下的方法是用來得知是按了哪個按鈕觸發 page_load 事件

先給解答,再談原理,以下的方法是用來得知是按了哪個按鈕觸發 page_load 事件
private  string  getPostBackControlName()    
{    
        Control control= null ;    
        string  ctrlname = Page.Request.Params[ "__EVENTTARGET" ];    
        if  (ctrlname != null  && ctrlname != String.Empty)    
        {    
            control = Page.FindControl(ctrlname);    
        }    
        else   
        {    
            Control c;    
            foreach  ( string  ctl in  Page.Request.Form)    
            {    
                if  (ctl.EndsWith( ".x" ) || ctl.EndsWith( ".y" ))    
                {    
                    c = Page.FindControl(ctl.Substring(0, ctl.Length - 2));    
                }    
                else   
                {    
                    c = Page.FindControl(ctl);    
                }    
                if  (c is  System.Web.UI.WebControls.Button ||    
                         c is  System.Web.UI.WebControls.ImageButton)    
                {    
                    control = c;    
                    break ;    
                }    
            }    
        }    
        if  (control != null )    
            return  control.ID;    
        else   
            return  string .Empty;    
}   
因此要取得來源只需要如下呼叫即可
//沒有元件呼叫(如第一次載入回傳為空白),其他則回傳元件名
string button_name = getPostBackControlName();


SQL SERVER 修改密碼指令

sp_password @old = '' , @new = '1111' ,@loginame = 'sa'
@old = '' <-- 舊密碼
@new = '1111' <-- 新密碼
@loginame = 'sa' <-- 登入名稱

2011年7月6日 星期三

列出資料庫中所有表格內容

sp_tables @table_owner = 'dbo', @table_type = 'TABLE'

查詢資料庫的現有使用者,以及刪除現有使用者

有時候資料庫要還原或是卸載時,常常會出現資料庫正被鎖定或獨佔性使用的現象,而無法順利正常還原或是卸載





往往變成使用先停止資料庫, 而複製整個資料庫, 但是卻仍然不能解決要還原資料庫的問題
此時可以kill指令刪除使用者, 不過必須先知道有哪些使用者
假設今天我要刪除資料庫"BCH_Gamania_TW"的使用者,我可以先下

sp_who

查詢現有使用者












如上圖的spid=52的使用者,就是現在定或獨佔性使用的使用者
接下來可以下
kill 52

斷開該使用者,就能順利進行還原或是卸載工作

2011年7月5日 星期二

變更「我的最愛」資料夾預設路徑

一般人都習慣用瀏覽器的「我的最愛「功能來整理自己喜愛的網站,隨著上網的資歷越來越長,「我的最愛」的重要性也就越吃重,但系統預設的路徑為「C:\Documents and Settings\使用者帳號\Favorites」,一旦中毒、重灌電腦忘了備份導致「我的最愛」不見了,那麼多年的心血,也付之一炬,所以快動手變更「我的最愛」資料夾預設路徑吧 !這樣就可不必再備份「我的最愛」了,重灌時也不用擔心。

STEP1:首先到「開始」/「執行」的地方,輸入「regedit」,按下確定後,就會進入「登錄編輯程式」。

STEP2:開啟「登錄編輯程式」視窗,在左邊窗格找到「HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders」機碼,並在該機碼上按一下滑鼠左鍵。
 

STEP3:在右邊窗格找到「Favorites」這個項目,然後在該名稱上按一下滑鼠右鍵,從選單中點選「修改」。

STEP4:「編輯字串」對話盒出現後,在「數值資料」方框中設定想要放置「我的最愛」的資料夾路徑,如「D:\ Favorites」,設定好之後再按下「確定」即可。

NOTE:注意最好先建立好資料夾,再作登錄檔的修改,不然系統可能無法儲存到所指定的資料夾中。還原方法可在STEP4將原資料夾路徑改回來,之後重新登入或開機即可。

2011年7月3日 星期日

讓TextBox限制只能輸入數字

只能輸入數字:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar)))
            {
                e.Handled = true;
            }
        }


限制不能輸入英文字母(可輸入符號~空白鍵...):
  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsLetter(e.KeyChar) == true)
            {
                e.Handled = true;
            }
        }



Html表單中Post 和 Get的差別

表單中 method 是用以規範 form 被送出時,所採用的參數傳遞途徑,預設值不寫,採用GET。
POST: 是將資料包裝在 HTTP 標頭內傳送給目的頁(封包還是沒有加密,所以對於封包被攔截後還是可以取得所傳的資料)
GET:  是將資料直接加在 URL 之後,例如 default.asp?id=123&amp;pw=456 

使用 GET 能傳遞的資料有限(連同 URL 共 255 字元,另有一說是2KB),在需要上傳大量資料或檔案時,請使用 POST method。

不過,由於 GET method 係將資料直接加在 URL 之後,所以對瀏覽器而言,它將被視為 URL 的一部份,也能被 cache 在使用者端的電腦中,不至於在畫面上看到「警告:網頁已經過期......」的字句。

使用GET時,asp會把畫面上所有的元件value值都丟出來

ASP 輸出變數內容,用input物件

用 value="&lt;%= Content %&gt;"
&lt;%
  If Session("wf_LogonID") = "2580" Then
   Content = Session("wf_LogonID")
  Else
   Content = "0"
  End If
%&gt;
&lt;input name="APP_money" type="text" id="APP_money"  value="&lt;%= Content %&gt;" size="20"&gt;


直接顯示:
<%
If Session("wf_LogonID") = "2580" Then
Content = Session("wf_LogonID")
Else
Content = "0"
End If
%>
<%= Content %>

注意:程式要寫在前面

ASP錯誤的幾種處理方式

ASP是非常簡單的,以至於許多的開發者不會去思考錯誤處理,正確處理錯誤能夠讓你的應用程序更加合理。我看到過很多用ASP編寫的商業網站,大多數都忽略了錯誤處理。

三種主要的錯誤類型:

一、編譯錯誤(語法錯誤)

這種錯誤的出現一般都是代碼存在語法問題,因為編譯錯誤而導致辭ASP停止運行。

二、運行錯

這種錯誤是你在準備運行ASP時所發生的。例如:如果你試圖給一個變量賦值,但是卻超出了該變量允許的範圍。

三、邏輯錯

邏輯錯誤是最難被發現的,這種錯誤經常是一種結構錯誤,電腦是發現不了的。這就需要我們徹頭徹尾地檢查我們的代碼。因為編譯錯誤一般是和邏輯錯誤一起發生的,一般都能顯示出來,所以我們擔心的就只是運行錯誤。它能終止ASP的運行,而且還會給用戶丟下一堆很不友好的文字。

那麼我們要怎樣處理運行錯誤呢?我們先來看看,ASP唯一提供給我們的錯誤命令---On Error Resume Next(這裡提醒一下初學者,在ASP中只有On Error Resume Next語句,沒有On Error Resume Goto語句)如果你不使用On Error Resume Next語句的話,一切運行錯誤都會發生,這個是致命的,那麼就會有一段錯誤代碼「展現」給用戶,而且ASP程序也會停止。

下面就是一個錯誤代碼:

代碼

Microsoft OLE DB Provider for ODBC Drivers error 80004005

ASP網頁的include

雖然我不寫ASP類型的網頁,但公司伺服器卻使用微軟的系統來搭建並採用ASP作為伺服器互動的機制。正因為如此,我莫名其怪的學會了「Include(將外部程式包進來)」方法;當然,前提是你得有ASP伺服器才行。

之所以會有include方法,就是因為我們常會發現部份網頁的特定區域或程式是一模一樣的;如果客戶要求我們修改這些特定區域的時候,我們可能得一頁頁的修改這些一模一樣的網頁原始碼,會很費時費力!ASP的include則提供了另一個聰明的方法,就是把這些一樣的網頁原始碼的「片段」存放到另外一個不同的小檔案中(類似載入外部CSS檔);之後我們只要修改這個外部的小檔案,ASP伺服器就會自動更新修改過的檔案的程式片段。當網頁很多的時候,這方法就會變成一個很有力的方法!

Include的方式其實不難!只要將網頁原始碼的程式片段「剪下」再「貼」到一個新的文字檔裡(ex: sample.txt),並將文字檔的副檔名由原來的txt更改為inc,變成.inc的include檔(ex: sample.inc)。此時,在原來被剪下的程式片段位置改為底下的程式碼,ASP伺服器就會知道這是include,於是ASP伺服器會將這個外部的程式片段自動載入,然後才顯示組合後真正完整的網頁原始碼:

&lt;!-- #include file="sample.inc" --&gt;

換言之,ASP伺服器只要看到上面的程式碼,就會自動載入程式碼所指定的檔案(ex: sample.inc),並完全的取代掉上面的程式碼。

值得注意的是,這個include檔的路徑不能是「絕對路徑(absolute URL)」,只能是「相對路徑(relative URL)」,否則會沒有作用。

另外一點就是,當你的程式使用了太多的include之後,你會發現…這網頁很容易變成只能用ASP伺服器修改,因為太多的include檔早已讓你看不清網頁原來的樣子!所以include還是要謹慎使用呀!

Visual Studio 2005 常用的快速鍵

這裡整理一些常用的快速鍵(使用預設的 keyboard mapping scheme):
1. 上一頁和下一頁
編輯程式時,也可以像使用瀏覽器一樣回到上一頁或下一頁,Visual Studio 會記錄你編輯程式的過程,當你按下 [Ctrl+減號 ] 時,就會回到上一個編輯的位置,按 [Ctrl+Shift+減號 ] 則是到下一頁。

2. 搜尋和取代文字
尋找文字:Ctrl+F  (在目前編輯的檔案中尋找)
從多個檔案中尋找文字:Ctrl+Shift+F
找下一個:F3
找上一個:Shift+F3
漸進式搜尋: Ctrl+I
取代文字:Ctrl+H
取代多個檔案中的文字:Ctrl+Shift+H

3. 書籤
設定書籤:Ctrl+K+K
移到下一個書籤:Ctrl+K+N
移到上一個書籤:Ctrl+K+P
在切換書籤時是可以跨檔案的。

4. 文字編輯
格式化目前編輯的檔案:Ctrl+K, Ctrl+D
格式化選取的文字:Ctrl+K, Ctrl+F
剪下整列文字:Ctrl+L
刪除整列文字:Ctrl+Shift+L
從剪貼環貼上:Ctrl+Shift+V (一直按,直到出現你想要的文字)
刪除游標右邊的一個單字 (word):Ctrl+Delete
刪除游標左邊的一個單字 (word):Ctrl+Shift+Delete
在目前游標所在位置的上方插入一列:Ctrl+Enter (游標會停在新列上)
在目前游標所在位置的下方插入一列:Ctrl+Shift+Enter (游標會停在新列上)
p.s. 以上兩個快速鍵跟按 Enter 鍵插入一列的效果有些微差異。
列出物件的所有成員:Ctrl+J
自動完成:Alt+右方向鍵    或者   Ctrl+Space
區塊選取文字:Alt+滑鼠左鍵拖曳
文字自動折行顯示:Ctrl+R+R (不會真的修改檔案,只是顯示時折行,再按一次就取消此功能)

5. 方案與專案相關操作
建置方案:Ctrl+Shift+B
取消建置:Ctrl+Break
加入新的檔案:Ctrl+N (或者 Ctrl+Shift+A)
加入既有檔案:Shift+Alt+A
建新專案:Ctrl+Shift+N
開啟檔案:Ctrl+O
開啟專案:Ctrl+Shift+O

6. 巨集
錄製/停止錄製巨集:Ctrl+Shift+R
播放巨集:Ctrl+Shift+P
開啟巨集總管視窗:Alt+F8
開啟巨集編輯器:Alt+F11

7. 執行與除錯
以除錯模式執行應用程式:F5
以非除錯模式執行應用程式:Ctrl+F5
重新啟動應用程式:Ctrl+Shift+F5
設定/取消中斷點:F9
啟用/禁用中斷點:Ctrl+F9
顯示中斷點視窗:Ctrl+Alt+B
刪除所有中斷點:Ctrl+Shift+F9
執行到游標所在列:Ctrl+F10
Step Over:F10
Step Into:F11
Step Out:Shift+F11
顯示呼叫堆疊:Ctrl+Alt+C
==================================================================
查詢其他快速鍵:
在瀏覽器中貼上網址:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vssettings/html/877cf652-537d-4d5f-a7d1-3454228b77c4.htm
或者在 MSDN online help 的 Index 頁夾中搜尋 "General Development Settings",再點選其中的 "Default Shortcut Keys"。

SQL SERVER 修改密碼指令

sp_password @old = '' , @new = '1111' ,@loginame = 'sa'

@old = '' &lt;-- 舊密碼
@new = '1111' &lt;-- 新密碼
@loginame = 'sa' &lt;-- 登入名稱

移除倉頡輸入法

不知道妳是否有這個經驗,常常安裝某種輸入法後,之後怎麼樣也無法移除。(倉頡輸入法、櫻花輸入法)
就算你沒灌什麼額外輸入法,只要你有灌Office,在進行Windows更新之後,倉頡輸入法就會跑出來....
而討厭的是,每次要輸入中文,只要按ctrl+空白,他們都會比新注音還先跑出來,你非得要在一次ctrl+shift切換他才甘願消失。
更討厭的是,他們移除不掉,無論你從鍵盤 輸入法那邊找,怎麼樣都移除不掉。如果是櫻花輸入法等,甚至可能還會出現錯誤訊息。
現在知道一個方法了,提供給有相同煩惱的朋友做參考:

進入 桌面左下角開始 → 執行 → regedit
找出 [HKEY_CURRENT_USER\Keyboard Layout\Preload]
右半邊出現的機碼內,右鍵刪除 「e0090404」這個值 (這是倉頡輸入法)
然後重新開機.....(理論上只留00000404英打和E0080404新注音 )
該死的不需要用的輸入法終於移除了

附贈常見機碼:
e0010404 注音
e0020404 倉頡
e0030404 速成
e0060404 大易
e0080404 新注音
e0090404 新倉頡
e0200404 自然
e0810404 嘸蝦米

另外若想改變輸入法的順序,可改:
HKEY_CURRENT_USER\Keyboard Layout\Preload
"1" -&gt; 預設輸入法
"2" -&gt; Ctrl+空的鍵時的輸入法..

關於java script的變數生命週期

預設:全域
&lt;script language="javascript"&gt;
v1 = 1
function f1()
{
    v1 = 2
    v2 = 1 + v1
    document.write(v1)
}
&lt;/script&gt;
以上執行結果是:3
若改成
&lt;script language="javascript"&gt;
v1 = 1
function f1()
{
    var v1 = 2
    v2 = 1 + v1
    document.write(v1)
}
&lt;/script&gt;
以上執行結果是:3
雖然結果都是一樣,但是第二個範例的v1二個內容值是不一樣的

java script 脫逸字元

\?&nbsp;&nbsp;-&gt;&nbsp; ?
\"&nbsp;&nbsp;-&gt;&nbsp; "
\'&nbsp;&nbsp;-&gt;&nbsp; '
\\&nbsp;&nbsp;-&gt;&nbsp; \
\a&nbsp;&nbsp;-&gt;&nbsp;響音
\b&nbsp;&nbsp;-&gt;&nbsp;退位
\f&nbsp;&nbsp;-&gt;&nbsp; 換頁
\n&nbsp;&nbsp;-&gt;&nbsp; 換行
\r&nbsp;&nbsp;-&gt;&nbsp; home
\t&nbsp;&nbsp;-&gt;&nbsp; tab
\v&nbsp;&nbsp;-&gt;&nbsp;垂直定位
\0 &nbsp;-&gt;&nbsp;空白

在 Windows 7 Professional、Enterprise 或 Ultimate 上安裝 IIS 7.5 及設定 iis站台

寫在前面:

1. 適用於: Windows Server 2008
2. 您必須是 Administrators 群組的成員,才能安裝 IIS 7.5。
3. 安裝過程中,您可能需要當初安裝系統時的光碟繼續進行。

一、 安裝 iis 7.5
1. 根據預設,IIS 7.5 不會安裝在 WindowsR 7 Professional、Enterprise 或 WindowsR 7 Ultimate 上。 您可以在 [控制台] 的 [程式集] 底下,按一下 [進階選項] 中的 [開啟或關閉 Windows 功能],來安裝 IIS。
2. 在 [開啟或關閉 Windows 功能] 對話方塊中,勾選 [Internet Information Services],進入下一層,將「web管理工具」全部打勾,以及「world wide web服務」下的「應用程式開發功能」全部打勾,最後按 [確定]完成安裝。
3. 輸入"http://localhost/",檢視是否完成安裝。

二、設定iis 7.5
1. 開啟iis控制台(控制台-&gt;系統及安全性-&gt;系統管理工具-&gt;iis管理員(非6.0那個))
2. 在iis區塊中,於asp點右鍵開啟功能,將「啟用上層路徑」設為true
3. 在iis區塊中,於asp點右鍵開啟功能,將偵錯內容下之「將錯誤傳送到瀏覽器、啟用用戶端偵錯」設為true
4. 在iis區塊中,於isapi及cgi限制點右鍵開啟功能,確認asp.net允許執行

三、設定網站安全性
1. (asp用)將 C:\Windows\ServiceProfiles\NetworkService\AppData\Local 的 Temp 目錄新增安全性使用者"Authenticated Users"為完全控制。
2. (asp.net 用)針對個別站台的目錄新增安全性使用者"Authenticated Users"為完全控制。

四、建立網站(使用應用程式)