2009年8月31日 星期一

將物件存放在Session中會造成StateServer錯誤

無法序列化工作階段狀態。在 'StateServer' 和 'SQLServer' 模式中,ASP.NET 將序列化工作階段狀態物件,因此不允許無法序列化的物件或 MarshalByRef 物件。在 'Custom' 模式中,自訂工作階段狀態存放區執行類似的序列化作業時,也會有同樣的限制。
描述: 在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。
例外詳細資訊: System.Web.HttpException: 無法序列化工作階段狀態。在 'StateServer' 和 'SQLServer' 模式中,ASP.NET 將序列化工作階段狀態物件,因此不允許無法序列化的物件或 MarshalByRef 物件。在 'Custom' 模式中,自訂工作階段狀態存放區執行類似的序列化作業時,也會有同樣的限制。

原始程式錯誤:
在執行目前 Web 要求期間,產生未處理的例外狀況。如需有關例外狀況來源與位置的資訊,可以使用下列的例外狀況堆疊追蹤取得。
堆疊追蹤:
[HttpException (0x80004005): 無法序列化工作階段狀態。在 'StateServer' 和 'SQLServer' 模式中,ASP.NET 將序列化工作階段狀態物件,因此不允許無法序列化的物件或 MarshalByRef 物件。在 'Custom' 模式中,自訂工作階段狀態存放區執行類似的序列化作業時,也會有同樣的限制。]
System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1602
System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object value, BinaryWriter writer) +34
System.Web.SessionState.SessionStateIte......

有把物件放到Session中的話那就請改寫
因為使用State Server的話
是不可以將非序列化的物件存放在Session中
不要浪費時間找解決方式
無序列化的資料要使用State Server無解
應該著重於怎麼處理程式流程讓程式更有效率...
不要太依靠Session
把大量的物件、資料存放在Session造成Server沉重的負擔


轉http://www.evanstour.com/writing_detail.aspx?sq=122

ASP.NET StateServer 工作階段狀態模式

StateServer 模式會將工作階段狀態存放在處理序中 (稱為 ASP.NET 狀態服務),這個處理序則與 ASP.NET 背景工作處理序或 IIS 應用程式集區有所不同。使用此模式可以確保工作階段狀態在 Web 應用程式重新啟動時會保存下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。

若要使用 StateServer 模式,您必須先確定 ASP.NET 狀態服務正在做為工作階段存放區的伺服器上執行。已安裝 ASP.NET 和 .NET Framework 時,ASP.NET 狀態服務會安裝為服務。ASP.NET 狀態服務會安裝在下列位置:
systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe

若要將 ASP.NET 應用程式設定為使用 StateServer 模式,請在應用程式的 Web.config 檔中執行下列動作:
將 sessionState 項目的 mode 屬性設為 StateServer。
將 stateConnectionString 屬性設為 tcpip=serverName:42424。

依序設定步驟:
(1) 到C:\windows\Microsoft.NET\Framework\v2.0.50727這資料夾執行aspnet_state.exe
(2) 在服務中,會出現一個"ASP.NET 狀態服務"的服務項目,但是未啟用,先別急著啟用
(3) 執行regedit,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters這個目錄
(4) 設定AllowRemoteConnection為1
(5) 設定Port為要執行的Port Number
(6) 啟動"ASP.NET 狀態服務"的服務
(7) 到web.config中,將sessionState的屬性改為
mode="StateServer" stateConnectionString="tcpip=:"
(8) 重新啟動IIS即可

另外微軟MSDN也提供了使用SQL Server來存放Session的解決方案
http://support.microsoft.com/kb/317604

2009年8月26日 星期三

『語法』Embed 講解教學

Embed語法

首先,當然是先準備好你的影音檔啦!! (如WMA、WMV、ASF、MPG、AVI)
然後,在用下列語法貼上即可。
<embed src=檔案位址>

尺寸大小:
通常天空旁邊的連結框有限制寬度(大約是180 px),
所以說,我們必需在加上寬度,假如自已還要調高度的話,
那麼,語法就變成這樣了。
<embed src=檔案位址 width=寬度 height=高度>

