DECLARE @str varchar(20)
SET @str = 'A,B,C,D,E,'
SELECT @str
--將字串反轉
SET @str = REVERSE(@str)
SELECT @str
--去除逗號
SET @str = CASE WHEN CHARINDEX(',', @str) = 1 THEN STUFF(@str, 1, 1, '') ELSE @str END
SELECT @str
--將字串反轉
SET @str = REVERSE(@str)
SELECT @str
那上面的語法與一般我們利用SUBSTRING(@str, 1, LEN(@str) - 1)有什麼不同?我們利用上面的語法時我們可以不用考慮字串變數的值(如NULL)及長度,改用SUBSTRING(@str, 1, LEN(@str) - 1)時要注意字串變數的長度另外還是要判斷最後一碼是否為逗號。如果讓筆者選擇利用T-SQL或程式來去除最後一個逗號,筆者會傾向程式。
2010年6月21日 星期一
2009年12月14日 星期一
保存DataTable
在window form的程式中,DataSet或DataTable的存續在window form程式設計師眼裡視之理所當然,但是在web form就不是這般,因為web的本質在使用者發出要求(Request),web server依據要求處理後再回應(Response)給使用者,二者之間的關係在工作結束後就中斷了,這些 In memory物件(DataSet、DataTable)就會消失,如果要保留DataSet、DataTable可以利用Session或ViewState來保留,下面介紹利用ViewState使DataTable得以存續
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
if (ViewState["_dt"] != null)
{
dt = (DataTable)ViewState["_dt"];
}
}
protected override object SaveViewState()
{
ViewState["_dt"] = dt;
return base.SaveViewState();
}
上面的程式片段將利用DataTable存入ViewState及ViewState明確轉型為DataTable,令DataTable得以存續,不過在使用時至少要考慮一些問題
1)系統頻寛
2)系統Loading
因為是存在ViewState所以對於使用者與Server往來的流量就會增加,另外使用者的瀏覽器在解析時也會較慢,還有在ViewState轉型成DataTable也會耗用資源,以上都是在使用時要考量的。
2009年12月10日 星期四
ADO.NET-DataRowState說明
每一個DataRow物件的狀態可能為以下五種其中一種
1)Added
2)Deleted
3)Detached
4)Modified
5)Unchanged
其中Added、Deleted、Modified會對資料來源產生異動。
Added: 對應SqlDataAdapter的InsertCommand
Deleted: 對應SqlDataAdapter的DeleteCommand
Modified: 對應SqlDataAdapter的UpdateCommand
Added狀態 是DataRow加入至DataTable,尚未呼叫AcceptChanges
Deleted狀態 是DataRow利用Delete方法刪除資料列
Modified狀態 是DataRow修改,尚未呼叫AcceptChanges
當SqlDataAdapter物件呼叫Update方法時就是利用DataTable中每一筆DataRow的狀態去對應適合的Command物件
ADO.NET-SqlDataAdapter簡介(1)
在ADO.NET中,SqlDataAdapter所扮演的角色,其實是SQL Server(資料來源)與In memory資料庫(DataSet)的橋樑,SqlDataAdapter有四個屬性分別對應查詢、新增、修改、刪除的SqlCommand物件
1) SelectCommand屬性,功用為自資料來源擷取資料至DataSet裡的資料表
2) InsertCommand屬性,回寫資料來源前需設定
3) UpdateCommand屬性,回寫資料來源前需設定
4) DeleteCommand屬性,回寫資料來源前需設定
範例如下
*因篇幅關係,大部份程式碼略過
//SelectCommand結果填入DataTable
1) SelectCommand屬性,功用為自資料來源擷取資料至DataSet裡的資料表
2) InsertCommand屬性,回寫資料來源前需設定
3) UpdateCommand屬性,回寫資料來源前需設定
4) DeleteCommand屬性,回寫資料來源前需設定
範例如下
*因篇幅關係,大部份程式碼略過
//SelectCommand結果填入DataTable
//cmd做為SelectCommand屬性
//dt為DataTable
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
//回寫資料來源
//insCmd為一個以新增資料的SqlCommand物件
//updateCmd為一個以修改資料的SqlCommand物件
//delCmd為一個以刪除資料的SqlCommand物件
da.InsertCommand = insCmd;
da.UpdateCommand = updateCmd;
da.DeleteCommand = delCmd;
da.Update(dt);
在SqlDataAdapter物件做回寫至資料來源時,會引用DataTable物件,並依據每一筆資料列的DataRowState去對應到適合的SqlDataAdapter Command屬性
2009年7月14日 星期二
T-SQL切割字串另類方法
在SQL Server中並沒有提供類似Split的函數,所以在做字串切割時得自己撰寫自定函數或在Stored Procedure裡撰寫相關T-SQL語法,在這裡介紹一個SQL內建的函數PARSENAME,這個函數原本是提供傳回物件名稱的指定部份。物件的可擷取部份有物件名稱、擁有者名稱、資料庫名稱和伺服器名稱。底下是擷取SQL 2005的線上叢書的程式片段
USE AdventureWorks;
SELECT PARSENAME('AdventureWorks..Contact', 1) AS 'Object Name';
SELECT PARSENAME('AdventureWorks..Contact', 2) AS 'Schema Name';
SELECT PARSENAME('AdventureWorks..Contact', 3) AS 'Database Name;'
SELECT PARSENAME('AdventureWorks..Contact', 4) AS 'Server Name';
GO
結果集
Object Name
------------------------------
Contact
(1 row(s) affected)
Schema Name
------------------------------
(null)
(1 row(s) affected)
Database Name
------------------------------
AdventureWorks
(1 row(s) affected)
Server Name
------------------------------
(null)
(1 row(s) affected)
這個函數可接受的參數有二個,第一個參數是由四個piece所組成,piece與piece之間以.為連結符號,第二個參數是指要取得第幾個piece。現在我們將這個函數引用到其它的地方,下面的T-SQL片段,主要是將IP位地做切割
DECLARE @IP_Address VARCHAR(15)
SET @IP_Address = '192.168.0.1'
SELECT PARSENAME(@IP_Address, 4) AS piece4
SELECT PARSENAME(@IP_Address, 3) AS piece3
SELECT PARSENAME(@IP_Address, 2) AS piece2
SELECT PARSENAME(@IP_Address, 1) AS piece1
結果集
piece4
------------------------------
192
(1 row(s) affected)
結果集
piece3
------------------------------
168
(1 row(s) affected)
結果集
piece2
------------------------------
0
(1 row(s) affected)
結果集
piece1
------------------------------
1
(1 row(s) affected)
使用PARSENAME有幾個限制,第一個是參數1的組成必需小於等於四個piece,也就是說一個piece也行,第二個是參數2的值必需介於1~4的整數,所以當你的字串是由非常多的piece所組成可能就得自己寫自定函數,更詳細的資料請參考SQL2005線上叢書或sqlteam。
USE AdventureWorks;
SELECT PARSENAME('AdventureWorks..Contact', 1) AS 'Object Name';
SELECT PARSENAME('AdventureWorks..Contact', 2) AS 'Schema Name';
SELECT PARSENAME('AdventureWorks..Contact', 3) AS 'Database Name;'
SELECT PARSENAME('AdventureWorks..Contact', 4) AS 'Server Name';
GO
結果集
Object Name
------------------------------
Contact
(1 row(s) affected)
Schema Name
------------------------------
(null)
(1 row(s) affected)
Database Name
------------------------------
AdventureWorks
(1 row(s) affected)
Server Name
------------------------------
(null)
(1 row(s) affected)
這個函數可接受的參數有二個,第一個參數是由四個piece所組成,piece與piece之間以.為連結符號,第二個參數是指要取得第幾個piece。現在我們將這個函數引用到其它的地方,下面的T-SQL片段,主要是將IP位地做切割
DECLARE @IP_Address VARCHAR(15)
SET @IP_Address = '192.168.0.1'
SELECT PARSENAME(@IP_Address, 4) AS piece4
SELECT PARSENAME(@IP_Address, 3) AS piece3
SELECT PARSENAME(@IP_Address, 2) AS piece2
SELECT PARSENAME(@IP_Address, 1) AS piece1
結果集
piece4
------------------------------
192
(1 row(s) affected)
結果集
piece3
------------------------------
168
(1 row(s) affected)
結果集
piece2
------------------------------
0
(1 row(s) affected)
結果集
piece1
------------------------------
1
(1 row(s) affected)
使用PARSENAME有幾個限制,第一個是參數1的組成必需小於等於四個piece,也就是說一個piece也行,第二個是參數2的值必需介於1~4的整數,所以當你的字串是由非常多的piece所組成可能就得自己寫自定函數,更詳細的資料請參考SQL2005線上叢書或sqlteam。
2009年7月12日 星期日
WebChart介紹1
在資料呈現上高階主管總是希望一目瞭然,所以很多主管都希望下屬在報告時儘可能用圖形的方式來說明,然而在Visual Studio 2003&2005並沒有內建Chart的控製項(2008有Chart Control,但需要自行下載),下面是我目前所知道在ASP.NET下常用的Chart元件,但我並不會全部說明
接下來的幾天我會陸續介紹WebChart、OWC、Zedgraph、Microsoft Chart Controls for .Net 3.5 ,Dundas的元件是付費所以我不介紹,另外Reporting Service我也不介紹(我不喜歡以嵌入的方式來處理圖形)
接下來的幾天我會陸續介紹WebChart、OWC、Zedgraph、Microsoft Chart Controls for .Net 3.5 ,Dundas的元件是付費所以我不介紹,另外Reporting Service我也不介紹(我不喜歡以嵌入的方式來處理圖形)
2009年7月2日 星期四
ASP.NET匯出Excel時,指定欄位格式
在系統開發時,使用者通常會想要網頁提供匯出Excel的功能,在我們實作這個功能時常常會遇到格式的問題,譬如說在網頁上的手機欄位顯示是正常格式(09xxxxxxxx),但匯出Excel後居然變成9xxxxxxxx,底下的程式片段可避免格式跑掉
Response.Clear();
Response.Charset = "big5";
Response.AddHeader("Content-Disposition", "attachment;filename=myExcel.xls");
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("big5");
Response.Write("<html><body>");
Response.Write("<meta http-equiv=Content-Type content=text/html; charset=big5>"); //避免亂碼
Response.Write("<style type=text/css>");
Response.Write("td{mso-number-format:\"\\@\";}"); //將所有欄位格式改為"文字"
Response.Write("</style>");
Response.Write("<table>");
.
.
.
Response.Write("</table>");
Response.Write("</body></html>");
上方的程式碼片段是讓匯出的Excel檔儲存格格式強制為文字。那如果有部份欄位需要數字的儲存格式該如何處理?
Response.Write("<td style=\"mso-number-format:'0\\.0'\">"+欄位內容值+"</td>");
主要的做法就是利用css定義整個Excel欄位的格式,再利用td的style做覆寫,至於詳細的欄位格式,可以參考這裡。
Response.Clear();
Response.Charset = "big5";
Response.AddHeader("Content-Disposition", "attachment;filename=myExcel.xls");
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("big5");
Response.Write("<html><body>");
Response.Write("<meta http-equiv=Content-Type content=text/html; charset=big5>"); //避免亂碼
Response.Write("<style type=text/css>");
Response.Write("td{mso-number-format:\"\\@\";}"); //將所有欄位格式改為"文字"
Response.Write("</style>");
Response.Write("<table>");
.
.
.
Response.Write("</table>");
Response.Write("</body></html>");
上方的程式碼片段是讓匯出的Excel檔儲存格格式強制為文字。那如果有部份欄位需要數字的儲存格式該如何處理?
Response.Write("<td style=\"mso-number-format:'0\\.0'\">"+欄位內容值+"</td>");
主要的做法就是利用css定義整個Excel欄位的格式,再利用td的style做覆寫,至於詳細的欄位格式,可以參考這裡。
訂閱:
文章 (Atom)