2007年11月27日 星期二
SQL的 ASCII
可以透過 ASCII( ) 函式來完成。ASCII( ) 會回傳字元的ASCII數字,
然後把這數字+1之後,就會是下一個字母。最後利用 CHAR( )函式
把 ASCII 值轉換回字母。
2007年11月9日 星期五
Reporting Service 專案複製時注意事項
Error Msg:
無法完成目前的動作,因為報表伺服器資料庫中,並未儲存執行此報表所需的使用者資料來源認證。 (rsInvalidDataSourceCredentialSetting)
2007年11月8日 星期四
分類區塊隱藏與顯示的控制
<input type="checkbox" onclick="cbFunction(this);" id="cb1" name="cb1" runat="server">
T1
<br>
<div id="v1" style="DISPLAY:none">
<table>
<tr>
<td>This is table 1</td>
</tr>
<tr>
<td>
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<asp:Button id="Button1" runat="server" Text="隱藏Table1"></asp:Button></td>
</tr>
</table>
</div>
<br>
<input type="checkbox" onclick="cbFunction(this);" id="cb2" name="cb2" runat="server">
T2
<br>
<div id="v2" style="DISPLAY:none">
<table>
<tr>
<td>This is table 2</td>
</tr>
<tr>
<td>
<asp:TextBox id="TextBox2" runat="server"></asp:TextBox>
<asp:Button id="Button2" runat="server" Text="隱藏Table2"></asp:Button></td>
</tr>
</table>
</div>
</form>
<script>
function cbFunction(object)
{
if(object.id=='cb1')
{
if(object.checked)
{
document.all.v1.style.display='';
}
else
{
document.all.v1.style.display='none';
}
}
if(object.id=='cb2')
{
if(object.checked)
{
document.all.v2.style.display='';
}
else
{
document.all.v2.style.display='none';
}
}
}
cbFunction(document.all.cb1);
cbFunction(document.all.cb2);
</script>
2007年10月31日 星期三
寫入Event Log
const string EVENT_LOG_NAME="Application";
EventLog log=null;
string message=null;
message="paladin test";
log=new EventLog();
log.Source=EVENT_LOG_NAME;
log.WriteEntry(message,EventLogEntryType.Information);
這樣,在事件檢視器裡的應用程式中,就會看到 message 裡的文字了。
EventLogEntryType是事件類別的列舉型態。有 Error, FailureAudit,
Information, SuccessAudit, Warning 可選擇。
將資料表B更新到資料表A
/*
資料表:
test1 (
TId int,
TA char(8)
)
test2(
BId int,
TA char(8)
)
程式需求:
將 test2 資料表的資料,當 TId=BId 時,將 test2.TA 更新到 test1.TA
程式說明:
透過 self-join 的原理,來完成
select tMake1.*
from test1 tMake1
inner join test1 tMake2
on tMake1.TId=tMake2.TId
接著修改成 update 語法 即可
*/
update tMake1 set
tMake1.TA = (select TA from test2 where BId=tMake2.TId)
from test1 tMake1
inner join test1 tMake2
on tMake1.TId=tMake2.TId
SQL-UNION
出現這個問題,剛好是因為我的資料表格裡面(MELearn)原先用來紀錄是否上架(IsShelf)與是否Demo(IsDemo)的欄位格式都是使用 int 格式. 但是在網頁呈現上,我應該用 是/否 來取代 1/0,所以就會有了下面這種轉換查詢結果的需求.
在這過程中,我發現畫線處的SELECT用法,是我所好奇的.原來
執行: SELECT #1 #2
會產生一個新的資料表格,裡面的值為 #1,對應欄位為 #2
執行: SELECT #1 #2, #3 #4
會產生
#2 | #4 |
#1 | #3 |
搭配 UNION的語法,就可以讓我們多加一筆新紀錄
所以下面的語法就會變成
ID | NAME |
1 | 是 |
0 | 否 |
SELECT MELearn.ELearnID,MELearn.LessonName,TMP1.NAME IsShelf,TMP2.NAME IsDemo
FROM MELearn
INNER JOIN (SELECT 1 ID, '是' NAME UNION SELECT 0 ID, '否' NAME) AS TMP1 ON MELearn.IsShelf=TMP1.ID
INNER JOIN (SELECT 1 ID, '是' NAME UNION SELECT 0 ID, '否' NAME) AS TMP2 ON MELearn.IsDemo=TMP2.ID
.Net 使用NTEXT
sqlCmd.Parameters.Add("@Content",SqlDbType.NText);
sqlCmd.Parameters["@Content"].Value=Content;
SQL 執行逾期的問題
當執行比較費時的SQL語法時,雖然我們在 Query Analyzer裡執行不會出錯,但寫到程式裡頭時,卻會發生
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
的錯誤訊息。這是因為在 .Net 裡的 ADO 預設會對 SqlCommand.CommandTimeout 屬性設定 30,也就是只等待30秒,
如果clinet 端等待Server回應超過30秒以後,就會終止 。
所以,我們可以透過這個屬性,來設定我們期待可完成的時間。如果 CommandTimeout 設為 0,則表示無止盡的等待。
我們最好是盡量避免去做這種傻事,凡是要想開一些 ^_^
SQL Begin Transaction
begin tran;
update TFather set FName='111' where FID=1;
delete TFather where FID=1; --(故意會出錯的一行指令)
update TFather set FName='222' where FID=2;
if (@@ERROR<>0)
rollback tran;
else
commit tran;
我們通常會希望如果上面三行SQL指令有錯,自動RollBack 所有資料。然而,實際情況並非如此。他只會RollBack中間那行指令。第一、第三行指令都會被執行且修改到資料庫裡。這問題的解法,是要執行一行指令於 begin tran 之前:
SET XACT_ABORT ON
完整程式如下:
SET XACT_ABORT ON
begin tran;
update TFather set FName='111' where FID=1;
delete TFather where FID=1;
update TFather set FName='222' where FID=2;
if (@@ERROR<>0)
rollback tran;
else
commit tran;
SQL Server 判斷某個Table是否存在
假如要判斷資料庫中某個資料表格是否存在,可透過查詢 dbo.sysobjects 的結果來得知。
以下範例,是在查詢資料庫中是否有 Contactor這個資料表,而且這資料表的屬性是屬於 UserTable
if exists(
select * from dbo.sysobjects where id=object_id(N'[Contactor]') and OBJECTPROPERTY(id,N'IsUserTable')=1
)
select 1;
else
select 0;
select * from dbo.sysobjects
SQL Server 讓float 四捨五入
ROUND
傳回已經進位到特定長度或有效位數的數值運算式。
語法
ROUND ( numeric_expression , length [ , function ] )
引數
numeric_expression
是一個精準的數字或約略的數字資料型別類別 (但 bit 資料型別除外) 的運算式。
長度
指定 numeric_expression 所取的精確度。length 必須為 tinyint、smallint,或 int。當 length 為正數時, numeric_expression 會進位到取至 length 所指定的小數位數。當 length 為負數時,numeric_expression 會進位到取至小數點左邊,就如同 length 所指定的。
Function
指定欲執行的作業型別。function 必須為 tinyint、smallint,或 int。當 function 省略或值為 0 (預設值) 時,numeric_expression 會被四捨五入。當指定非 0 的值時,numeric_expression 會被截去小數點。
傳回型別
傳回與numeric_expression 相同的型別。
備註
ROUND 一定會傳回數值。如果 length 為負數,而且大於小數點以前數字的位數,則 ROUND 會傳回 0。
範例 | 結果 |
---|---|
ROUND(748.58, -4) | 0 |
當 length 為負數時,ROUND 會傳回經四捨五入的 numeric_expression 而不論其資料型別為何。
範例 | 結果 |
---|---|
ROUND(748.58, -1) | 750.00 |
ROUND(748.58, -2) | 700.00 |
ROUND(748.58, -3) | 1000.00 |
範例
A. 使用 ROUND 與估計
這個範例顯示兩個運算式,舉例說明以 ROUND 函數所得的最後一個阿拉伯數字一定是估計值。
SELECT ROUND(123.9994, 3), ROUND(123.9995, 3)
GO
以下為結果集:
----------- -----------
123.9990 124.0000
B. 使用 ROUND 與取其近似值
此範例顯示四捨五入與近似值。
陳述式 | 結果 |
---|---|
|
|
|
|
C. Use ROUND to truncate
這個範例使用兩個 SELECT 陳述式來說明四捨五入與無條件捨去的差別。第一個陳述式將結果四捨五入。而第二個陳述式則將結果無條件捨去。
陳述式 | 結果 |
---|---|
|
|
|
|
SQL Server 的NTEXT
.Net Bug
問題: Windows XP 安裝微軟最新修正檔後,造成.Net 程式執行時,會出現Server端錯誤訊息
解決方法:1.先關掉IIS
2.編輯 C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\CONFIG\machine.confi
用搜尋方式,找出唯一的 userName="machine" 接著把他改成 userName="system"3.重新啟動IIS
2007年10月11日 星期四
IIS Worker Process
每一個頁面,會先經過 http.sys進行第一次的驗證。他針對每一個URL的請求,進行長度檢查,判斷是否有超過 16KB。16KB換算成字元數,是260個字元,也就是說,當你URL裡頭,有一個路徑是超過260個字元,則就會發出 414 的錯誤訊息。
HTTP Error 414 - Request URI too long
實際上,經過個人親自在 winXP、IIS 5.1與ASP.Net 2.0上測試,當超過260個字元時,出現的錯誤為 400
HTTP / 1.1 400 - 錯誤的要求時發生錯誤
這現象,是因為我並非在 windows2003 搭配 IIS6 的環境上所造成的差異。而右圖所提到的 w3wp.exe,也是要在 window2003上,才會有這個執行檔。
另外,如果想要觀察你的 WEB 站台處理了哪些URL請求,可以到 WEB站台的 %windir%\system32\LogFiles\W3SVC1 目錄下,找到所有的URL請求資料。
Http.sys他只會針對 URL 與 header 進行檢查,至於 Content 的檢查,則是交由ASP.Net去負責。
ISAPI(Internet Server Application Programming Interface)
ISAPI可執行文件分為兩類:擴展(Extensions)與篩選器(Filters)。
擴展的用法,是指可以透過像 http://localhost/myisapi.dll 這種方式來呼叫IIS所提供的功能來使用。
篩選器,則是能夠用來修改傳入與傳出的資料流。所以可以用來實作出自行定義的日誌記錄檔、身份驗證、也可以用來修改資料流。
2007年10月1日 星期一
SQL 語法裡的換行
可是在 SQL 與法裡,就不行這樣了,要改成 replace( testString,char(13),'<br>')
所以,SQL語法裡的換行是: char(13)
2007年9月11日 星期二
將逗號串起來的字串轉為資料表方式
declare @str nvarchar(500)
set @str='526274,526275,526276'
declare @tmpStr nvarchar(500);
declare @tmpIndex nvarchar(500);
create table #tmpStrTb (empid nvarchar(50))
set @tmpStr=@str
while len(@tmpStr)>0
begin
if(charindex(',',@tmpStr)>0)
set @tmpIndex=(select substring(@tmpStr,1,charindex(',',@tmpStr)-1))
else
set @tmpIndex=@tmpStr
set @tmpStr=replace(@tmpStr,@tmpIndex,'')
if(substring(@tmpStr,1,1)=',')
set @tmpStr=substring(@tmpStr,2,len(@tmpStr)-1)
insert into #tmpStrTb (empid) values (@tmpIndex)
end
select * from #tmpStrTb
drop table #tmpStrTb
2007年8月29日 星期三
當我的兒子是 iFrame 的時候
目前有兩種方式,但使用的時機各不相同。
第一種:document.getElementById(“ifr”);
第二種:window.frames[“ifr”];
如果我們想要改變的,只是iframe的src,border,scrolling時,就要使用第一種方式。
如果我們想要改變的,是整個iframe裡的DOM階層,也就是要存取iframe裡的某一樣東西時(如txtbox的值),就要使用第二種。
然而,當你所存取的 iframe 頁面尚未完全下載完成時就要呼叫使用它,是會出錯的。所以,我們自己要去處理這個錯誤。最簡單的方法,就是先去檢查我們要呼叫的物件是否已經存在,如果不存在,就等他一下,然後再繼續做我們要做的事。
我用了 setTimeout( ) 的方式來處理。
function CallIFrame()
{
var ob=window.frames["ifDraft"];
var iobject=ob.document.getElementById("txtTest");
if(iobject)
{
iobject.value="三趨一";
}
else
{
setTimeout("CallIFrame()",100);
}
}
iFrame裡的網頁呼叫父網頁
ex:
parent.location.href='http://www.kimo.com.tw'
只需要加上 parent 就可以了
2007年8月28日 星期二
破解XP Adminstrator密码
取 而代之的是我成为Administrators,你信不信?呵呵,你不信?好,我们来试一试: 步骤一 重新启动计算机,在出现启动菜单时按F8键进 入高级选项菜单,选择“安全模式”进入系统; 步骤二 打开“控制面板”,找到“用户和密码”选项,看看是不是账户中包括 Administrators?好,现在将Administrators账户删除,重新创建一个Administrators,或是更改原来的 Administrators账户密码; 步骤三 重新启动计算机后,只有输入新的密码才能登录Windows XP。 为什么会出现这种问题呢? 原因很简单:Windows XP真正的超级管理员账号应该是在安全模式下的Administrators,并不是在正常模式下的 Administrators。在默认情况下,安全模式下的Administrators密码为空。无论用户在正常模式下将Administrators 密码设置得多么复杂,安全性多么高,如果没有设置安全模式下的Administrators密码,你的电脑将毫无秘密可言。 现在,你是不是对 Windows XP的安全性有些担忧了?那怎么办?这还不简单:赶紧进入安全模式,设置Administrators密码,将自己提升为真正的 Administrators!当然,这次设置的密码要记牢了,否则下次你就真的无法进入Windows XP了!安全模式下的 Administrators,的确厉害!
但是最厉害的还是1、用DOS启动盘进入纯DOS
2、进入系统目录下的system32目录 (cd system32)
备份logon.scr、cmd.exe两文件 (copy …… ……)
删除logon.scr (del logon.scr)
并将cmd.exe改名为logon.scr (ren cmd.exe logon.scr)
3、重启进入Windows,出现登陆画面等一会,一般会进入屏保logon.scr(此时已为cmd.exe)
4、可以在DOS下一展身手了,可用net
所以说赶快设置上你的 bios 才是硬道理
原文參考
2007年8月24日 星期五
存取 MasterPage上的物件
可以在目前的 Content 裡面下 Master.FindControl("lbMasterTitle")
2007年8月20日 星期一
呼叫 .Net 2.0 SqlDataSource 的 Connection 字串
他會在 Web.Config 裡加入一段
<connectionstrings>
<add name="engagedbConnectionString" connectionString="Data
Source=SQLT,5555;Initial Catalog=gage;User ID=pub_pre_XXXX;Password=XXXX"
providerName="System.Data.SqlClient"></add>
</connectionstrings>
這跟我們以前寫在 AppSetting 的語法有點不同。既然有了新的物件,那我們要如何去呼叫他裡頭的設定呢?
可以透過下面方式:
ConfigurationManager.ConnectionStrings[ "engagedbConnectionString" ].ConnectionString
2007年8月9日 星期四
當SQL語法有用到 CURSOR 時
當執行 SQL Command 1 時,會出現 「當物件關閉時,不允許操作」的問題,
但是 執行 SQL Command 2 就不會。
是不是 執行 rs1.open 的時候,有參數要設定?
================================== SQL Command 1 ==================
declare @ShipperID int;
select * into #tmp from Shippers
DECLARE rsCursor CURSOR FOR
SELECT ShipperID FROM #tmp;
--開啟指標
OPEN rsCursor;
-- --移動指標到第一筆, 並將資料欄位填入變數中
FETCH NEXT FROM rsCursor INTO @ShipperID;
WHILE @@FETCH_STATUS=0
BEGIN
--更新資料表
Update #tmp set Phone='555' where ShipperID=@ShipperID
--移動指標到下一筆, 並將資料欄位填入變數中
FETCH NEXT FROM rsCursor INTO @ShipperID;
END
--關閉指標
CLOSE rsCursor;
--釋放指標
DEALLOCATE rsCursor;
select * from #tmp
drop table #tmp
======================================================================================
================================== SQL Command 2 ==================
select * from Shippers
====================================================================
rs1.open strSQL, conn, 3, 1
錯誤類型:
ADODB.Recordset (0x800A0E78)
當物件關閉時,不允許操作。
/SSOTest/test.asp, line 58
解決方法,是在SQL 語法裡面加上
SET NOCOUNT ON
參考網址:http://csdn.eyeah.cn/3116/1118/1126/232617673.html
據網址所言,是因為 odbc 與 oledb 資料集不同所造成。
Reporting Services匯出成 PDF 中文字都會變成亂碼
但是卻發現在匯出成 PDF 格式時,
所有中文字都會變成亂碼。
A:到 VS.NET 2003 修改該欄位成中文字形(明體)
就可以正常輸出
取出物件的所有公開屬性
現在介紹的方法,可以用來取出某個類別裡面所有公開的屬性。另外,他也可以取出 webForm 上面物件的屬性。
public
class MyControl
{
private
string _text;
private
int _itemCount;
public
string Text
{
get{return
_text;}
set{_text=value;}
}
public
int ItemCount
{
get{return
_itemCount;}
set{_itemCount=value;}
}
}
-------------------------------------------------
private
void Button2_Click(object
sender, System.EventArgs e)
{
MyControl ctrl=
newMyControl();
ctrl.Text="New Times";
ctrl.ItemCount=25;
PropertyDescriptorCollection props=TypeDescriptor.GetProperties(ctrl);
foreach(PropertyDescriptor
prop in props)
{
Response.Write(prop.Name+": "+prop.GetValue(ctrl));
Response.Write("<BR>");
}
}
HtmlTextWriter
要透過 HtmlTextWriter 實作 Render ,會用到 RenderBeginTag,
RenderEndTag,AddAttribute,AddStyleAttribute ...
我以超連結的範例來說明:
<a | style="font-size:18pt" | href="http://www.kimo.com.tw | LinkToKimo | </a> |
RenderBeginTag( ) | AddStyleAttribute( ) | AddAttribute( ) | Write( ) | RenderEndTag( ) |
RenderBeginTag( ):用來產生 <a>, <Table>,<TR> ... 等等Html標籤格式
AddAttribute( ): 用來設定 HTML標籤內的值
AddStyleAttribute( ):用來設定標籤的樣式,如style
Write( ):將字串直接秀在Browser上
RenderEndTag( ):產生HTML標籤的結束符號,如 </a> , </table> ...
Writing HTML contents to client
1.直接將 HTML 語法丟到瀏覽器。直接實作 Write
2.使用多用途的方法(utility methods)。
這兩種方法的差別,在於如果我們使用 utility methods ,可以不用去擔心使用者的瀏覽器是哪一種類型(IE、NetScape、WinCE、PDA),.NET自動會幫我們作轉換的動作。
當我們想透過 Render來呈現UI時,主要是透過我們所繼承的 Control物件,並 override其中的 Render( )來完成的。所以在程式中,別忘了記得去作繼承的工作。
Add Server Control by Visual Studio .Net
接下來,我們要設定整個專案的屬性。選擇 Project -> Properties,在 Common Properties 裡選擇 General,在右邊的選單中的 Output Type 選擇 Class Library。
The difference between User Control and Server Control
在效能方面,early bound Server Control 比 late bound ASP/COM(+)/VBScript Object 速度快三倍,但是 Server Control 會額外花費一些時間在 UI 介面的呈現與 PostBack 訊息處理上。所以,當你發現 Server Control 的效能低落時,就必須要檢查 Rendering 與 PostBack 這兩個地方有沒有寫好。
StringBuilder 的效率問題
蠻沒有效率的。因為每一次呼叫 stringVar+= 就會從新配置一塊記憶體去儲存組合結果,
如果你在回圈裡重複次數很多時,執行效能就會明顯被影響。
這個狀況,要透過 StringBuilder 來克服,宣告了StringBuilder之後,會重複的使用同一塊
記憶體空間,能夠節省因為重新配置記憶體而所需額外耗費的系統資源。
Try Catch 的效率問題
如果在一個網頁裡面使用個幾次 Try Catch 語法,其實是沒有多大影響的。但是當您是在大量
迴圈中使用,那 Try Catch 則會嚴重影響到效能。並非不能去使用 Try Catch,而是在用的時
候,必須衡量呼叫 Try Catch 的次數是否會多到影響到效能。
動態產生按鈕及觸發事件
當有需要動態產生按鈕時,我們會考量幾個狀況,第一是畫面編排,第二則是按鈕 click 後觸發事件的處理。在畫面編排裡,由於按鈕
是屬於 WebControls 的物件之一,他必須要放在 Form裡面。所以我們可以事先在畫面上拉一個Panel,用他來擺放待會要動態產生的
按鈕物件。另外,為了能讓按鈕擺放能夠更美觀,所以會增加<Table>標籤來完成。
在ASPX頁面,範例程式如下所示:
<body>
<form id="Form1" method="post" runat="server">
<asp:Panel id="Panel1" runat="server"></asp:Panel>
</form>
</body>
在ASPX.CS 頁面,範例程式如下:
private void Page_Load(object sender, System.EventArgs e)
{
//用來自動產生項目的資料來源
string [] oAL=new string[]{"kimo","pchome","google"} ;
//宣告 Table 物件
Table oTable=new Table();
//宣告 TableRow 物件
TableRow oTR=new TableRow();
//宣告 TableCell 物件
TableCell oTC;
//宣告 動態產生的 按鈕 物件
Button oB;
//動態產生按鈕的迴圈
for(int i=0;i<oAL.Length;i++)
{
//實體化一個 TableCell
oTC=new TableCell();
//實體化一個按鈕
oB=new Button();
//設定按鈕的物件識別編號
oB.ID="Btn"+oAL[i].ToString();
//設定按鈕的Text屬性
oB.Text="Btn"+oAL[i].ToString();
//設定按鈕click的觸發事件,oB_Click 指的是click後對應的事件名稱
oB.Click+=new EventHandler(oB_Click);
//將動態產生的 Button 加到 TableCell 裡面
oTC.Controls.Add(oB);
//設定 TableCell的邊寬為 1 px
oTC.BorderWidth=Unit.Pixel(1);
//將動態產生的 TableCell 加入到 動態產生的 TableRow
oTR.Cells.Add(oTC);
}
//將動態產生的 TableRow 加到 動態產生的 Table
oTable.Rows.Add(oTR);
//將動態產生的 Table 加入到 Panel1
Panel1.Controls.Add(oTable);
}
public void oB_Click(object sender, System.EventArgs e)
{
string strComeFrom=string.Empty;
//取得呼叫者的 ClientID
strComeFrom=((Button)sender).ClientID;
Response.Write(strComeFrom);
}
為何要將整個動態產生的程式碼寫在Page_Load()事件裡,而且不放在 !IsPostBack 區段,
主要是因為當按鈕被觸發之後,如果把動態產生的物件寫在 !IsPostBack 裡,會找不到原先
所建立的動態物件。所以我們把這段程式放在 Page_Load(),並讓每一次的PostBack都重新
去執行一次。
check box list 被清掉的問題
為了避免這問題發生,我們就必須在每一次的 PageLoad 事件中,重新 Bind 一次資料。
區分編碼型態來取得字串的位元長度
的長度算 1 ,而一個中文字也算是 1 。如果我們要將中文字長度算成 2 時,這種中英文雜處的字串就不能夠單純的使用 String.Length 來
處理了。
這時候,我們可以使用下面的方法解決:
private string TruncateByUserDefine(string strOri,int iCharLength)
{
Byte [] byteOri = System.Text.Encoding.Default.GetBytes( strOri );
if( byteOri.length< iCharLength)
iCharLength = byteOri.length;
char [] charTrans= System.Text.Encoding.Default.GetChars( byteOri, 0, iCharLength);
string strResult=new string(charTrans);
return strResult;
}
說明一下這個函式,strOri 是我們準備要用來判斷的字串來源,而 iCharLength 則是我們所需要取出的字元長度。
我們先將來源字串轉成 Byte 的格式,再透過 GetChars 將裡面的字元一個一個讀到陣列裡頭,最後,我們就將只需
要取出所要長度的字元陣列即可。
顯示幣別格式的字串
SQL Server 安裝主機變更主機名稱後的處理
開啟 Query Analyzer
--Step01
--顯示目前的區域伺服器(Local Server) 之名稱
select @@ServerName
--Step02
-- 刪除目前的區域伺服器名稱
-- 這裡所指的 LocalServerName,就是剛剛執行 select @@ServerName的結果
exec sp_dropserver 'LocalServerName', 'droplogins'
-- 若是沒辦法刪除,請先執行 sp_dropremotelogin,來卸除與本機登入對應的遠端登入後,再執行 sp_dropserver
exec sp_dropremotelogin 'LocalServerName'
-- Step03
-- 重新建立區域伺服器,使用目前最新的伺服器名稱,必須搭配 LOCAL 參數
exec sp_addserver 'New_Name', 'local'
-- Step04
-- 將SQL Server 關掉,重開,再度執行以下指令,看看是否已經有所改變
select @@ServerName
汽車測試二期VSS專案建置步驟
1.先建好 VSS DB
2.開啟 Visual Studio .Net,開啟舊的專案,選取 Source Control -> Add Solution to Source Control ->
直接加在 $/ 下面,並將 *.root 的 .root 去掉
FreeSMTP.dll拒絕存取的問題
加入別人提供的ASP.NET專案
常常發生客戶所做的Mockup,拿來安裝時,卻發生因為站台名稱命名跟客戶的Mockup站台不一樣,而無法開啟專案。解決方法如下。
首先先在IIS服務管理員,新增Mockup站台。
再將客戶專案檔中的project.csproj.webinfo開啟,編輯
<VisualStudioUNCWeb>
<Web URLPath = "http://localhost/CarTest2Mockup/cartest.csproj" />
</VisualStudioUNCWeb>
將 Web URLPath 的值更改為剛剛建立的站台名稱,接著在Visual Studio .net 新增一個空白的 Solution,加入舊的現有專案即可
產生 BarCode 的方法
居多,但是會根據不同的開發工具而有個別對應的BarCode產生元件
。當然,比較有彈性的方法,就是自己寫,缺點就是要花時間。日前
我在藍色小舖找到一篇不錯的文章,其作法可供為參考。
他主要作法,是先安裝BarCode字型,當USER輸入文字後,將這些文字
轉換成對應的BarCode字型,然後將這些BarCode以繪圖的模式輸出成
圖形檔。而我們在畫面中,則是利用<img>的方式,將BarCode圖檔秀
出來。
藍色小舖資料來源如下:
網頁上的即時條碼產生--->使用VB.Net
類別 :
ASP.NET ,
摘要 :
即時產生條碼的程式
Response.Expires = 0
Dim BMP As Bitmap = New Bitmap(320, 250, Imaging.PixelFormat.Format32bppPArgb)
Dim G As Graphics = Graphics.FromImage(BMP)
Dim 來源影像 As Image = Image.FromFile(Request.PhysicalApplicationPath + "logo.jpg") ' 讀取背景影像進來
G.DrawImage(來源影像, New Rectangle(0, 0, 320, 250), New Rectangle(0, 0, 210, 60), GraphicsUnit.Pixel)
Dim 字型 As Font = New Font("IDAutomationHC39M", 25) <--- 這行是重點, 自行到網路上抓取該條碼字型吧
Dim 筆刷 As Brush = New SolidBrush(ColorTranslator.FromHtml("Gold")) < --- 這裡是條碼顏色
G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
G.DrawString("123456", 字型, 筆刷, 50, 15) < --- 印出條碼
BMP.Save(Response.OutputStream, Imaging.ImageFormat.Jpeg)
想要顯示條碼的部分, 加上這段就可以囉
另外, 需
Imports system.drawing
改成C#後的程式如下:
using System.Drawing;
using System.IO;
private void Button1_Click(object sender, System.EventArgs e)
{
Bitmap BMP=new Bitmap(420, 100, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
Graphics G=Graphics.FromImage(BMP);
System.Drawing.Image IMGSource= System.Drawing.Image.FromFile( Server.MapPath("images/logo.jpg"));
/* 預先要準備一張空白畫面的背景圖,範例中是指 logo.jpg */
G.DrawImage( IMGSource, new Rectangle(0, 0, 420, 100), new Rectangle(0, 0, 210, 30), GraphicsUnit.Pixel);
System.Drawing.Font F=new Font("IDAutomationHC39M", 14);
/* 指定所要選用的字型,也就是 BarCode 字型,以及字型大小 */
System.Drawing.Brush B= new SolidBrush( ColorTranslator.FromHtml("Black")) ;
/* 設定字型顏色 */
G.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
G.DrawString( string.Format( "*{0}*",TextBox1.Text),F,B,30,15);
/* 指訂要轉換成BarCode的內容,在字首字尾須加星號(請參考BarCode - Code39的規範) */
BMP.Save( Server.MapPath("images/kk.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg );
/* 將結果輸出成圖片,檔名為 kk.jpg */
/* 另一種呈現方式,只需要一張暫存圖片。 */
Byte[] bf =new byte[10];
ReadBinaryFile(ref bf,Server.MapPath("images/kk.jpg"));
Session["BarCode"]=bf;
IMGSHOW.Src="ShowPic.aspx";
}
private bool ReadBinaryFile(ref Byte[] buffer,string FilePath)
{
//System.IO.File MyFile;
System.IO.Stream FileStream;
if(!File.Exists(FilePath))
return false;
FileStream=File.OpenRead(FilePath);
buffer=new Byte[FileStream.Length];
FileStream.Read(buffer,0,Convert.ToInt32(FileStream.Length));
FileStream.Close();
return true;
}
public class ShowPic : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
Response.BinaryWrite((byte[])Session["BarCode"]);
Response.End();
}
}
避免 Button 被使用者連續 click 2次以上
sample code:private void Page_Load(object sender, System.EventArgs e)
{
b1.Attributes["onclick"]=@"
this.disabled=true;
"+this.GetPostBackEventReference(this.b1);
}
將flash設為通透,讓Menu列可以正常顯示
當我們的頁面有提供功能列時(會有子項目顯示),如果頁面上再擺上 Flash,那我們的功能列就會被 Flash 遮蓋。這時候,可以在 Flash 上面加上
參數設定即可。
<param name="wmode" value="transparent">
完整設定:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=4,0,2,0"
id="index" width="500" height="345">
<param name="movie" value="index.swf">
<param name="bgcolor" value="#FFFFFF">
<param name="quality" value="high">
<param name="wmode" value="transparent">
<param name="allowscriptaccess" value="samedomain">
<embed type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer"
width="500" height="345"
name="index" src="index.swf"
bgcolor="#FFFFFF" quality="high"
swLiveConnect="true" allowScriptAccess="samedomain"
></embed>
印尼Flash
</object>
DateTime轉String的國別設定
時間的"上午"改成"AM"來表示。以下面例子來作解釋:
using System.Globalization;
DateTimeFormatInfo myEn = new CultureInfo( "en-US", false ).DateTimeFormat;
DateTimeFormatInfo myCh = new CultureInfo( "zh-TW", false ).DateTimeFormat;
DateTime dt=DateTime.Now;
string aa=dt.ToString("yyyy/MM/dd tt hh:mm:ss",myEn); // 會秀出 "AM" or "PM"
string bb=dt.ToString("yyyy/MM/dd tt hh:mm:ss",myCh); // 會秀出 "上午" or "下午"
PS:
hh : 12 小時制
HH: 24 小時制
把ASCII轉成對應的十進位數字
範例:
char [] CharArray=txt1.Text.ToCharArray();
ASCIIEncoding ascii=new ASCIIEncoding();
string strResult=string.Empty;
if(txt1.Text.Length>0)
{
Byte[ ] encodingByte=ascii.GetBytes(txt1.Text);
strResult=ascii.GetString(encodingByte);
string test=encodingByte[0].ToString();
Response.Write(strResult);
Response.Write(encodingByte[0]);
}
執行JavaScript與PostBack的順序
轉換成我們在網頁檢視原始碼時所看到的結果是一樣的。這句話應該要銘記在心,蠻受用的。於是我們都可以透過JavaScript來完成要求,
只是看你功力夠不夠高,想不想寫的複雜一點。
我先分析一下,使用:
Button1.Attributes["OnClick"] 與
this.RegisterStartupScript("s",scriptString); 這兩種區別。
如果我們使用的 Button1 是一個Server Control,不管我們在Button1.Attributes["OnClick"]後面接什麼,最後都會再執行一次PostBack。
因為這個宿命已經在 event-handle就決定了。所以我們在 ["OnClick"]後面所接的JavaScript指令會優先被執行。
但是如果我們採用 this.RegisterStartupScript("s",scriptString); 方式,則會先執行我們Server Control的觸發事件裡面的動作,
最後再執行RegisterStartupScript裡面的JavaScript。
所以簡單說,這兩個用法的差別,就是執行順序不同。
然而,如果你要產生 postback - run javascript -postback ,有可能嗎?
可以的,舉裡來說:
Button1.Attributes["OnClick"]=this.GetPostBackEventReference( btnAdd ) + ";alert('ggg');";
Button1是一個Server Control,根據上面的語法,會先觸發一個我們所自定的PostBack,然後再執行
JavaScript。最後,因為他本身是一個Server Control,所以還會在觸發一次他自己的PostBack。
注意,這裡的JavaScript語法前面有加個";" ,主要是為了區別上一個PostBack所產生的語法。
列印畫面
印出。這時,除了重新去湊出結果的方法之外,還有一個解法。
我們知道,透過 javascript 的 window.print() 就可以將畫面印出了。但現在要處理的,如何將某些畫面隱藏起來。我們可以透過
document.all.SomeObject.style.display='none'的語法來達成。此外,還有一個方法是用
document.all.SomeObject.style.visibility='hidden'。但這個方法有個缺點,就是雖然物件被隱藏了,但他還是站著同樣的版面,
有站著茅坑不拉屎之嫌。所以還是推薦 display的方法。此外,由於我們所使用的Button是一個 webcontrol,也就是按下去會觸發PostBack。所以當我們透過javascript去調整畫面(隱藏某些
物件)後,執行列印功能,可以達到我們想要的結果。而隨之而來的PostBack,會將整個頁面又帶回初始的狀況(即那些被隱藏的物件
都又顯示出來了)。
visibility: 'hidden' / 'visible'
display: 'none'/ ''
將DB的資料轉出成Excel
所以只要將查詢結果轉出到 DataGrid,就可以完成我們的目的。
首先,我們必須先在 WebForm 中新增一個DataGrid,由於我們希望透過DataGrid來存放查詢結果,而將來所產生的的Excel模樣又跟這
DataGrid有關係,也就是這裡的DataGrid樣子長怎樣,將來的Excel就會長怎樣。然而,有可能不希望這DataGrid出現在使用者的眼前,
這簡單,只要我們在程式的最後面將 DataGrid的 Visible 設成 false 就可以解決。範例如下:
private
void Button1_Click(object
sender, System.EventArgs e)
{
System.Configuration.AppSettingsReader app =
new
System.Configuration.AppSettingsReader();
string
ConnectionString=(string)app.GetValue("DBConnectionString",typeof(string));
string sql=@"
select * from Customers;
";
SqlConnection conn =
newSqlConnection(ConnectionString);
SqlCommand sqlCmd =
newSqlCommand(sql, conn);
conn.Open();
DataSet ds=
newDataSet();
SqlDataAdapter oDataAdapter =
newSqlDataAdapter(sqlCmd);
oDataAdapter.Fill(ds, 0, 0, "Table1");
conn.Close();
dg1.Visible=
true;dg1.DataSource=ds;
dg1.DataBind();
Response.Clear();
Response.AddHeader( "Content-Disposition",
"attachment;filename=VisitReport.xls" );
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding=System.Text.Encoding.GetEncoding("Big5");
Response.Write("<html><body>");
ResponseReportOnly(dg1 );
Response.Write("</body></html>");
Response.End();
dg1.Visible=
false;
}
private
void
ResponseReportOnly(System.Web.UI.WebControls.DataGrid dg)
{
dg.HeaderStyle.CssClass="TblHeader_Prn";
dg.ItemStyle.CssClass="TblOddRow_Prn";
dg.AlternatingItemStyle.CssClass = "TblEvenRow_Prn";
TextWriter tw=
newStringWriter();
HtmlTextWriter hw =
newHtmlTextWriter( tw );
tw.Write( "<div align=center>" + "2005 ADOC Week" + "</div>");
dg.RenderControl( hw );
// 用來自動產生 Excel 檔,如果 User 不希望自動產生,可以拿掉
string
newFilePath=Server.MapPath("tt.xls");
FileStream fs=
newFileStream(newFilePath,FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);
StreamWriter sw=
newStreamWriter(fs,System.Text.Encoding.Default);
sw.Write(tw.ToString());
sw.Close();
fs.Close();
Response.Write(tw.ToString());
}
將DataGrid內容輸出到Excel
導到一個StringWriter裡,再將StringWriter的內容Response到Excel頁面。
範例:
StringWriter sw = new StringWriter();
HtmlTextWriter tw = new HtmlTextWriter(sw);
DataGrid1.RenderControl(tw);
Response.Clear();
Response.AddHeader( "Content-Disposition", "attachment;filename=VisitReport.xls" );
Response.ContentType = "application/vnd.ms-excel";
Response.Write("<html><body>");
Response.Write(sw);
Response.Write("</body></html>");
讓 label 也能觸發 click 事件
而該函式利用「eventTarget」參數,來判斷引發該PostBack動作的是哪一個Web控制項,此外透過「eventArgument」
傳入其他額外的參數。
private void Page_Load(object sender, System.EventArgs e)
{
lbcal.Attributes["OnClick"]= this.GetPostBackEventReference(this.Button3);
if(Request.Form["__EVENTTARGET"]==Button3.UniqueID)
UserDefineEvent();
btnNewWindow.Attributes["OnClick"]="window.open('http://www.kimo.com.tw')";
}
private void UserDefineEvent()
{
Response.Write("I got it!");
}
我們首先定義了一個label物件叫做 lbcal,然後透過lbcal.Attributes["OnClick"]去實作觸發OnClick時的事件。
另外,GetPostBackEventReference( )是用來告知這次的PostBack是由那個物件所觸發的。在範例中,我們指定按下
lbcal標籤時,告知系統這是Button3所觸發的(當然,我們也可以用this.lbcal來代替,只是現在是用"借刀殺人")。
在Page_Load事件中,我們還有透過Request.Form["__EVENTTARGET"]來抓取到底是誰觸發這次PostBack的資訊。
用javascript把物件隱藏
先用 <div> 或 <span> 將物件包起來,之後再使用 javascript 來設定隱藏屬性
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<script>
function hiddenText()
{
list2.style.visibility="hidden";
}
</script>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form name="form1" method="post" action="">
<span id='list2'>
<input type="text" name="textfield" id="textfield">
</span>
</form>
<p> </p>
<input type="submit" name="Submit" value="Submit" onclick="hiddenText()">
<p> </p>
</body>
</html>
將資料序列化存入ViewState
[System.Serializable()]
public class _InfoStudent
{
public ArrayList Name;
public ArrayList Status;
public _InfoStudent()
{
Name=new ArrayList();
Status=new ArrayList();
}
}
完成後,將序列化的資料指派給ViewState
_InfoStudent InfoStudent=new _Infostudent( );
ViewState["test"]=InfoStudent;
從ViewState取資料
InfoStudent=(_InfoStudent)ViewState["test"];
將javascript的值傳給.net
要讓javascript與.net後端溝通,需要透過 hiddent 欄位來作橋樑。
我們需要先建立一個 hiddent 欄位
<input type="hidden" id="HTest" name="HTest" value="My Secrete">
將javascript運算的結果,存入hiddent欄位中
<script lang="JavaScript">
function show()
{
document.Form1.HTest.value="KKBOX";
alert(document.Form1.HTest.value);
}
</script>
最後我們在.net 後端,就可以透過下面方法將hiddent的值取出來
Request.Form["HTest"]
動態指定 WebService 的URL
舉例來說,我們使用了DebugWeb這個WebService,但是想要動態
改變提供來源的路徑時,就可以使用 Url 來指定即可。
WebReference1.DebugWeb oD=new test01.WebReference1.DebugWeb();
oD.Url="http://10.10.188.6:8088/materialweb/DebugWeb.asmx";
取得目前client端瀏覽器的版本
在程式中,我們可以叫用
this.Request.Browser.Boroser 取得瀏覽器種類
this.Request.Browser.MajorVersion.ToString()取得主版本編號
this.Request.Browser.MinerVersion.ToString()取得次版本編號
Script Debug
1.先將IE的 工具-網際網路選項-進階 停用指令碼除錯 的勾選方塊取消
2.在Visual Studio 的 Debug-Process , 選擇所要除錯的網頁(這網頁需事先開啟)(某個Iexplore.exe),
執行 Attach,再對所選定的項目執行 Break
3.執行網頁上可疑的行為,可在Visual Studio的程式碼中設定中斷點,讓Script單步執行
不發出 PostBack 的方法
有時為了避免發出 PostBack,卻要透過Server端存取資料時,可採用下面的作法。
有兩種ActiveXObject可使用,Msxml2.XMLHTTP.4.0的版本,提供較好的MultiThread的作法,
缺點是用戶端的瀏覽器需下載更新軟體才能使用。而Microsoft.XMLHTTP則是他的前一個版本,
效能可能不如4.0版的好,但是客戶端瀏覽器不需額外安裝更新檔案。
var
oHttp=new
ActiveXObject("Msxml2.XMLHTTP.4.0");
// or for MSXML 3.0 IE5.5
//
var oHttp=
new
ActiveXObject("Microsoft.XMLHTTP");
<SCRIPT language="JScript">
<!--
var retVal=null;
var oHTTP=null;
function GetCheck(arg)
{
oHTTP= new
ActiveXObject("Microsoft.XMLHTTP");
oHTTP.onreadystatechange =
oHTTP_onreadystatechange; //event handle
var url =
arg+"?ConsignorNO="+Form1.txtConsignorNo.value;
try
{
oHTTP.Open("GET", url,
false); //false:同步 true:非同步
oHTTP.Send();
}
catch(e)
{
//for Debug Only
alert(e);
}
}
function oHTTP_onreadystatechange()
{
if (oHTTP.readyState == 4)
{
retVal = oHTTP.responseText;
}
}
//-->
</SCRIPT>
這裡所指定的url,是去開啟一個aspx的檔案,在這個檔案裡的 OnPageLoad()屬性中,我們會寫程式去資料庫抓取我們想要的資料。
我們最後會將資料透過 Response.Write()的方式,寫到頁面上。因為我們採用 GET() 的方式,所以這頁面上的資料都會被我們取回
來。另外,在.aspx的HTML裡,除了codebehinde那一行留著,其他都要刪掉。在Response.Write()執行完之後,也要用Response.End()
當結尾,避免後面被塞了一些垃圾標籤。
把1 format成0001
補充:20110728
在 GridView 裡,也常常會遇到需要顯示金額得情況,三位一撇、或需要到小數第二位。假如在 GridView 裡是使用:<%#Eval("money") %> 來繫結金額,那可以改成以下寫法來達到三位一撇、到小數第二位的效果:
<%#Eval("money","{0:N2}") %>
N2: 是指到小數第二位
N3: 到小數第三位
N0:則是不顯示小數
另外,
<%#DataBinder.Eval(Container.DataItem,"money","{0:N2}") %>
也是有同樣的效果。
參考:
01.Asp.net中DataBinder.Eval裡String Format用法的總結
02.ASP.NET string.Format 格式參數
FileField控制項
使用 FileField控制項時,會自動在右邊產生一個"瀏覽"的控制項。如果是要將所選擇檔案的內容上傳,記得要加上
<form id="selector" method="post" enctype="multipart/form-data"
runat="server">。
enctype是用來確保檔案的內容會被送出,而不是完整路徑。
把某個控制項設為聚焦
方法一:
private void
Page_Load(object sender, System.EventArgs e)
{
string clientScript="";
clientScript=string.Format(@"
<script language='javascript'>
<!--
document.Form1.{0}.focus();
//-->
</script>",txtName.ClientID);
this.RegisterStartupScript("SS",clientScript);
}
方法二:
如果是要在 pageload 的階段就設為具焦,可以寫在
<body onload="document.Form1.TextBox1.focus( );">
如果是要在某個按鈕被觸發之後,才設為具焦,可以先將
<body id="Body1" runat=server> 設為 在 server 端執行的物件
然後在事件觸發之後,寫
Body1.Attributes["onload"]="document.Form1.TextBox1.focus( );";
明明只是警告,卻無法編譯成功
選擇 Project-> 專案名稱 Properties:
在左邊的是窗,選擇 Configuration Properties->Build
在右邊的視窗,選擇 Treat Warnings As Errors,將這個屬性設成 false 就可以了
讀取 XML 檔案
Ori.xml 程式碼:
-------------------------------------------------
<Root>
<Book>
<BookID>1</BookID>
<BookName>Good More</BookName>
<BookPrice>38</BookPrice>
<BookSale>40</BookSale>
</Book>
<Book>
<BookID>2</BookID>
<BookName>Good Better</BookName>
<BookPrice>55</BookPrice>
<BookSale>60</BookSale>
</Book>
<Book>
<BookID>3</BookID>
<BookName>Good Peace</BookName>
<BookPrice>25</BookPrice>
<BookSale>30</BookSale>
</Book>
</Root>
讀取 XML 的範例:
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
DataSet ds=null;
string xmlFilename=null;
if(!IsPostBack)
{
try
{
xmlFilename=Server.MapPath(".")+"\\ori.xml";
ds=new DataSet();
ds.ReadXml(xmlFilename);
DataGrid1.DataSource=ds.Tables["Book"];
DataGrid1.DataBind();
}
catch
{
}
finally
{
if(ds!=null)
ds.Dispose();
}
}
}
操作 Repeater 內的控制項
private void rpPollution_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
if (e.Item.ItemIndex < 0)
{
return;
}
CertificatedLetter cl = new CertificatedLetter(artcDB, artcCmd);
Control ctl = null;
double weight = 0.0;
ctl = e.Item.FindControl("btnDelete");
if (ctl != null)
{
Button btnDelete = (Button)ctl;
btnDelete.Attributes["PollutionId"] = Guid.NewGuid().ToString();
}
ctl = e.Item.FindControl("btnCopy");
if (ctl != null)
{
Button btnCopy = (Button)ctl;
btnCopy.Attributes["PollutionId"] = Guid.NewGuid().ToString();
}
}
如果要找 DataGrid 裡面的每一項, 就用 foreach(DataGridItem it in myGrid.Items)
如果要找 Repeater 裡面的每一項, 就用 foreach(RepeaterItem it in myRepeater.Items)
如果要找 DataView 裡面的每一項, 就用 foreach(DataRowView it in myDataView)
讓 DataGrid 跨欄的方法
<table id="table1" cellSpacing="0" rules="all" border="1" <tr>
<tr>
<td align="middle" rowSpan="2">書籍編號</td>
<th rowSpan="2">書籍名稱</th>
<th colSpan="2">定價機制</th>
</tr>
<tr>
<th>進價成本</th>
<th>銷售價格</th>
</tr>
<tr>
<td>1</td>
<td>Good More</td>
<td>38</td>
<td>40</td>
</tr>
<tr>
<td>2</td>
<td>Good Better</td>
<td>55</td>
<td>60</td>
</tr>
<tr>
<td>3</td>
<td>Good Peace</td>
<td>25</td>
<td>30</td>
</tr>
</table>
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType==ListItemType.Header)
{
TableCellCollection tcl=e.Item.Cells;
tcl.Clear();
tcl.Add(new TableCell());
tcl[0].Attributes["align"]="center";
tcl[0].RowSpan=2;
tcl[0].Text="書籍編號";
tcl.Add(new TableHeaderCell());
tcl[1].RowSpan=2;
tcl[1].Text="書籍名稱";
tcl.Add(new TableHeaderCell());
tcl[2].ColumnSpan=2;
tcl[2].Text="定價機制</th></tr><tr><th>進價成本</th><th>銷售價格";
}
}
Crystal Report 的列印
為了能讓user在他的電腦上列印,所以才會需要將列印文件轉換成 word、或 pdf 檔。
Server Control生命週期
自訂浮點數
如:
double dvalue=12.12345;
string strtest=dvalue.ToString(("f2",null); // strtest -> 12.12 (小數第二位)
double aa1=double.Parse(dvalue.ToString("f2",null)); // 將string 轉會為 double
日期格式
將該欄位的Data formatting expression設定為{0:yyyy/MM/dd}即可。相關其他格式請參考 hana 的「ASP.NET string.Format 格式參數」。
如果不是在DataGrid,而是一般欄位,那我們可以將日期轉成DateTime 類別,再用DateTime.ToString(string format)去轉換。
如:
DateTime dDate=DateTime.Parse("2004/1/1");
Somefield.Text=dDate.ToString("yyyy/MM/dd");
這樣,就可以順利轉換成功了。
控制項的 ClientID
下面範例介紹列出所有控制項ID
void Page_Load(object sender,EventArgs e)
{
Response.Write("Control_ClientID Sample");
// Get the list of all controls.
IEnumerator myEnumerator = Controls.GetEnumerator();
Response.Write("Enumerating Controls Collection");
while(myEnumerator.MoveNext())
{
Control myControl = (Control) myEnumerator.Current;
// Display the ClientID property
Response.Write("The ClientID property of Control : " + myControl.ClientID);
}
}
.net 版本問題
aspnet_regiis -i
aspnet regiis -r
如果想要讓不同版本共存,那可以採用下面方法:
假希望讓某個 RUN .net 1.0專案共存於 .net 1.1 的機器上,可以在 C:\windows\Microsoft.Net\Framework\v1.0.3705下面執行
Aspnet_regiis.exe -s W3SVC/1/ROOT/WebApplication1
WebApplication1 是我們專案的目錄
-s 代表讓整個目錄包含子資料夾都用 .net 1.0
-sn 則是代表只有主目錄採用 1.0 而子目錄則採用 預設的
javascript關閉視窗
<input type=button value=關閉視窗 onclick="window.opener='meizz';window.close()">
如果我直接下window.close()會出現警告訊息: "網頁正在試圖關閉視窗,是否關閉"
改用上面語法後就不會了。
使用 thread
// Global.asax.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using System.Threading;
namespace test
{
/// <summary>
/// Summary description for Global.
/// </summary>
public class Global : System.Web.HttpApplication
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
//記錄 thread 每次會去設定的變數
public static string strKeep;
//宣告我們所要產生的 thread
public static Thread checkThread;
//宣告讓 thread 等待的時間
static TimeSpan waitTime = new TimeSpan(0, 0, 10);//hh,mm,ss
public Global()
{
InitializeComponent();
}
protected void Application_Start(Object sender, EventArgs e)
{r>
//start a thread to do AddKeep( ) method
ThreadStart threadDelegate = new ThreadStart(AddKeep);
checkThread = new Thread(threadDelegate);
checkThread.IsBackground = true;
checkThread.Start();
}
protected void Session_Start(Object sender, EventArgs e)
{
if(!checkThread.IsAlive)
{
ThreadStart threadDelegate = new ThreadStart(AddKeep);
checkThread = new Thread(threadDelegate);
checkThread.IsBackground = true;
checkThread.Start();
}
}
protected void Application_BeginRequest(Object sender, EventArgs e)
{
}
protected void Application_EndRequest(Object sender, EventArgs e)
{
}
protected void Application_AuthenticateRequest(Object sender, EventArgs
e)
{
}
protected void Application_Error(Object sender, EventArgs e)
{
}
protected void Session_End(Object sender, EventArgs e)
{
}
protected void Application_End(Object sender, EventArgs e)
{r>
}
public static void AddKeep()
{
while(true)
{
try
{
strKeep=string.Format("{0}",int.Parse(strKeep)+1);
}
catch
{
strKeep="0";
}
Thread.Sleep( waitTime );
}
}
#region Web Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
}
#endregion
}br>
}
TextBox在MultiLine的狀況下,設定最大輸入字元
// 寫在 .ASPX 的 javascript宣告裡面
function CheckLength(src,args) { if(document.activeElement.id == "btnOK" ) { var getElement = document.getElementById("txbAbstractShort").value; if(getElement.length > 255) { args.IsValid=false; } } return args.IsValid; } <asp:customvalidator clientvalidationfunction="CheckLength" controltovalidate="txbAbstractShort" display="Dynamic" errormessage="上首頁摘要最大字元長度不可超過256" id="custCheckLength" runat="server"> </asp:customvalidator>
補充:20110706
另外提供 jQuery 的寫法,比較起來,似乎更精簡了。
<script> $(function () { $("textarea[id*=tbx_changereason]").blur(function () { if ($(this).val().length > 255) { alert('最大字元長度不可超過255'); $("textarea[id*=tbx_changereason]").val($(this).val().substring(0, 255)); } }); }); </script>
使用時,只需要將 tbx_changereason 修改成自己的控制項 id ,而 出現3次的數字255,則是允許最大的輸入長度。
參考:
01:TextBox 在 MultiLine 模式時無法使用 MaxLength 屬性
02:textbox的属性设置成TextMode="MultiLine" 后maxlength就没起作用了??怎么办?
03:textbox的textmode取為multiline時,其maxlength不起作用 解決方法
使用 StreamReader 的注意事項
抓aspx 檔案內某個控制項的值
.aspx
<input type=text size=6 name="tbTB006"
value='<%#
DataBinder.Eval(Container.DataItem, "ERP_Spec") %>'>
.cs
Request.Form.GetValues("tbTB006")[i].ToString();
如果 tbTB006 存在於DataList或是DataRepeat中,可透過 [i]來指定要存取字串陣列中的哪一項資料
注意,value 的值一定要設,這是用來區別的判斷項目
Call by reference ( ref )
Example
// cs_ref.cs
using System;
public class MyClass
{
public static void TestRef(ref char i)
{
// The value of i will be changed in the calling method
i = 'b';
}
public static void TestNoRef(char i)
{
// The value of i will be unchanged in the calling method
i = 'c';
}
// This method passes a variable as a ref parameter; the value of the
// variable is changed after control passes back to this method.
// The same variable is passed as a value parameter; the value of the
// variable is unchanged after control is passed back to this method.
public static void Main()
{
char i = 'a'; // variable must be initialized
TestRef(ref i); // the arg must be passed as ref
Console.WriteLine(i);
TestNoRef(i);
Console.WriteLine(i);
}
}
Output
b
b
INFO: ASP.NET Code-Behind Model Overview
Code Behind就是所謂的代碼分離,自從Microsoft公司推出了ASP.NET以後,Code Behind就是一個熱門的話題。在一般的ASP.NET檔中,Code Behind主要是用二個檔來創建一個ASP.NET的頁面,其中一個是設計檔,一般以.aspx或者.ascx做為副檔名,而另外一個是程式碼檔,一般以.vb或者.cs做為副檔名,其程式設計語言主要是VB.Net或者是C#。
用過ASP編過程式的人都知道,ASP程式是把介面設計和程式設計混合在一起的。因此當程式設計人員要修改應用程式介面佈局的時候,就往往需要更改大量與介面無關的代碼,對於一個小程式,工作量不是很大,如果對於代碼量很大的程式,就是一項工作量不小的事情。而Code Behind把介面設計代碼和程式設計代碼以不同的檔分開,對於代碼的重複使用,程式的調試和維護都是革命性的。還有一點是,當你發佈你的網站的時候,你就可以利用這種技術來有效的保護你的代碼。這對於程式的安全性是一個提高。
Asp.net轉Excel中文亂碼問題
要將CrystalReport資料轉成Excel時,轉出後的中文字會變成亂碼。下面為先前會造成亂碼的程式:
Response.Clear();
Response.AddHeader( "Content-Disposition",
"attachment;filename=VisitReport.xls" );
Response.ContentType = "application/vnd.ms-excel";
Response.Write("<html><body>");
ResponseReportOnly(dgReport );
Response.Write("</body></html>");
Response.End();
其實,只要多加一行,就可以解決
Response.Clear();
Response.AddHeader( "Content-Disposition",
"attachment;filename=VisitReport.xls" );
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding=System.Text.Encoding.GetEncoding("Big5");
Response.Write("<html><body>");
ResponseReportOnly(dgReport );
Response.Write("</body></html>");
Response.End();
另一個解法,(比較好): source ~ http://www.neo.com.tw/archives/000243.html
因為從 Windows 2000 之後的作業系統在檔案處理採用Unicode ,所以 .Net 的檔案處理也是預設為 Unicode
,但是文字檔大多還是以 ANSI 儲存,而且裡面的編碼還是用 Big5,所以才會造成中文亂碼的狀況,也就是在讀取檔案的時候就要指定編碼的樣式。
本來會造成亂碼的語法如下:
Dim reader As StreamReader =
New StreamReader(FileName)
但是問題來了,System.Text.Encoding 裡面一堆,ASCII、UTF-8 等等的,要選哪個好?
其實很簡單,用 System.Text.Encoding.Default 告訴 StreamReader 目前作業系統的編碼即可。
[VB .Net] 的寫法
Dim reader As StreamReader = _
New StreamReader(FileName, System.Text.Encoding.Default)
[C# .Net] 的寫法
StreamReader reader = _
New StreamReader(FileName, System.Text.Encoding.Default)
Session State的探討
讓DropDownList元件自動根據內容長度增加寬度
系統登錄檔的讀寫
寫入登錄檔
RegistryKey key=Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("ADONETDB");
key.SetValue("cnstr",text1.Text);
讀取登入檔
RegistryKey key=Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("ADONETDB");
text1.Text=key.GetValue("cnstr").ToString();
擴權的用法
http://MyProject/call.aspx?access.aspx
這樣就會先去執行access.aspx去存取Server上的資料,待處理完後將結果回傳給call.aspx
sln絕對路徑修改
為了將每個project的路徑都改為相對路徑,必須去修改.sln這個檔案。我的作法是開啟Visual Source Safe,將 .sln檔案 check out,再用UltraEdit去修改,改完之後再將該檔案check in。
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChipSoft.Data.DataSourceInfo", "D:\program\Nano\ChipSoft.Data.DataSourceInfo\ChipSoft.Data.DataSourceInfo.csproj", "{3AFF2543-9DE2-47CB-8F35-4F7AB560A3B1}"
改成 ->
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChipSoft.Data.DataSourceInfo", "ChipSoft.Data.DataSourceInfo\ChipSoft.Data.DataSourceInfo.csproj", "{3AFF2543-9DE2-47CB-8F35-4F7AB560A3B1}"
SccProjectUniqueName2 = D:\\program\\Nano\\ChipSoft.Data.DataSourceInfo\\ChipSoft.Data.DataSourceInfo.csproj
改成 ->SccProjectUniqueName2 = ChipSoft.Data.DataSourceInfo\\ChipSoft.Data.DataSourceInfo.csproj
SccLocalPath2 = D:\\program\\Nano
改成
SccLocalPath2 = .
Add Reference
JavaScript 注意事項
讓 hidden欄位經過postback後還能保留
把字串轉型為enum型態
enum DayOfWeek:byte {Mon=1,Tue=2};
class EnumExample
{
public static void Main()
{
DayOfWeek day=(DayOfWeek)(byte)1;
Console.WriteLine(day);
Console.WriteLine( Enum.Parse(typeof(DayOfWeek),"Tue") );
}
}
開啟檔案
Response.Clear();
Response.AddHeader( "Content-Disposition", "attachment;filename=woman.mp3" );
Response.WriteFile("d:\\woman.mp3");
Response.End();
JavaScript Includes
雖然你可以將 javascript 直接放在目前正在開發的網頁裡,
但是這不會是比較好的方式。接下來介紹的是將 javascript
統一放到一個頁面,這樣至少會有兩個好處:
1.透過更新一個檔案,就可以將所有的頁面同步更新
2.可以將程式瘦身。每一個頁面不需要重新再下載
javascript。
把 JavaScript嵌入的語法:
<script src="../quirksmode.js"></script>
避免出錯的方式:
*不要將 <script> 標籤寫到要用來放 JavaScript 的檔案裡頭,
只需要在裡面放純的 JavaScript 程式碼即可。
javascript eval
透過這個功能,我們可以動態組出 javascript 語法,
最後再透過 eval( ) 去執行。
JavaScript return false
" return false; ",就會停止程式繼續執行下去。
而且在前端瀏覽器就會結束,不會執行到Server端。
所以,user 就不會感受到畫面會閃一下。
JavaScript 取出 radio 裡面所選擇的值
js example:
function show()
{
var s_result;
for( var i=0 ; i< document.all.rbl.length ; i++)
{
if(document.all.rbl[i].checked)
s_result=document.all.rbl[i].value;
}
alert(s_result);
}
JavaScript 執行複製、貼上、剪下功能
透過 javascrip 去實作瀏覽器的複製、貼上、剪下 功能。目前介紹的語法,適用於 IE 5.0 以上。
複製:將某個 textbox 或 textarea 的內容複製。
<script language="JavaScript" type="text/javascript">
<!--
function addMyClipboard()
{
var r=document.Form1.txtClipboard.createTextRange();
r.execCommand("Copy");
}
//-->
</script>
其中的 txtClipboard 是畫面上的一個控制項。
<INPUT TYPE="text" id="txtClipboard">
除了使用 text 之外,也可適用於 textarea
當然,為了提高程式再利用率,可以將上述的程式更進一步寫成函式。
function addMyClipboard( obj)
{
var r=obj.createTextRange();
r.execCommand("Copy");
}
貼上:
首先,必須先將游標移到所要貼上的文字物件上,
我以一段 javascript 語法來說明:
document.Form1.TextBox1.focus();
document.execCommand("Paste");
剪下:
則將程式修改如下:
function cutMyClipboard(obj)
{
var r=obj.createTextRange();
r.execCommand("Cut");
}
參考:
作者: jeffwang (---.adsl.seed.net.tw)
日期: 07-24-05 21:33
剛剛在別的網頁(http://www2.cyut.edu.tw/~s9154610/jscript.html)
找到可以將text裡面的內容複製到剪貼簿裏面
<script language="JavaScript" type="text/javascript"> <!--
function addClipboard2(obj) {
var r = obj.createTextRange() ;
r.execCommand("Copy") ;
}
//--> </script>
<input type="text" id="address" onClick="addClipboard2(this)">
不過這是需要需要按enter鍵
是否有方法是不用按enter鍵
而可以將一個變數var裡面的字串存入剪貼簿中
因為我已經可以將網頁上選取的文字儲存起來到變數中
而我想將這個變數中的字串存到剪貼簿中
不用透過事件觸發 例如滑鼠點兩下、按enter鍵...
function getSelectionHTML()
{
var h = document.selection.createRange().htmlText;
document.jeff.T1.value=h;
return document.selection.createRange().htmlText;
}
請多指教
謝謝
將Table整個Row隱藏
<Table>
<TR>
<TD></TD>
<TD></TD>
</TR>
</TABLE>
改成:
<Table>
<TR id="RowName" runat="server">
<TD></TD>
<TD></TD>
</TR>
</TABLE>
當我們在Design部分做完這些修改後,於 .cs檔中會多出一行於開頭附近:
protected System.Web.UI.HtmlControls.HtmlTableRow RowName;
接著,我們就可以在 .cs中透過 RowName來控制該 <Row>的 Visible
避免PostBack後,密碼欄位消失
如果畫面上有一個存放密碼的欄位,當其他控制項觸發PostBack之後,會造成原先的密碼欄位被清空。為了保留原先的密碼設定值
,可以採用下面方法:
private void Page_Load(object sender, System.EventArgs e)
{
TextBox1.Attributes.Add("value", TextBox1.Text);
}
Empty Page
ex : String scriptString = @"
<script language="JavaScript">
<!-- begin
alert('日期格式不正確') ;
//end -->
</script>
";
this.RegisterStartupScript("s",scriptString);
ViewState
在 .Net 的 WebControl,如果不是輸入控制項,則預設都會自動維護狀態資訊(ViewState).在Call Back環境下,這些ViewState可以為我們保留重要資訊.當然,使用ViewState會讓系統效能變差,如要關閉這項功能,可以將屬性 EnableViewState 設為 False 即可.
如果不想用到 UI來紀錄資訊,也可以在 .cs中直接使用 ViewState 這個指令,他會像使用 Session一樣,為我們保留所需要的資訊. ex: ViewState["aa"]="dddddd"
dll version problem
當遇到dll檔版本問題時,先將產生dll檔專案的bin與obj子目錄下的檔案殺掉.接著在 User Web Control 上移除原有的元件,再新增元件,即可解決版本衝突所造成的問題
此外,還有個問題,如果將產生dll的專案與我們目前專案整合在同一個solution下面,每當我們對solution重新編譯時,他除了將我們目前的專案重新編譯外,還會將dll專案重新編譯過一次.如此,就可能會讓dll檔的版本序號改變.解決方法,是將dll專案上的AssembltInfo.cs的
[assembly: AssemblyVersion("1.0.*")]
改成 [assembly: AssemblyVersion("1.0.0")]
將他的序號固定住就可以,不過,還有一個比較好的方法
我們可以在 solution 的屬性中, 找到 Configuration Property, 把dll專案的 Build 選項取消掉,這樣每次在重件整個solution時,就不會將dll專案也一同重新編譯.
在 SQL 2000 實作 split 的功能
在 SQL 2000 裡並未提供類似 split 的含式,但目前已經知道 SQL 2005 開始內建這個函式了。
如果在不支援 split 的環境下卻仍要實作這功能,可以參考下面作法。
他是將 split 的功能註冊在 SQL 2000 的「使用者自訂函數」裡頭。如果你不想這麼做的話,當
然也可以將他抽離出來,獨自加到你自己的 SQL 語法裡。
CREATE FUNCTION split
(
@List nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Value nvarchar(100)
)
AS
BEGIN
While (Charindex(@SplitOn,@List)>0)
Begin
Insert Into @RtnValue (value)
Select
Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End
Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END
select * from split('hello,dd,ssss,ssx',',')
CASE
CASE 分為兩種格式:
- 簡單 CASE 函數會比較運算式與一組簡單運算式,以決定其結果。
- 搜尋 CASE 函數會評估一組布林運算式,以決定其結果。
兩種格式都支援選用的 ELSE 引數。
語法
簡單 CASE 函數:
CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END
搜尋 CASE 函數:
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END
引數
input_expression
是使用簡單 CASE 格式時評估的運算式。input_expression 是任何有效的 Microsoft® SQL Server™ 運算式。
WHEN when_expression
是使用簡單 CASE 格式時要比較 input_expression 的簡單運算式。when_expression 是任何有效的 SQL Server 運算式。input_expression 和各 when_expression 的資料型別必須相同,或者必須為隱含轉換。
n
是指出可用多重 WHEN when_expression THEN result_expression 子句或多重 WHEN Boolean_expression THEN result_expression 子句的替代符號 (placeholder)。
THEN result_expression
是 input_expression 等於 when_expression 評估為 TRUE 時,或 Boolean_expression 評估為 TRUE 時傳回的運算式。result expression 是任何有效的 SQL Server 運算式。
ELSE else_result_expression
是無任何比較運算評估為 TRUE 時傳回的運算式。如果忽略這個引數,且無任何比較運算評估為 TRUE,則 CASE 會傳回 NULL。else_result_expression 是任何有效的 SQL Server 運算式。else_result_expression 和任何 result_expression 的資料型別必須相同,或者必須為隱含轉換。
WHEN Boolean_expression
是使用搜尋 CASE 格式時評估的布林運算式。Boolean_expression 是任何有效的 Boolean 運算式。
結果型別
自 result_expressions 和選用的 else_result_expression 中的一組型別傳回最高優先權型別。
結果值
簡單 CASE 函數:
- 評估 input_expression,然後依指定次序評估各 WHEN 子句的 input_expression = when_expression。
- 傳回評估為 TRUE 的第一個 (input_expression = when_expression) 的 result_expression。
- 若無 input_expression = when_expression 評估為 TRUE,則在指定 ELSE 子句時,SQL Server 會傳回 else_result_expression;若未指定 ELSE 子句,則傳回 NULL 值。
搜尋 CASE 函數:
- 依指定次序評估各 WHEN 子句的 Boolean_expression。
- 傳回評估為 TRUE 的第一個 result_expression。
- 若無 Boolean_expression 評估為 TRUE,則在指定 ELSE 子句時,SQL Server 會傳回 else_result_expression;若未指定 ELSE 子句,則傳回 NULL 值。
範例
A. 使用具有簡單 CASE 函數的 SELECT 陳述式
在 SELECT 陳述式中,簡單 CASE 函數只能檢查等式,不可進行其他比較。這一範例使用 CASE 函數來改變書籍目錄的顯示方式,使它們更容易讓人瞭解。
USE pubs
GO
SELECT Category =
CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO
以下為結果集:
Category Shortened Title Price
------------------- ------------------------- --------------------------
Business You Can Combat Computer S 2.99
Business Cooking with Computers: S 11.95
Business The Busy Executive's Data 19.99
Business Straight Talk About Compu 19.99
avg
==========================
13.73
Category Shortened Title Price
------------------- ------------------------- --------------------------
Modern Cooking The Gourmet Microwave 2.99
Modern Cooking Silicon Valley Gastronomi 19.99
avg
==========================
11.49
Category Shortened Title Price
------------------- ------------------------- --------------------------
Popular Computing Secrets of Silicon Valley 20.00
Popular Computing But Is It User Friendly? 22.95
avg
==========================
21.48
Category Shortened Title Price
------------------- ------------------------- --------------------------
Psychology Life Without Fear 7.00
Psychology Emotional Security: A New 7.99
Psychology Is Anger the Enemy? 10.95
Psychology Prolonged Data Deprivatio 19.99
Psychology Computer Phobic AND Non-P 21.59
avg
==========================
13.50
Category Shortened Title Price
------------------- ------------------------- --------------------------
Traditional Cooking Fifty Years in Buckingham 11.95
Traditional Cooking Sushi, Anyone? 14.99
Traditional Cooking Onions, Leeks, and Garlic 20.95
avg
==========================
15.96
(21 row(s) affected)
B. 使用具有簡單和搜尋 CASE 函數的 SELECT 陳述式
在 SELECT 陳述式中,搜尋 CASE 函數允許根據比較值來取代結果集中的值。這一範例根據書籍的價格範圍以文字註解來顯示價格 (money 資料行)。
USE pubs
GO
SELECT 'Price Category' =
CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title'
WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO
以下為結果集:
Price Category Shortened Title
--------------------- --------------------
Not yet priced Net Etiquette
Not yet priced The Psychology of Co
Very Reasonable Title The Gourmet Microwav
Very Reasonable Title You Can Combat Compu
Very Reasonable Title Life Without Fear
Very Reasonable Title Emotional Security:
Coffee Table Title Is Anger the Enemy?
Coffee Table Title Cooking with Compute
Coffee Table Title Fifty Years in Bucki
Coffee Table Title Sushi, Anyone?
Coffee Table Title Prolonged Data Depri
Coffee Table Title Silicon Valley Gastr
Coffee Table Title Straight Talk About
Coffee Table Title The Busy Executive's
Expensive book! Secrets of Silicon V
Expensive book! Onions, Leeks, and G
Expensive book! Computer Phobic And
Expensive book! But Is It User Frien
(18 row(s) affected)
C. 使用具有 SUBSTRING 和 SELECT 的 CASE
這一範例使用 CASE 和 THEN 來產生作者清單、書籍識別碼和各作者已經寫過的書籍型別。
USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ' '+
RTRIM(a.au_lname) + ' '), 1, 25) AS Name, a.au_id, ta.title_id,
Type =
CASE
WHEN SUBSTRING(ta.title_id, 1, 2) = 'BU' THEN 'Business'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'MC' THEN 'Modern Cooking'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'PC' THEN 'Popular Computing'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'PS' THEN 'Psychology'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'TC' THEN 'Traditional Cooking'
END
FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id
以下為結果集:
Name au_id title_id Type
------------------------- ----------- -------- -------------------
Johnson White 172-32-1176 PS3333 Psychology
Marjorie Green 213-46-8915 BU1032 Business
Marjorie Green 213-46-8915 BU2075 Business
Cheryl Carson 238-95-7766 PC1035 Popular Computing
Michael O'Leary 267-41-2394 BU1111 Business
Michael O'Leary 267-41-2394 TC7777 Traditional Cooking
Dean Straight 274-80-9391 BU7832 Business
Abraham Bennet 409-56-7008 BU1032 Business
Ann Dull 427-17-2319 PC8888 Popular Computing
Burt Gringlesby 472-27-2349 TC7777 Traditional Cooking
Charlene Locksley 486-29-1786 PC9999 Popular Computing
Charlene Locksley 486-29-1786 PS7777 Psychology
Reginald Blotchet-Halls 648-92-1872 TC4203 Traditional Cooking
Akiko Yokomoto 672-71-3249 TC7777 Traditional Cooking
Innes del Castillo 712-45-1867 MC2222 Modern Cooking
Michel DeFrance 722-51-5454 MC3021 Modern Cooking
Stearns MacFeather 724-80-9391 BU1111 Business
Stearns MacFeather 724-80-9391 PS1372 Psychology
Livia Karsen 756-30-7391 PS1372 Psychology
Sylvia Panteley 807-91-6654 TC3218 Traditional Cooking
Sheryl Hunter 846-92-7186 PC8888 Popular Computing
Anne Ringer 899-46-2035 MC3021 Modern Cooking
Anne Ringer 899-46-2035 PS2091 Psychology
Albert Ringer 998-72-3567 PS2091 Psychology
Albert Ringer 998-72-3567 PS2106 Psychology
(25 row(s) affected)