不自動播放:
如果說,我們不想讓音樂自動播放的話,那麼即可在語法加上參數 autostart。
<embed src=檔案位址 autostart=false>

循環播放:
假如,音樂很好聽的話,我們想循環播放的話,那麼即可在語法加上參數 loop=true 。
<embed src=檔案位址 loop=true>

隱藏面版:
你想偷偷隱藏面版的話,就可以加上參數 hidden=true 。
<embed src=檔案位址 hidden=true>

另外,假如你是使用Firefox瀏覽器播放的話呢,那麼就要修一下語法了。
wma是沒有問題的。有問題的是下面兩個:

Mp3檔 <embed src=檔案位址 type=video/x-ms-asf width=寬度 height=高度 >
Rm檔 <embed src=檔案位址 type=audio/x-pn-realaudio-plugin width=寬度 height=高度 >

在語法裡面如果沒有寫任何關於音量大小的設定,播放時預設的音量大小如右上圖,大約是50%的音量。
如果希望一開始播放就以100%的最大音量播放,可以加入這句參數 Volume=0,請注意,是等於「零」,不是英文字母的大寫 O。播放時的情況如右下圖,語法範例如下:
<embed src=檔案位址 Volume=0>

只要加進這句參數 ShowStatusBar=true,播放Bar下方便會多出一行資訊視窗,如右圖。語法範例如下:
<embed src=檔案位址 ShowStatusBar=true>
這個參數是非常實用的,因為這行資訊視窗會秀出很多有用資訊如下載進度、播放進度、曲名、藝人名稱.......等等。
秀出下載進度、播放進度尤其體貼,可以讓瀏覽者大概掌握到底要等多久才會開始播放,不用癡癡望著螢幕像個傻子一樣。我個人建議用embed語法播放影音檔時最好都加上這句參數。

關於防右鍵:
各位可以試試在播放Bar上按右鍵看內容,便可看到檔案的真實位址!或是在播放影片時也可以在畫面上按右鍵看內容,也可看到檔案真實位址。加上這句參數 EnableContextMenu=false 便可防止在播放Bar或影片畫面上按右鍵。語法範例如下:
<embed src=檔案位址 EnableContextMenu=false>
可是這語法有一點點無謂,因為光是在播放面版上防堵意義不大,還要搭配整個頁面的防堵才能收到效果。所以,自己看著辦吧。

2009年8月25日 星期二

在Windows 2003上安裝Windows LIve Messenger 2009

一早忽然MSN8.1無法登入,工作平台是Windows 2003的我紛紛發出哀嚎: MSN Messenger 8.1版在登入時出現已有新版軟體的警示,不裝新版不給登入;選擇安裝新版又會因不支援Windows 2003版本,不給安裝... 這,這不是要逼人走上絕路嗎?

發現原本在Windows Live Messenger 2009的安裝檔結構改了,找不到WindowLiveInstaller\MsiSources目錄。

在一台Windows 7 VM上裝妥Live Messenger 2009,但對於檔案改放到哪裡毫無頭緒。摸索了一下,無意中發現寶藏: C:\ProgramData\Microsoft\WLSetup\Logs下有個Log檔,從安裝歷程中挖出了msi檔的儲放位置--C:\Program Files\Common Files\Windows Live\.cache

另外,由Log發現Live Messenger 2009不像先前只要一個msi就搞定,而是拆出多個安裝模組,依序安裝:

dw20shared.msi (沒有找到該檔案)
crt.msi
contacts.msi
wlc.msi
richupload.msi
wllogin.msi
wlxsuite.msi
choiceguard.msi
messenger.msi

由.cache的各子目錄取出這些檔案,在一台Windows 2003上按照順序逐一裝好,就可以用了

如何避免使用者在特定網頁表單在未經送出時意外離開

「使用者」想「離開網頁」,基於「使用者最大」的原則,瀏覽器不可能真正擋住使用者的去路,所以你的 JavaScript 是不可能「絕對阻擋」網頁離開,你只能「提醒」使用者離開此網頁,所以正確的寫法是在 function 中 return 一段字串訊息即可,如下範例:
window.document.body.onbeforeunload = function()
{
return '您尚未將編輯過的表單資料送出,請問您確定要離開網頁嗎?';
}

當你在網頁中按下 F5 重新整理或點選其他連結試圖離開網頁時,就會先出現提醒訊息

最後,還有個重點觀念,也就是當 onbeforeunload 事件被觸發的同時,如果也有其他事件被觸發的話,在其他事件中不能再修改任何 DOM 物件,因為物件處於正在卸載的狀態,所以當你在其他事件中要執行類似的修改動作,就會影發「未指定的錯誤」的錯誤訊息

所以在撰寫時必須特別注意這個潛在可能發生的錯誤。

當你要進行表單送出時總不能還出現這個離開網頁的提示框吧!所以你還必須在表單的 Submit 按鈕特別加上一段 JavaScript 將 事件取消。
<input type="submit" value="送出" 
onclick="window.document.body.onbeforeunload=null;return true;" />


參考 http://blog.miniasp.com/post/2009/08/How-to-avoid-page-reload-or-redirect-by-incident.aspx

電子報網頁版型設計建議

由於 Outlook 2007 的一個嚴重缺失,又讓電子報設計的創意再更少一些了,由於能用的CSS屬性實在不多,光是「背景圖」就很惱人了,設計師只能用簡單的背景色彩鋪陳網頁的版面,至於許多創意的背景圖設計就只能用單張圖片顯示了。

以下是依我個人經驗對設計的建議:

因為現在許多人都使用像 Gmail, Hotmail 等 WebMail 的方式收信,所以郵件中若是有使用太多會影響 WebMail 原有版面的部分應該全部都會被刪除,導致版型亂七八糟的。

盡量不要用 CSS 來排版,用傳統的 TABLE 排版方式是比較安全的作法!
注意:DIV標籤在 Outlook 2007 中「竟然不支援 CSS 中的 width 這個屬性」,所以你用 DIV 包網頁是沒用的!

版型最外層最好用一個 TABLE 包裹住整個網頁,並設定固定的寬度,建議寬度為 700px 以內。

如果網頁的頁首部分會用到漂亮而複雜的底圖,建議將整塊頁首都做成一張圖片,缺點是這裡就無法再貼上什麼動態的文字了。

不要在電子報的網頁中放入「表單」,因為 Outlook 2007 不支援,且在 Outlook 2003 中使用表單也無法用快速鍵(如用 TAB 切換欄位),實在不方便又不實用。有很多人會在電子報中嵌入「問卷」實在不夠明智,都不知道填寫的人很痛苦,不小心按下空白鍵,Outlook會自動跳到下一封信去了,再回來的時候所有輸入的東西都消失了。=.=''

文字與圖片的地方盡量切乾淨,版面設計的時候就不要設計「疊在一起的樣子」。

如果要將電子報的版型加上圖片的外框,就用TABLE設計九宮格把圖放在四邊的 TD 裡,但如果電子報的長度不固定的話,建議不用做這樣的設計。

盡量少用 GIF 動畫,因為在 Outlook 2007 中看不到這些動畫。

不要用 PNG 圖檔做透明背景。

重點就是
不支援背景圖像(HTML 或CSS)
糟糕的背景色支援:個別div或table的背景顏色可正常顯示,巢狀結構的div或table則會消失。
不支援Flash及Plugins
不支援CSS、浮游物件
不支援列表清單替代圖示
不支援CSS 定位
不支援動態GIF

另外,以下是一些「非常強烈建議不要用」的設計方式:
1.不要使用任何 JavaScript 或任何像 onclick, onkeypress, onmouseover 等等的事件(event)!
2.不要在電子報網頁中嵌入 Flash 動畫。
3.不要用 IFRAME 嵌入其他網頁。
4.若要製作圖框,建議切圖將文字包起來,不要使用背景圖的方式
5.另一種做法是用背景色來取代背景圖框架的做法

參考http://blog.miniasp.com/post/2007/11/Recommandation-on-e-Newsletter-Template-design.aspx

SQL 找出資料庫的資料表,資料表的欄位名,資料表的PK欄位

--找出資料庫裡所有的資料表
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME

--依資料表名稱找出所有欄位資訊
SELECT COLUMN_NAME,ORDINAL_POSITION,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'blessing'

--依資料表名稱找出此表的PK欄位
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'blessing'

2009年8月21日 星期五

C# 匯出WORD檔案

Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=test.doc");//word檔名
Response.ContentType = "application/vnd.ms-word";
Response.Charset = "";
System.IO.StringWriter sw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(sw);
DataGrid dg = new DataGrid();
dg.DataSource = this.SqlDataSource1.Select(DataSourceSelectArguments.Empty);
dg.DataBind();
dg.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();

MSSQL 今天星期幾

select datepart(dw, '20090820')

select CASE datepart(dw, '20090820')
WHEN '1' THEN '星期日'
WHEN '2' THEN '星期一'
WHEN '3' THEN '星期二'
WHEN '4' THEN '星期三'
WHEN '5' THEN '星期四'
WHEN '6' THEN '星期五'
WHEN '7' THEN '星期六' END

相關網站 http://javascriptnote.blogspot.com/2009/07/ms-sql.html

2009年8月17日 星期一

C# 字串函數

取子字串
語法:字串變數.Substring(左起始位數 , 取幾位)
範例:string s1 = str.Substring(0,2);

右取字串
很可惜的是C#如同java , C , C++ 一樣,並未提供太多的字串函數可以用,所以想右取字串,
只好自己想辦法囉,以下提供一個小方法,運用數學邏輯方式來做
語法:字串變數.Substring(全部字串長度 - 應取字串長度 , 應取字串長度)
範例:
想取一個長度9位(不足的左補0)的字串,一般轉檔常會有這樣的需求
string s1 = " 3000 ";   
if (s1 .Length < 9)
s1 = ("000000000" + s1 ).Substring(("000000000" + s1 ).Length-9, 9);

字元串相加
語法:System.Text.StringBuilder sb = new System.Text.StringBuilder()
範例:System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("a");
sb.Append("b");
sb.Append("c");

註:大量字串相加時,效能比用 " + " 的方式來的好

Javascript刷新頁面的幾種方法

Javascript刷新頁面的幾種方法
1 history.go(0)
2 location.reload()
3 location=location
4 location.assign(location)
5 document.execCommand('Refresh')
6 window.navigate(location)
7 location.replace(location)
8 document.URL=location.href

自動刷新頁面的方法:
1.頁面自動刷新:把如下代碼加入<head>區域中
<meta http-equiv="refresh" content="20">
其中20指每隔20秒刷新一次頁面.

2.頁面自動跳轉:把如下代碼加入<head>區域中
<meta http-equiv="refresh" content="20;url=http://www.wyxg.com">
其中20指隔20秒後跳轉到http://www.wyxg.com頁面

3.頁面自動刷新js版
<script language="JavaScript">
function myrefresh()
{
window.location.reload();
}
setTimeout('myrefresh()',1000); //指定1秒刷新一次
</script>

ASP.NET如何輸出刷新父窗口腳本語句
this.response.write("<script>opener.location.reload();</script>");

this.response.write("<script>opener.window.location.href = opener.window.location.href;</script>");

Response.Write("<script language=javascript>opener.window.navigate(''你要刷新的頁.asp'');</script>")

JS刷新框架的腳本語句
//如何刷新包含該框架的頁面用
<script language=JavaScript>
parent.location.reload();
</script>

//子窗口刷新父窗口
<script language=JavaScript>
self.opener.location.reload();
</script>
( 或 <a href="javascript:opener.location.reload()">刷新</a> )

//如何刷新另一個框架的頁面用
<script language=JavaScript>
parent.另一FrameID.location.reload();
</script>

如果想關閉窗口時刷新或者想開窗時刷新的話,在<body>中調用以下語句即可。

<body onload="opener.location.reload()"> 開窗時刷新
<body onUnload="opener.location.reload()"> 關閉時刷新

<script language="javascript">
window.opener.document.location.reload()
</script>

指定控制項TextBox按下enter後去觸發ImageButton的按鈕

VB
Me.TextBox1.Attributes.Add("onkeypress", "if( event.keyCode == 13 ) { document.getElementById('" + Me.ImageButton1.ClientID + "').focus(); }")

C#
this.txt_Acc.Attributes.Add("onkeypress", "if( event.keyCode == 13 ) { document.getElementById('" + this.btn_Login.ClientID + "').focus(); }");

2009年8月13日 星期四

MSSQL 補0語法

如下面語法,想補多少0就補多少0
select right('0000'+欄位名稱,4) from 資料表

如何清除網路芳鄰的記憶密碼

在連結到網路芳鄰的時候.填入帳號密碼後勾選了"記憶密碼"
現在想用另一個帳號密碼登入時會發現沒有可以更改的地方....
因為權限的關係.因此會無法進入一個設限比較高的資料夾...
這時就必須把原本的記憶密碼給刪除掉才行了~~
"開始功能表"-->"執行"-->鍵入"control userpasswords2"後-->"ENTER" - 依下圖所示操作


2009年8月11日 星期二

Windows Edit Tool 電腦高手、MIS必備的系統修改工具!

這個小程式是由台灣虎尾科技大學碩士班的「林侑諴」開發的小工具,大部分是匯集幾種台灣電腦使用者或MIS比較常使用到、比較常修改的系統調校與設定功能,簡化了一堆複雜的登錄檔編輯與設定工作,通通把這些調整全部集中在一個小小程式中,讓我們可以很快、很方便的幫Windows修改名稱、加快視窗顯示速度、提昇NTFS效率、隱藏磁碟機、隱藏開始功能表裡的功能、禁用USB隨身碟、禁用IE、自動登入、限用光碟機...等等,算是個相當簡單實用的小工具。

目前這個程式經過幾次的改版後,看起來功能豐富很多,下載回來之後也不用另外安裝,直接按兩下即可使用。不過裡面有部份功能僅適用於XP、部份僅適用於Vista,目前是以文字標示的方式來顯示,還沒有讓程式自動偵測系統版本來顯示或隱藏用不到的功能,所以使用時還是要小心不要按錯了

軟體名稱:Windows Edit Tool
軟體版本:1.6.6
軟體語言:繁體中文
軟體性質:免費軟體
檔案大小:415KB
系統支援:Windows XP/Vista
官方網站:林侑諴
軟體下載:按這裡下載點2
系統需求:系統需支援 .Net Framwork 2.0以上版本

NetWorx 網路流量監測軟體,中文版

很久之前ADSL網路速度還不是很快的時代,很流行類似「DU Meter」這樣的軟體。而下面介紹的這個NetWorx,也是一款可以測量網路連線速度與其他連線資訊的工具。跟其他工具不同的是,NetWorx內建包含中文在內的多國語言介面,而且還是個免費軟體。

除了簡單的網路流量統計與監測功能之外,還提供了完整的流量統計介面、流量限額提醒功能、路由追蹤、PING與NetStat...等工具,讓我們可以在視覺化的簡易操作介面中,更方便的檢測目前電腦的網路速度與流量統計資訊。

軟體名稱:NetWorx
軟體版本:5.0.1
軟體語言:中文(內建多國語系)
軟體性質:免費軟體
檔案大小:1.12MB
系統支援:Windows 2000/XP/2003/Vista/7
官方網站:http://www.softperfect.com
軟體下載:http://www.softperfect.com/download/freeware/networx_portable.zip

2009年8月9日 星期日

抓出Entity Framework的SQL指令

最近在研究Entity Framework..發現EF真的蠻不錯用的..尤其在Linq熟得時候..EF就可以很得心應手..今天在寫的時候..覺得EF丟出的指令還是要試著去了解..因為有時複雜的Linq to Entity還是需要看看怎樣寫才能丟出有效率的SQL Statement..下面就是簡單的兩個方法去抓出SQL Statement..
第一種方法
using (NORTHWNDModel.NORTHWNDEntities db = new NORTHWNDModel.NORTHWNDEntities())
{
var aaaa = db.Orders.Select(a => new { a.ShipName, a.ShipCity }).Take(10);
ObjectQuery oq = aaaa as ObjectQuery;
if (oq != null)
{
string SQLStr = oq.ToTraceString();
Response.Write(SQLStr);
}
}
第二種方法
using (NORTHWNDModel.NORTHWNDEntities db = new NORTHWNDModel.NORTHWNDEntities())
{
var aaaa = db.Orders.Select(a => new { a.ShipName, a.ShipCity }).Take(10);
MethodInfo mi = aaaa.GetType().GetMethod("ToTraceString");
if (mi != null)
Response.Write(mi.Invoke(aaaa, null).ToString());
}

第一種方法效率好很多..如果可以就用第一種方法ㄅ

轉http://bibby.be/search?updated-max=2009-05-19T22%3A30%3A00%2B08%3A00&max-results=7

用Gridview來群組小計

我的作法是在GridView_RowDataBound裡處理
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//兩個為一組加總
if (e.Row.RowIndex > 0 && e.Row.RowIndex % 2 == 1) {
GridViewRow gvr = new GridViewRow(-1, -1, DataControlRowType.DataRow,DataControlRowState.Normal);
TableCell tc = new TableCell();
double sum = Convert.ToDouble(GridView1.Rows[e.Row.RowIndex - 1].Cells[1].Text) + Convert.ToDouble(e.Row.Cells[1].Text);
tc.Text = sum.ToString();
tc.HorizontalAlign = HorizontalAlign.Right;
tc.ColumnSpan = 2;
gvr.Cells.Add(tc);
e.Row.Parent.Controls.Add(gvr);
}}}

2009年8月4日 星期二

MSSQL Server 管理監控效能的指標

建議使用以下的itam來分析的...

資源 效能物件 效能計數器 效能瓶頸條件 建議的效能調整方法
記憶體 Memory Pages/Sec 5 以下 增加記憶體大小
記憶體 Memory Available MBytes 100 MB以下 同上
處理器 Processor % Processor Time 75% 以下 升級處理器速度或增加處理器個數
處理器 System Processor Queue Length 2 以下 同上
硬碟 PhysicalDisk Avg. Disk Queue Length 2 以下 1. 換更快速的磁碟機
2. 資料庫檔案的檔案群組重新規劃分散於不同的磁碟陣列
硬碟 PhysicalDisk Avg. Disk Read Queue Length 2 以下 同上
硬碟 PhysicalDisk Avg. Disk Write Queue Length 2 以下 同上

記憶體 Buffer Manager Buffer Cache Hit Ratio 90 以下 增加記憶體大小
記憶體 Memory Manager Target Server Memory 超過實體記憶體大小 增加記憶體大小
記憶體 Memory Manager Total Server Memory 70~80% 以上 增加記憶體大小
tempdb Access Methods Worktables From Cache Ratio 愈高愈好
tempdb Databases Data File Size 可以得知是否持續增加
交易記錄檔 Databases Log File Size 10~25%
Date File Size 備份或清除交易記錄檔,然後壓縮檔案
交易記錄檔 Databases Percent Log Used 70~80% 以上 備份或清除交易記錄檔

也可使用網管軟體來監控(ApplicationsManager)

除了透過 Performance Monitor 來監控伺服器的效能狀態外
很多時候,效能的瓶頸來自於
1.伺服器的組態設定是恰當?(如 Memory 給定的值與作業系統本身記憶體空間的搭配)
2.tempdb 的空間是否足夠?
3.master db的空間有沒有給大一點(預設是30MB,可以加大一點)
4.每個 database 的 transaction log 空間是否足夠?(比例可設為 5:1 即 100 MB DB 搭配 20 MB Log)
5.有沒有將 Auto Shrink 選項勾起來
6.資料庫備份的模式是否搭配得宜?

除此之外,更多的效能瓶頸來自於
1.SQL Command 下得是否合宜?
2.Table 本身的 Index 是否有妥善的規劃?
3.甚至於您的 Primany Key 的定義是否恰當(數字與文字當 Primary Key的效能差異很大,數據需查)?

要觀測 SQL Command 的執行成本,可以利用 Query Analyzer 來執行 SQL Command 時,
將 Execution Plan 選項打開,可以看出 SQL Command 的執行成本以及所使用的 Index,
來驗證您所建立的 Index 是否恰當

如何避免 SQL Server 資料庫的交易記錄檔超出預期大小

在 SQL Server 2000 和 SQL Server 2005 中,每個資料庫至少都包含一個資料檔以及一個交易記錄檔。SQL Server 實際上會將資料儲存在資料檔中。交易記錄檔則是儲存您在 SQL Server 資料庫中執行的所有修改的詳細資料,以及執行每項修改時的詳細交易資料。因為交易完整性被視為 SQL Server 的基本特性,因此無法關閉 SQL Server 中,詳細交易資料的記錄功能。

交易記錄檔會依照邏輯分成較小的區段,稱之為虛擬記錄檔。在 SQL Server 2000 中,您可以設定交易記錄檔依照需要來擴充。交易記錄檔的擴充範圍可由使用者決定,或者也可以設定為使用所有的可用磁碟空間。SQL Server 對交易記錄檔大小所做的任何修改 (例如,截斷交易記錄檔或擴充交易記錄檔),在執行時都是以虛擬記錄檔為單位。

如果對應於 SQL Server 資料庫的交易記錄檔已滿,而且您已經設定了讓交易記錄檔自動擴充的選項,則交易記錄檔將會以虛擬記錄檔為單位來進行擴充。有時候,交易記錄檔可能會變得非常大,而導致磁碟空間不足。當交易記錄檔擴充到用完所有的可用磁碟空間,而無法再繼續擴充時,您就無法再對資料庫執行任何資料修改的作業。此外,如果因為沒有空間可供交易記錄檔進行擴充時,SQL Server 可能會將資料庫標示為可疑 (Suspect)。

縮減交易記錄檔的大小
如果要復原超出預期限制的交易記錄檔,您必須縮減交易記錄檔的大小。如果要執行這項操作,必須截斷交易記錄檔中的非現用交易,並且壓縮交易記錄檔。

截斷交易記錄檔中的非現用交易
當交易記錄檔超出預期限制時,必須立即備份交易記錄檔。在建立交易記錄檔的備份時,SQL Server 會自動截斷交易記錄檔中的非現用部份。交易記錄檔中的非現用部份包含已經完成的交易,因此,在復原過程中,SQL Server 不會再用到交易記錄檔。SQL Server 會重新使用交易記錄檔中已截斷的非現用空間,而不是讓交易記錄檔繼續擴充並且使用更多的空間。

壓縮交易記錄檔
備份作業或截斷方式都不會縮減記錄檔的大小。如果要縮減交易記錄檔的大小,必須壓縮交易記錄檔。如果要將交易記錄檔壓縮成所需的大小,並且移除未使用的頁面,必須使用 DBCC SHRINKFILE 作業。但是,DBCC SHRINKFILE Transact-SQL 陳述式只能壓縮記錄檔內的非現用部份。

轉 http://support.microsoft.com/kb/873235/zh-tw

2009年8月2日 星期日

ASP.Net 讀取Word檔, 點選後出現另存新檔(SaveAS)對話框 (使用C#)

ASP.Net 讀取Word檔, 點選後出現另存新檔(SaveAS)對話框 (使用C#)

//呼叫方法
DownloadFile("aa.doc", System.IO.File.ReadAllBytes(context.Server.MapPath("/temp/aa.doc")));

private void DownloadFile(string FileNameWhenUserDownload, byte[] FileContent)
{
Response.ClearHeaders();
Response.Clear();
Response.Expires = 0;
Response.Buffer = true;
Response.AddHeader("Accept-Language", "zh-tw");
Response.AddHeader("content-disposition", "attachment; filename=" + FileNameWhenUserDownload);
Response.ContentType = "Application/msword";
Response.BinaryWrite(FileBody);
Response.End();
}

如何在ASP.NET中下載檔案

如何透過ASP.NET來下載檔案,這個問題可大可小,我們先從小的開始。當我們要讓使用者下載一個檔案,最簡單的方式是透過Response.Redirect指令:

  Response.Redirect("test.doc")

您可以把上面這行指令放在Button的Click事件當中,當使用者按下按鈕之後,網頁就會被轉址到該word檔,造成下載的效果。

但是這樣的下載有幾個問題:
1.無法下載不存在的檔案:例如,我們若是想把程式動態(臨時)產生的文字,當作一個檔案下載的時候(也就是該檔案其實原先並不是真的存在,而是動態產生的),就無法下載。
2.無法下載儲存於資料庫中的檔案:這是類似的問題,該檔案並沒有真的存在,只是被存放在資料庫中的某個位置(某筆記錄中的某個欄位)的時候,就無法下載。
3.無法下載不存在於Web資料夾中的檔案:檔案確實存在,但該資料夾並不是可以分享出來的Web資料夾,例如,該檔案的位置在C:\winnt,您總不會想要把該資料夾當作Web資料夾吧?這時候,由於您無法使用Redirect指向該位置,所以無法下載。
4.下載檔案後,原本的頁面將會消失。

典型的狀況是,我們要讓使用者下載一個.txt文字檔,或是.csv格式的Excel檔案,但是...

這個檔案可能是透過ASP.NET程式動態產生的,而不是確實存在於Server端的檔案;
或是它雖然存在於伺服器端的某個實體位置,但我們並不想暴露這個位置(如果這個位置公開,很可能沒有權限的使用者也可以在網址列上輸入URL直接取得!!!)
或是這個位置並不在網站虛擬路徑所在的資料夾中。(例如C:\Windows\System32...)

這時候,我們就得採用不同的方式:
Shared Function DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FileBody As String)
  WebForm.Response.ClearHeaders()
  WebForm.Response.Clear()
  WebForm.Response.Expires = 0
  WebForm.Response.Buffer = True
  WebForm.Response.AddHeader("Accept-Language", "zh-tw")
  '檔案名稱
  WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34))
  WebForm.Response.ContentType = "Application/octet-stream"
  '檔案內容
  WebForm.Response.Write(FileBody)
  WebForm.Response.End()
End Function

上面這段程式碼是下載一個動態產生的文字檔,若這個檔案已經存在於伺服器端的實體路徑,則可以透過底下的函式:
Shared Sub DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FilePath As String)
  WebForm.Response.ClearHeaders()
  WebForm.Response.Clear()
  WebForm.Response.Expires = 0
  WebForm.Response.Buffer = True
  WebForm.Response.AddHeader("Accept-Language", "zh-tw")
  '檔案名稱
  WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34))
  WebForm.Response.ContentType = "Application/octet-stream"
  '檔案內容
  WebForm.Response.Write(System.IO.File.ReadAllBytes(FilePath))
  WebForm.Response.End()
End Sub


上面這兩個下載檔案的的函式,應可解決大多數開發人員在ASP.NET當中的檔案下載問題。

轉 http://studyhost.blogspot.com/2007/10/aspnet.html

修復裝置管理員,事件檢視器損毀修復

修復裝置管理員:
本機服務的視窗 開始.. 執行.. 輸入 services.msc PLUG and PLAY 自動.. 已啟動..

登錄編輯器 開始.. 執行.. 輸入 Regedit ( 2000 版建議用 regedt32 )

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
滑鼠移至 Enum 按右鍵.點選「使用權限」
點選 Administrators ( 或 system ) 按下"進階"
在下方『從父項繼承到子物件的權限項目,以顯示於此套用到子物件的項目物』打勾. 按"套用".. "確定"..

======================================
修復事件檢視器 :

1. 去服務 ( 開始.. 執行.. 輸入 services.msc ) 將 EventLog 的 SERVICE 設定成停用
2. 重新啟動電腦 ( 這時一定會有錯誤訊息, 不用理他 )
3. 將 C:\ winnt \ system32 \ config \ Sysevent.Evt ( 也就是損毀的系統事件 ) 刪除
4. 再將 SERVICE 設定成自動
5. 重新啟動電腦
6. 這時會重新建新的事件檔案