關於我

我的相片
用心思考、保持熱情,把工作上的經驗作分享與紀錄。希望能夠跟大家一起不斷的成長~

MSSQL T-SQL 撰寫測試時的好用語法

剛在測試撰寫一段Query

順便介紹一下幾個好用的語法,可幫助除錯..等

waitfor delay '00:00:05:000' 

此可讓作業暫停!

if @count%10000=0 print 'OK' else pirnt 'NG' 

if else 判斷式..相當好用! %則是取餘數 ~

Set nocount on 

可讓預設會顯示的『影響資料筆數』不顯示!

簡單 T-SQL Cursor 範例

DECLARE InvoiceOID_cursor CURSOR FOR 
select oid from Invoice
OPEN InvoiceOID_cursor 
FETCH NEXT FROM InvoiceOID_cursor INTO @InvoiceOID
WHILE @@FETCH_STATUS = 0
BEGIN
    --    PRINT @message
    --    delete from XXX where oid = @InvoiceOID
    --    Do Something !
    FETCH NEXT FROM InvoiceOID_cursor INTO @InvoiceOID
END 
CLOSE InvoiceOID_cursor
DEALLOCATE InvoiceOID_cursor

瀏覽器市占率調查參考網站

http://www.axiis.org/examples/BrowserMarketShare.html

參考上方連結~

可看到目前瀏覽器市占率狀況。

我看到的今天:

image

2009/08月份FireFox的市占率已經來到47.40%囉~

IE6、7、8加起來約占了39.30%。

好厲害的FireFox~

如何更改 tempdb 實體檔案位置

更改位置Script

USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'E:\DB\tempdb.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'E:\DB\templog.ldf');
GO

完成後可用下方Query檢查是否更改完成。

SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');

最後再重啟資料庫即可

如何確認SQL Server Integration Services是否有安裝並啟用

可開啟SQL Server Configuration Manager視窗,看看SQL Server 服務中,是否有一項【SQL Server Integration Services】項目,

如果有的話,表示Integration Services服務已有安裝。沒有的話則需放入安裝光碟重新勾選安裝此項目。

即可確認是否有安裝並啟用了!

擷取

Asp.Net 2.0 IIS Register

找到一篇不錯的參考文 http://blog.xuite.net/jungte.lin/blog/25133697

ASP.NET can be re-registered with IIS. The specific method depends on the operating system being used. For more information on ASP.Net and the IIS Registration tool, see the related links below.

Windows 2000/XP

To fix this on Windows 2000 or Windows XP, run this command from the Start>Run box or a command prompt (assuming the system directory is C:\Windows):

.Net 1.1: C:\Windows\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i

.Net 2.0: C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i

Windows 2003

On Windows 2003, ASP.NET must be both installed and enabled.  To install ASP.NET:

  1. On the taskbar, click the Start button, point to Control Panel, and then click Add or Remove Programs.
  2. In the Add or Remove Programs dialog box, click Add/Remove Windows Components.
  3. In the Components box in the Windows Components Wizard, click the Web Application Server check box, and then click Next.
  4. When the Windows Components Wizard has finished configuring Windows Server 2003, click Finish.

To enable ASP.NET, run this command from the Start>Run box or a command prompt (assuming the system directory is C:\Windows):

.Net 1.1: C:\Windows\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i -enable

.Net 2.0: C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i –enable

依據上文的參考操作:

1.先看看未安裝前的項目:

Server2003伺服器:未註冊ASP.NET v2.0.50727情況

VATWEB2008伺服器:已註冊ASP.NET v2.0.50727情況

擷取

2.接著於Server2003伺服器上依照上文操作,

輸入命令:C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i –enable

擷取2

完成後就可以看到網頁服務延伸中,已經有ASP.NET v2.0.50727囉~~

用[執行]輸入指令開啟 IIS Manager

於執行輸入:inetmgr

擷取

即可開啟 IIS Manager

 

用CMD視窗指令,重啟IIS,開啟CMD視窗後,輸入 iisreset 即可

擷取

SSIS 敏感字眼加密方式

在使用SQL Server Business Intelligence Development Studio設計SSIS Package時,

如果Package中有儲存如DB登入之密碼...等敏感字眼。

通常預設會加密後保存,防止重要資訊外洩。

 

今天便要好好介紹內建的幾種加密方式

詳細內容亦可參考以下微軟文章 http://msdn.microsoft.com/zh-tw/library/ms141747.aspx

 

保護等級 描述

不要儲存機密資料 (DontSaveSensitive)

儲存封裝時,隱藏封裝中的機密屬性值。此保護等級不加密,但是會防止標記為機密資料的屬性與封裝一起儲存,因此其他使用者無法使用機密資料。如果其他使用者開啟封裝,則機密資訊會以空白取代,該使用者必須提供機密資訊。

dtutil 公用程式 (dtutil.exe) 搭配使用時,這個保護等級會對應至值 0。

所有資料都以密碼加密 (EncryptAllWithPassword)

使用密碼加密整個封裝。封裝是使用建立或匯出封裝時使用者提供的密碼來加密的。若要在「SSIS 設計師」中開啟封裝或使用 dtexec 命令提示公用程式執行封裝,使用者必須提供封裝密碼。如果沒有密碼,使用者就無法存取或執行封裝。

dtutil 公用程式搭配使用時,這個保護等級會對應至值 3。

所有資料以使用者金鑰加密 (EncryptAllWithUserKey)

使用以目前使用者設定檔為基礎的金鑰加密整個封裝。只有建立或匯出封裝的使用者才可以在「SSIS 設計師」中開啟封裝,或使用 dtexec 命令提示公用程式執行封裝。

dtutil 公用程式搭配使用時,這個保護等級會對應至值 4。

ms141747.note(zh-tw,SQL.100).gif附註:
對於使用使用者金鑰的保護等級,Integration Services 會使用 DPAPI 標準。如需有關 DPAPI 的詳細資訊,請參閱 MSDN Library,其網址為 http://msdn.microsoft.com/library

機密資料以密碼加密 (EncryptSensitiveWithPassword)

使用密碼僅加密封裝中的機密屬性值。DPAPI 用於此加密。機密資料會做為封裝的一部份進行儲存,但該資料會使用建立或匯出封裝時目前使用者所提供的密碼進行加密。若要在「SSIS 設計師」中開啟封裝,使用者必須提供封裝密碼。如果未提供密碼,則會開啟封裝但不提供機密資料,目前的使用者必須為機密資料提供新值。如果使用者嘗試在未提供密碼的情況下執行封裝,則封裝執行會失敗。如需有關密碼和命令列執行的詳細資訊,請參閱<dtexec 公用程式>。

dtutil 公用程式搭配使用時,這個保護等級會對應至值 2。

機密資料以使用者金鑰加密 (EncryptSensitiveWithUserKey)

使用以目前使用者設定檔為基礎的金鑰,僅加密封裝中的機密屬性值。只有使用相同設定檔的相同使用者才可以載入封裝。如果其他使用者開啟封裝,則機密資訊會以空白取代,且目前的使用者必須為機密資料提供新值。如果使用者嘗試執行封裝,則封裝執行會失敗。DPAPI 用於此加密。

dtutil 公用程式搭配使用時,這個保護等級會對應至值 1。

ms141747.note(zh-tw,SQL.100).gif附註:
對於使用使用者金鑰的保護等級,Integration Services 會使用 DPAPI 標準。如需有關 DPAPI 的詳細資訊,請參閱 MSDN Library,其網址為 http://msdn.microsoft.com/library

依賴伺服器儲存體進行加密 (ServerStorage)

使用 SQL Server 資料庫角色保護整個封裝。只有將封裝儲存到 SQL Server msdb 資料庫時,才支援此選項。將封裝從 Business Intelligence Development Studio 儲存到檔案系統時不支援此選項。

 

而開發預設加秘方式為 EncryptSensitiveWithUserKey,因此以User設定檔為Key加密。

但通常開發SSIS Package的為一台開發機。而實際執行之環境為另一台正式機。

所以User一定式不同的,導至每次開發完成的Package都需要於正式機上在開啟重新設定Password才可以正確運作等問題 !

擷取

Windows 2003 server 開啟 MSDTC 功能注意要點

1.請先確認Sql Server Integration Service 服務是否已有安裝!!!

2.開啟MSDTC功能,設定畫面如下

擷取

3.安裝 Network DTC 存取服務

擷取2

4.開啟防火牆例外設定

可於cmd視窗輸入命令:

netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable

開啟後畫面如下

擷取3

修改虛擬硬碟識別碼uuid

在使用VirtualBox時,將原本VirtualPC的虛擬硬碟檔案直接拿來掛載。

結果因為當初的硬碟檔都是Copy而來,導至所有硬碟檔案的識別碼UUID都是一樣的。

VirtualPC並不會認UUID,所以使用上都沒有什麼問題。

 

但在網路上看到大家說VirtualBox的效能比VirtaulPC、VMWare的效能還要好,就一直很想試看看!

試用後發現VirtualBox真的很威啊!!居然可以把VirtualPC的虛擬硬碟檔vhd,直接掛載起來使用。

實在是太方便了,所有虛擬硬碟都不需再另外轉檔或重做!

 

但卻發生了一個問題,因為當初所有vhd都是用copy衍生安裝出來的,所以所有的vhd的UUID都一樣。

而VirtualBox卻會去識別UUID,導至一次只能掛載上一個原有的vhd檔,在掛載就會出現如下錯誤訊息。

擷取

天阿!看到這訊息,心就涼了Orz…該不會…一次只能掛載一個原有vhd,要用別的,還需要先移除在重新掛載吧?!

 

接著只能上Goolge查查相關資訊,看是否可以有其他解決方式。

查著查著腦中突然閃過是否可以修改UUID的方式,如果可以,一切不就解了,便往這方向查詢了!

 

沒想到,原來VirtualBox早就做好這功能啦!!!真是太棒了~接趕快來做測試!

在VirtualBox的安裝目錄下有一個VBoxManage.exe,此工具含有許多功能,今天需要使用到的UUID變更功能。就要靠他來完成囉!!

 

先開啟命令提示字元視窗〈P.S. 如果是Vista or Win7,記得要按右鍵用系統管理員身分執行喔!!〉

並切換到VirtualBox的安裝目錄

擷取2

 

假設今天須變更的vhd檔案之完整檔案路徑為【E:\02Project\FISC\DevelopEnvironment\fisc2009.vhd】

則輸入命令:VBoxManage internalcommands sethduuid E:\02Project\FISC\DevelopEnvironment\fisc2009.vhd

擷取3

重點就在下方幾行字了!!!UUID changed to :  …………………

哈哈哈!成功啦,已經將原本vhd的UUID變更成功囉~~~

 

接下來就安安心心的虛擬硬碟vhd掛載起來用吧 ^+++^

這樣就可以輕鬆的由VirtualPC轉換成VirtualBox使用囉~

好用的System.Environment類別

今天系統上,在文字呈現,需增加新的一行,

以往常常自己依環境,拼湊如crlf、vbCrLf、char(13)+char(10)、/n、<BR> ... 等方式換行

今天突然發現有個好用的類別System.Environment,此類別即可幫我們做到換行的輸出囉。

範例程式如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication6
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("sam" + Environment.NewLine + "wang"); //換行
      Console.WriteLine(Environment.MachineName);
      Console.WriteLine(Environment.OSVersion);
      Console.WriteLine(Environment.ProcessorCount);
      Console.WriteLine(Environment.SystemDirectory);
      Console.WriteLine(Environment.UserDomainName);
      Console.WriteLine(Environment.UserName);
      Console.WriteLine(Environment.Version);
    }
  }
}

輸出:

擷取

很實用吧!!!

在 Google Blogger 中使用 SyntaxHighlighter 1.5.1

好文參考

Brush name Brush aliases File name
ActionScript3 as3, actionscript3 shBrushAS3.js
Bash/shell bash, shell shBrushBash.js
C# c-sharp, csharp shBrushCSharp.js
C++ cpp, c shBrushCpp.js
CSS css shBrushCss.js
Delphi delphi, pas, pascal shBrushDelphi.js
Diff diff, patch shBrushDiff.js
Groovy groovy shBrushGroovy.js
JavaScript js, jscript, javascript shBrushJScript.js
Java java shBrushJava.js
JavaFX jfx, javafx shBrushJavaFX.js
Perl perl, pl shBrushPerl.js
PHP php shBrushPhp.js
Plain Text plain, text shBrushPlain.js
PowerShell ps, powershell shBrushPowerShell.js
Python py, python shBrushPython.js
Ruby rails, ror, ruby shBrushRuby.js
Scala scala shBrushScala.js
SQL sql shBrushSql.js
Visual Basic vb, vbnet shBrushVb.js
XML xml, xhtml, xslt, html, xhtml shBrushXml.js

範例:

<pre class="csharp" name="code"> Content </pre>

MSSQL 清理LOG記錄檔!

清除前:

擷取

使用清除命令:

擷取2

清除結果:

擷取3

第一行命令,目的將Log記錄檔中斷,才可以進行有效的壓縮清理。

backup log VATC4_TH with TRUNCATE_ONLY

接著命令則為壓縮清理:

USE [VATC4_TH]
GO
DBCC SHRINKFILE (N'VATC4_Log' , 0, TRUNCATEONLY)
GO

Asp.net Change Error Message Language To English

剛寫了一篇將Sql Query的錯誤訊息改為英文輸出的方法,順便就查了一下Asp.Net該如何也輸出英文錯誤訊息。

原輸出畫面如下,螢光筆標示起來部分會輸出為中文描述:

擷取2

查到的方法是變更應用程式的globalization設定,於Config檔中加入區段如下:

<system.web> <globalization uiCulture="en-US" /> </system.web>

截圖如下,將原先中文設定,修改為英文即可。

擷取3

在測試一次,螢光筆標示處即可輸出為英文囉~~

擷取

Sql Query Error Message Change to English

有時候發生sql語法錯誤時,因為我們使用的是中文的系統。 所以回應的訊息都是中文。 實在很難依訊息查詢解決方式。但如果可將錯誤訊息改為英文,國外的經驗則會有用的多。 此時只要於Query中,加入語言設定即可。

SET LANGUAGE ENGLISH 

即可輸出英文版的錯誤訊息了! 參考畫面如下~

擷取

實用的設定喔!!

javascript windows.location

當我們在撰寫Asp.Net時, 如果要讓程式於執行完成時,

可出現Message,最常的用法是在codebehidn寫入下方程式:

Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "<script>alert('執行成功');</script>");

即可讓程式在Response時,寫入client的script,跳出訊息視窗.

 

但當遇到希望可以回傳成功的訊息,並跳轉導入其他頁面.

如果使用下方的寫法:

Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "<script>alert('執行成功');</script>"); 
Page.Response.Redirect("xxx.aspx");

先註冊一段client端的Script,接著再將Response導至預期的頁面。

看似一切都沒什麼問題,但當實際執行時,便會發生訊息不見的冏境。

 

實際分析了一下,原因很簡單,因為頁面已經被導至其他頁面了.

所以被註冊在原始頁面的Script,當然不會被執行到囉!

自然而然,訊息是不會出現的.

 

可是那要怎麼辦呢?!沒有辦法可以做到這個功能嗎?!

有的,可參考下面的這行程式:

Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "<script>alert('執行成功'); window.location = 'xxx.aspx';</script>");

發現了嗎?!我們將導至其他頁面的動作,保留到Client再由JavaScript去完成他!

這樣就可以在不影響訊息顯示的情況下,依然導入預期頁面了!

 

這就是好用的JavaScript "windows.location"!

Oledb Export DataSet to Excel

同事遇到一個需求,須將Data匯出成已排版完成的Word檔,

成為一份電子書,給予User下載。還需要有封面、目錄、速查表等頁面。

最後同事決定,將Data彙整於DataTable中,

並將所有Data於DataTable中,將所有資料均排版完成。

原始資料如下圖,是一般常見的資料狀況:

擷取拷貝

經過編輯後,被排版成下圖,

擷取拷貝2

這樣的好處是,可以將此排版好的DataTable,

直接用套表的方式匯出,後段程式只需注意套表與字型等問題即可,不需再費心於排版上。

在製作目錄或速查表等需計算頁數之頁面時,也將簡單許多。

 

而今天的重點來了,因為需要修改此段排版程式,須加入其他商業邏輯。

但排版好的DataTable,我們又看不到,怎麼快速確定是否正確呢?!

有了這個念頭,便想到之前有找到過將DataTable匯出為Excel的參考範例

今天趕緊將此找到的範例程式記錄下來。方便下此再次瞭解使用。

 

程式碼如下:

public static void ExportDataSetToExcel(DataSet data, String excelFileName)
{
  System.IO.File.Delete(excelFileName);
  string strConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
  + System.IO.Path.GetDirectoryName(excelFileName) + @"\" + System.IO.Path.GetFileName(excelFileName)
  + @";Extended Properties='Excel 8.0;HDR=YES'";
  using (System.Data.OleDb.OleDbConnection objConn = new
  System.Data.OleDb.OleDbConnection(strConnectionString))
  using (System.Data.OleDb.OleDbCommand cmd = new
  System.Data.OleDb.OleDbCommand("", objConn))
  {
    objConn.Open();
    foreach (DataTable dt in data.Tables)
    {
      cmd.CommandText = "CREATE TABLE [" + dt.TableName + "] (";
      String valueNames = "(";
      Boolean first = true;
      foreach (DataColumn dc in dt.Columns)
      {
        if (!first)
        {
          cmd.CommandText += ",\r\n";
          valueNames += ", ";
        }
        cmd.CommandText += " [" + dc.ColumnName + "] NVARCHAR(100)";
        valueNames += " [" + dc.ColumnName + "]";
        first = false;
      }
      cmd.CommandText += ")";
      valueNames += ")";
      cmd.ExecuteNonQuery();
      foreach (DataRow dr in dt.Rows)
      {
        String values = "(";
        first = true;
        foreach (DataColumn dc in dt.Columns)
        {
          if (!first)
            values += ", ";
          values += " '" + dr[dc] + "'";
          first = false;
        }
        values += ")";
        cmd.CommandText = "INSERT INTO [" + dt.TableName + "$] " +
        valueNames + " VALUES " + values;
        cmd.ExecuteNonQuery();
      }
    }
  }
}

而上方兩張截圖,就是用此方式,將DataTable匯出程Excel後,

開啟之結果。用此方式快速許多。

最後,就完成了排版完成的Word檔案囉~~~

擷取拷貝3

這張報表(這算報表嗎?!)實在是不好寫,

也順便記錄下同事的Ideal,如果下次遇到,也可以參考。

這樣就可以將程式拆開,不會又要排版又要寫資料..又要計算頁次等一堆事情,

全擠在同一支程式裡,大大的增加了程式的可維護性囉~~

讚!!!

(順帶一提,同事的Word套表,是用Html方式產生套表的。)

使用 SharpZipLib 發生解壓時,壓縮檔毀損問題

上次有寫了一篇關於使用SharpZipLib的文章 Streaming a zip file over http in .net with SharpZipLib 

結果在客戶端實際使用時,當客戶下載zip檔案後,

使用Windows內建的compressed (zipped) Folders開啟解壓縮時,發現匯出現下方錯誤訊息!

擷取

 

在Google上搜尋了一下,查出發生的原因為,預設SharpZipLib使用的是Zip64格式

而Windows內建的compressed (zipped) Folders是不支援此格式的。

因此解決方法需要強制指定壓縮時,不使用Zip64格式。即可解決此問題。

加入程式碼:

zipOutput.UseZip64 = UseZip64.Off;

該段程式修改後如下:

byte[] buffer = new byte[1024 * 8];
using (ZipOutputStream zipOutput = new ZipOutputStream(stream))
{
  zipOutput.UseZip64 = UseZip64.Off;  //強制指定不使用Zip64格式壓縮,避免windows內建zip無法開啟
  foreach (string fileName in fileNames)
  {
    ZipEntry zipEntry = new ZipEntry(fileName.Substring(fileName.LastIndexOf('\\') + 1));
    zipOutput.PutNextEntry(zipEntry);
    using (FileStream fread = File.OpenRead(fileName))
    {
      StreamUtils.Copy(fread, zipOutput, buffer);
    }
  }
  zipOutput.Finish();
}

即可解決此問題了!!

Streaming a zip file over http in .net with SharpZipLib

今天因為專案需求,需要於網站上可以將多個檔案zip後,Popup下載視窗,讓User可下載檔案zip包。這個需求之前有做過的做法如下:
  1. 先將所有要zip的檔案zip至一個暫存的目錄中。
  2. 將zip檔讀入為byte[],再Response.binarywrite出該byte[]檔案。
  3. 再將暫存檔案刪除。

可是這樣的做法,多了一個暫存的動作。

實在不是個好的做法。

因此今天花了點時間,找到了一個參考Sample

以此Sample即可達成省去暫存zip檔的步驟。

  1. 將要壓縮的檔案,一個一個讀入,zip後放入Stream中。
  2. 直接將Stream於網頁output出來即可。

以下為實際完成的程式。

using System;
using System.Text;
using System.Web;
using System.Xml;
using System.Data;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Core;
using System.IO;
using System.Collections.Generic;
namespace VAT2005.Forms
{
  class Utility
  {
    /// <summary>
    /// 將多個檔案zip後,Response下載!
    /// </summary>
    /// <param name="context">HttpContext</param>
    /// <param name="fileNames">要zip的多個檔案完整路徑與檔名</param>
    /// <param name="outputfilename">要output之zip檔案檔名</param>
    public static void DownloadFilesZip(HttpContext context, List<string> fileNames, string outputfilename)
    {
      context.Response.ContentType = "application/x-zip-compressed";
      context.Response.AppendHeader("content-disposition", string.Format("attachment; filename={0}", outputfilename));
      context.Response.ContentEncoding = Encoding.Default;
      context.Response.Charset = "";
      //設定zip時,buffer的大小
      byte[] buffer = new byte[1024 * 8];
      using (ZipOutputStream zipOutput = new ZipOutputStream(context.Response.OutputStream))
      {
        //依序讀入要zip的檔案
        foreach (string fileName in fileNames)
        {
          //新增zip檔案
          ZipEntry zipEntry = new ZipEntry(fileName.Substring(fileName.LastIndexOf('\\') + 1));
          //放入OutputStream中
          zipOutput.PutNextEntry(zipEntry);
          //讀入file
          using (FileStream fread = File.OpenRead(fileName))
          {
            //將file(Stream)使用buffer zip後,放入zipOutput中
            StreamUtils.Copy(fread, zipOutput, buffer);
          }
        }
        zipOutput.Finish();
      }
      context.Response.Flush();
      //完成Stream寫出,讓User下載
      context.Response.End();
    }
  }
}
透過上方做法,即可直接將要zip的多個檔案,zip後,讓User下載!

當然,此zip做法是使用SharpZipLib,必須要referance才可使用!

JavaScript進階技巧

<%--進階JavaScript<1>物件方法屬性操作--%>
<script type="text/javascript">
  //委派Function?!   
  function say(msg) { alert(this.Name + ' 說:' + msg); }

  //建立物件
  var person = new Object();
  person.Name = "Sam";
  person.say = say;

  //取得屬性與呼叫方法
  alert("Name = " + person.Name);
  person.say("Hello !");

  //透過名稱字串呼叫方法與取得屬性
  alert("Name = " + person["Name"]);
  person["say"]("Hello !");
</script>

 

 

<%--進階JavaScript<2>匿名方法--%>
<script type="text/javascript">
  //建立物件
  var person = new Object();
  person.Name = "Peggy";
  //匿名方法設定方法
  person.say = function(msg) { alert(this.Name + ' 說:' + msg) };

  //取得屬性與呼叫方法
  alert("Name = " + person.Name);
  person.say("匿名方法耶 !");

  //透過名稱字串呼叫方法與取得屬性
  alert("Name = " + person["Name"]);
  person["say"]("匿名方法耶 !");
</script>

<%--進階JavaScript<3>匿名物件--%>
<script type="text/javascript">
  //建立匿名物件
  var person = {
    Name: "Peggy and Sam",
    say: function(msg) { alert(this.Name + ' 說:' + msg); }
  };

  //取得屬性與呼叫方法
  alert("Name = " + person.Name);
  person.say("匿名物件耶 !");

  //透過名稱字串呼叫方法與取得屬性
  alert("Name = " + person["Name"]);
  person["say"]("匿名物件耶 !");
</script>

Delegate,AnonymousDelegate,Func,LambdaExpression,Linq演化過程程式範例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestLambdaExpression2
{
  static class Program
  {
    static void Main(string[] args)
    {
      List allPerson = GetAllPerson();

      #region Func
      //1.
      Func FuncSelector = new Func(heightselector);
      Console.WriteLine(GetMaxFunc(allPerson, FuncSelector));

      //2.
      Func FuncSelector2 = heightselector;
      Console.WriteLine(GetMaxFunc(allPerson, FuncSelector2));

      //3.
      Console.WriteLine(GetMaxFunc(allPerson, heightselector)); 

      //4.
      Console.WriteLine(allPerson.GetMaxFunc(heightselector));

      //5.使用Lambda Expressions精簡Func之寫作
      Console.WriteLine(allPerson.GetMaxFunc(p => p.height));

      //6.因為Max為多型,必須先宣告形式才不會發生錯誤
      Func FuncSelector3 = heightselector;
      Console.WriteLine(allPerson.Max(FuncSelector3));
      #endregion


      #region Delegate
      //1.
      heightestSelector DelegateSelector = heightselector;
      Console.WriteLine(GetMaxDelegate(allPerson, DelegateSelector));

      //2.
      Console.WriteLine(GetMaxDelegate(allPerson, heightselector));

      //3.
      Console.WriteLine(allPerson.GetMaxDelegate(heightselector));

      //4.AnonymousDelegate
      Console.WriteLine(allPerson.GetMaxDelegate(delegate(Person p) { return p.height; }));

      //5.使用Lambda Expressions精簡AnonymousDelegate之寫作
      Console.WriteLine(allPerson.GetMaxDelegate(p => p.height));

      //6.會發生錯誤,因System.linq.Max需定義Func..不可傳入Delegate,會無法判定型式
      //heightestSelector DelegateSelector2 = heightselector;
      //Console.WriteLine(allPerson.Max(DelegateSelector2));

      //7.使用System.linq.Max,AnonymousDelegate
      Console.WriteLine(allPerson.Max(delegate(Person p) { return p.height; }));

      //8.使用System.linq.Max,Lambda Expressions精簡AnonymousDelegate之寫作
      Console.WriteLine(allPerson.Max(p => p.height));

      Man[] mans = Array.ConvertAll(allPerson.ToArray(), p => new Man() { name = p.name, weight = p.weight });
      Console.WriteLine(mans.Max(p => p.weight));
      #endregion

    }

    public delegate int heightestSelector(Person p);

    public static int heightselector(Person p) { return p.height; }

    private static int GetMaxFunc(this List allPerson, Func selector)
    {
      return (from i in allPerson
              select selector(i)).Max();
    }

    //private static decimal GetMaxFunc(this List allPerson, Func selector)
    //{
    //  return (from i in allPerson
    //          select selector(i)).Max();
    //}

    private static int GetMaxDelegate(this List allPerson, heightestSelector selector)
    {
      return (from i in allPerson
              select selector(i)).Max();
    }

    static List GetAllPerson()
    {
      List persons = new List();
      persons.Add(new Person { name = "A", height = 150, weight = 50 });
      persons.Add(new Person { name = "B", height = 160, weight = 60 });
      persons.Add(new Person { name = "C", height = 170, weight = 70 });
      persons.Add(new Person { name = "D", height = 180, weight = 80 });
      persons.Add(new Person { name = "E", height = 190, weight = 90 });
      return persons;
    }
  }

  public class Person
  {
    public string name { get; set; }
    public int height { get; set; }
    public int weight { get; set; }
  }

  public class Man
  {
    public string name { get; set; }
    public int weight { get; set; }
  }
}



windows FLP 安裝 Outlook Express方法

參考網址http://blog.yam.com/leo2016/article/14590189下方問與答 有人問,1. FLP是否有outlook express,如果沒有,是否可安裝? >>> 可安裝。 !!! 下面内容是參考韓國網頁(http://11cm2.tistory.com/174#comment2130637)我自己實習後寫的!!! 條件 1。FLP Full option install。 2。除了IE7和SP3之外,全部都window update。 安裝法 FLP安裝完之後, 1。Windows Explorer>Tools>Folder Options>View - 把所有隱藏的都設為顯示。 2。Windows\inf\msmail.inf Windows\inf\wab50.inf Windows\inf\msoe50.inf - 三個檔案按右建後安裝。 - 若問途徑就把一般的Win XP CD放進去,然後圖勁指定為i386檔案夾。 3。安裝完在Program files下面會看到Outlook express檔案夾。做個捷徑使用。 ** 這麽做就可以使用Outlook和POP3 Mail了。沒做這個動作就在Outlook上不能收發Mail。 ** 聽説,使用Office2007就不用這麽麻煩了。直接安裝就可以使用Outlook。 ** 祝你們internet life開心 ^^

SQL 2005 移除步驟

如果你有在使用M$ SQL 2005 相信你也有痛苦的移除經驗!

怎麼移除才能重新安裝,這裡將我的實際經驗,分享給大家。

SQL 2005移除步驟

  1. 備份資料:這是首要工作喔!。
  2. 停止所有的SQL SERVER服務:避免在移除過程中,SQL SERVER仍在執行導致無法正確移除。從「我的電腦」→「右鍵」→「管理」→「服務」把所有SQL SERVER的服務停止。
  3. 執行ARPWrapper.exe /Remove:
    • 在命令提示字元下,輸入”cd C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\ARPWrapper.exe /Remove”。(如果有安裝Expreee版本,請再執行一次)。
    • 勾擇移除所有SQL SERVER 2005相關檔案。移除時間會有點長。
  4. 執行”新增/移除程式”:移除完成後再將「控制台」→「新增移除程式」→「Microsoft SQL Server Native Client 元件」解除安裝;
  5. 移除完成:所有的SQL SERVER 2005就算移除完畢囉!

hyper-v

http://www.wretch.cc/blog/jerry0822/13912188

onkeydown Event


於TextBox使用onkeydown事件,讓此TextBox為Readonly狀態, 因為搭配AJAX之UpdatePanel使用時,如果直接將TextBox設定為ReadOnly="true"的話. 將導致此TextBox的值不會被ViewState紀錄.導致只要一更新所輸入的值便消失! 所以應用此小技巧!

StopSubdirsMonitor

    public static void StopSubdirsMoniter()
    {
      PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
      object o = p.GetValue(null, null);
      FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
      object monitor = f.GetValue(o);
      MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic);
      m.Invoke(monitor, new object[] {});
    }

將數個檔案依指定名稱zip後,response回page讓client下載



protected void BtnSave_Click(object sender, EventArgs e)
{
MemoryStream ms = FEDIClientFacade.FEDISetupToExcel(this, DropDownList1.SelectedValue);
string txtFEDIName = "金融EDI交易量統計表" + (DateTime.Now.Year - 1911).ToString("000") + DateTime.Now.Month.ToString("00") + ".xls";

MemoryStream msCust = FEDIClientFacade.FEDISetupCustomerToExcel(this, DropDownList1.SelectedValue);
string txtFEDINameCust = "金融EDI客戶統計表" + (DateTime.Now.Year - 1911).ToString("000") + DateTime.Now.Month.ToString("00") + ".xls";

bool isSuccess = Utility.DoStreamZipPopUpDownload(this, new Stream[2] { ms, msCust },
new string[] { txtFEDIName, txtFEDINameCust }, "金融EDI統計表.zip");
if (!isSuccess)
ClientScript.RegisterStartupScript(this.GetType(), "NG", "<script>alert('報表產生失敗!')</script>");
}

//-----------------------------------------------------------------------------//

///
/// 將Stream依指定路徑與檔名存檔
///

/// Stream
/// 檔案完整路徑與檔名
public static void SaveStreamToFile(Stream stream, string filePathName)
{
string nPath = filePathName.Substring(0, filePathName.IndexOf(filePathName.Split('\\')[filePathName.Split('\\').Length - 1]));
if (!Directory.Exists(nPath))
Directory.CreateDirectory(nPath);
System.IO.File.WriteAllBytes(filePathName, StreamToByteArray(stream));
}

///
/// 將Stream轉為Byte[]
///

/// Stream
/// Byte[]
public static byte[] StreamToByteArray(Stream stream)
{
long FileSize = stream.Length;
byte[] Buffer = new byte[FileSize];
stream.Read(Buffer, 0, (int)FileSize);
stream.Close();
return Buffer;
}


///
/// 將數個檔案依指定名稱zip後,response回page讓client下載
///

/// popup之page
/// 各檔案完整路徑+名稱
/// zip檔案之名稱
///
public static bool DoZipPopUpDownload(System.Web.UI.Page page, string[] files, string zipname)
{
try
{
//建立暫存資料夾
string zipTempPath = "~/zipTemp/" + new Random().Next().ToString() + "/";
string zipTempPathOrg = zipTempPath + "org/";
if (!Directory.Exists(page.Server.MapPath(zipTempPathOrg)))
Directory.CreateDirectory(page.Server.MapPath(zipTempPathOrg));

//將檔案複製至暫存資料夾
foreach (string file in files)
{
string filename = file.Split('\\')[file.Split('\\').Length - 1];
//string filename = file.Substring(0, file.IndexOf(file.Split('\\')[file.Split('\\').Length - 1]));
File.Copy(file, page.Server.MapPath(zipTempPathOrg + filename));
}

//建立zip壓縮檔
ICSharpCode.SharpZipLib.Zip.FastZip fz = new ICSharpCode.SharpZipLib.Zip.FastZip();
fz.CreateZip(page.Server.MapPath(zipTempPath + zipname), page.Server.MapPath(zipTempPathOrg), true, "");

//Response下載zip檔
byte[] zip = File.ReadAllBytes(page.Server.MapPath(zipTempPath + zipname));
page.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", page.Server.UrlPathEncode(zipname)));
page.Response.BinaryWrite(zip);

//清空檔案與暫存檔
Directory.Delete(page.Server.MapPath(zipTempPath), true);
return true;
}
catch
{
return false;
}
}


///
/// 將數個資料Stream依指定名稱zip後,response回page讓client下載
///

/// popup之page
/// 各檔案資料Stream
/// 對應各檔案Stream之檔案名稱
/// zip檔案之名稱
///
public static bool DoStreamZipPopUpDownload(System.Web.UI.Page page, Stream[] streams,string[] filenames, string zipname)
{
try
{
//建立暫存資料夾
string zipTempPath = "~/zipTemp/" + new Random().Next().ToString() + "/";
if (!Directory.Exists(page.Server.MapPath(zipTempPath)))
Directory.CreateDirectory(page.Server.MapPath(zipTempPath));

if (streams.Length == filenames.Length)
{
string[] files = new string[streams.Length];
//資料寫入暫存
for (int i = 0; i < streams.Length; i++)
{
SaveStreamToFile(streams[i], page.Server.MapPath(zipTempPath + filenames[i]));
files[i] = page.Server.MapPath(zipTempPath + filenames[i]);
}

//製作popup zip download
bool isSuccess = DoZipPopUpDownload(page, files, zipname);

//清空暫存
Directory.Delete(zipTempPath, true);
return isSuccess;
}
else
{
return false;
}

}
catch
{
return false;
}
}

使用單一使用者模式還原資料庫

alter database vatc4 set single_user with rollback immediate;
go;
RESTORE DATABASE [VATC4] FROM  DISK = N'D:\Tools\04Temp\20090324.bak' WITH  FILE = 1,  MOVE N'VATC4_Data' TO N'E:\DB\家樂福\VATC4.mdf',  MOVE N'VATC4_Data2' TO N'E:\DB\家樂福\VATC_1.mdf',  MOVE N'VATC4_Log' TO N'E:\DB\家樂福\VATC4.ldf',  NOUNLOAD,  REPLACE,  STATS = 10;
go;
ALTER DATABASE VATC4 SET multi_user;
go;

asp.net 1.1升級2.0後,整合其他2.0專案發生問題

asp.net1.1升級2.0後,整合其他2.0專案,發現原2.0專案之AJAX不會Work. 不管怎麼找config中設定,都確定該註冊之項目都已註冊,但AJAX就是無法正確Work. 後來終於發現,因專案是由1.1升級上來的,在web.config中發現有一項設定

就是此設定讓AJAX無法work,至msdn查詢後,才知道為什麼此設定會讓AJAX無法work,說明如下
指定 ASP.NET 應用程式的 XHTML 呈現模式。模式可以是在下表中列出的其中一個值。預設值為 Transitional (XHTML 1.0 Transitional)。
Legacy:為了一致性,會將所做的一些呈現變更還原成 v1.1 的呈現行為。
設定後,會輸出非XHTML模式,導致AJAX無法正常執行。

Sqlexception 判斷錯誤類型

use a try catch block like this: 

try
{
  ...
  ...
}
catch (SqlException ex)
{
  switch (ex.Number) 
    { 
        case 4060: // Invalid Database 
                  ....
                  break;
        case 18456: // Login Failed 
                  ....
                  break;
        case 547: // ForeignKey Violation 
                  ....
                  break;
        case 2627: // Unique Index/ Primary key Violation/ Constriant Violation 
                  ....
                  break;
        case 2601: // Unique Index/Constriant Violation 
                  ....
                  break;
        default: 
                  ....
                  break;    
       } 
}

如何強迫 .Net 應用程式輸出英文的例外訊息

System.Threading.Thread.CurrentThread.CurrentCulture = 
    new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentUICulture = 
    new System.Globalization.CultureInfo("en-US");
除了可以用在 Console Program 外,同樣的程式碼一樣也可以運用在 ASP.NET、Windows Form 或任何其他 .Net 應用程式中喔!

mssql 清除log檔

backup log 資料庫名稱 with truncate_only; 
dbcc shrinkdatabase(資料庫名稱);

javascript get aspnet textbox value

方法如下,請參考
document.getElementById("<%= TextBoxID.ClientID %>").value

刪除oracle user,tablespace,role 等資料

下方以各user,tablespace,role為例,請參考.. 1.步驟1先刪除user cascade的用途為,一併刪除該user相關的資料! 所以會將該user擁有之table一併刪除!
drop user invoice cascade;
drop user exchange cascade;
drop user his cascade;
drop user einvoiceaccount cascade;
drop user einvoicereader cascade;
2.步驟2刪除tablespace 刪除user後,會將其擁有之table,view,procduce..等也一併刪除, 所以現在的tablespace理論上是一個空的表空間
drop tablespace invoice;
drop tablespace exchange;
drop tablespace his;
3.步驟3刪除特殊建立之role..等,如aspnet provider會建立的role!
drop ROLE ORA_ASPNET_MEM_BASICACCESS;
drop ROLE ORA_ASPNET_MEM_FULLACCESS;
drop ROLE ORA_ASPNET_MEM_REPORTACCESS;
drop ROLE ORA_ASPNET_PERS_BASICACCESS;
drop ROLE ORA_ASPNET_PERS_FULLACCES;
drop ROLE ORA_ASPNET_PERS_REPORTACCESS;
drop ROLE ORA_ASPNET_PROF_BASICACCESS;
drop ROLE ORA_ASPNET_PROF_FULLACCESS;
drop ROLE ORA_ASPNET_PROF_REPORTACCESS;
drop ROLE ORA_ASPNET_ROLES_BASICACCESS;
drop ROLE ORA_ASPNET_ROLES_FULLACCESS;
drop ROLE ORA_ASPNET_ROLES_REPORTACCESS;
drop ROLE ORA_ASPNET_SESSN_FULLACCESS;
drop ROLE ORA_ASPNET_SMAP_FULLACCESS;
drop ROLE ORA_ASPNET_WEVNT_FULLACCESS;
此資料庫只有建立自訂的tablespace 並建立user對應新建立之tablespace, 並無對應到其他原有tablespace, 因此只要刪除此兩部份,即可乾淨的環原未新增前狀態! 較特殊的是role 因為有用oracle for aspnet provider, 所以變會建立對應之role 所以也要一併刪除!

EXP / IMP Oracle 資料庫

EXP 資料庫
C:\>exp system/bankpro@oracle9i file=C:\invoice.exp log=C:\invoice.log owner=invoice indexes=y rows=y constraints=y feedback=1000 tts_full_check=y
IMP 資料庫 1.先以具DBA角色權限以上之使用者登入oracle資料庫
C:\>sqlplus system/bankpro@oracle9i
2.執行Script,目的建立TableSpace & User
SQL> start c:\createtablespace.sql;

CREATE TABLESPACE INVOICE DATAFILE
'C:\ORACLE\ORADATA\ORACLE9I\INVOICE.ORA' SIZE 200M AUTOEXTEND ON NEXT 1024M MAXSIZE UNLIMITED
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO;

CREATE USER INVOICE
IDENTIFIED BY VALUES 'CC58BA69EDD100F1'
DEFAULT TABLESPACE INVOICE
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
-- 17 Roles for INVOICE
GRANT DBA TO INVOICE;
GRANT CONNECT TO INVOICE;
GRANT ORA_ASPNET_MEM_FULLACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_MEM_BASICACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_PERS_FULLACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_PROF_FULLACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_SMAP_FULLACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_MEM_REPORTACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_PERS_BASICACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_PROF_BASICACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_ROLES_FULLACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_SESSN_FULLACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_WEVNT_FULLACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_PERS_REPORTACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_PROF_REPORTACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_ROLES_BASICACCESS TO INVOICE WITH ADMIN OPTION;
GRANT ORA_ASPNET_ROLES_REPORTACCESS TO INVOICE WITH ADMIN OPTION;
ALTER USER INVOICE DEFAULT ROLE ALL;
-- 5 System Privileges for INVOICE
GRANT CREATE SESSION TO INVOICE;
GRANT CREATE ANY TABLE TO INVOICE;
GRANT SELECT ANY TABLE TO INVOICE;
GRANT CREATE ANY PROCEDURE TO INVOICE;
GRANT UNLIMITED TABLESPACE TO INVOICE;
3.開始執行TableSpace的匯入
C:\>imp system/bankpro@oracle9i fromuser=INVOICE touser=INVOICE file=C:\invoice.exp log=C:\invoice.log ignore=y indexes=y rows=y constraints=y feedback=1000
4. 重建Role對應
-- 6 Object Privileges for INVOICE GRANT DELETE, INSERT, SELECT, UPDATE ON  EXCHANGE.COMPANY TO INVOICE;GRANT DELETE, INSERT, SELECT, UPDATE ON  EXCHANGE.SALESINVOICE TO INVOICE;GRANT DELETE, INSERT, SELECT, UPDATE ON  EXCHANGE.SALESINVOICEDETAIL TO INVOICE;GRANT DELETE, INSERT, SELECT, UPDATE ON  EXCHANGE.SALESINVOICENG TO INVOICE;GRANT DELETE, INSERT, SELECT, UPDATE ON  HIS.B2CINVOICEACTIONHISTORY TO INVOICE;GRANT DELETE, INSERT, SELECT, UPDATE ON  HIS.B2CINVOICEDETAILACTIONHISTORY TO INVOICE;
-- 3 Object Privileges for EINVOICEACCOUNT GRANT DELETE, INSERT, SELECT, UPDATE ON  EXCHANGE.COMPANY TO EINVOICEACCOUNT;GRANT DELETE, INSERT, SELECT, UPDATE ON  HIS.B2CINVOICEACTIONHISTORY TO EINVOICEACCOUNT;GRANT DELETE, INSERT, SELECT, UPDATE ON  HIS.B2CINVOICEDETAILACTIONHISTORY TO EINVOICEACCOUNT;
GRANT ORA_ASPNET_MEM_BASICACCESS TO ORA_ASPNET_MEM_FULLACCESS;GRANT ORA_ASPNET_MEM_REPORTACCESS TO ORA_ASPNET_MEM_FULLACCESS;GRANT ORA_ASPNET_PERS_BASICACCESS TO ORA_ASPNET_PERS_FULLACCESS;GRANT ORA_ASPNET_PERS_REPORTACCESS TO ORA_ASPNET_PERS_FULLACCESS;GRANT ORA_ASPNET_PROF_BASICACCESS TO ORA_ASPNET_PROF_FULLACCESS;GRANT ORA_ASPNET_PROF_REPORTACCESS TO ORA_ASPNET_PROF_FULLACCESS;GRANT ORA_ASPNET_ROLES_REPORTACCESS TO ORA_ASPNET_ROLES_FULLACCESS;GRANT ORA_ASPNET_ROLES_BASICACCESS TO ORA_ASPNET_ROLES_REPORTACCESS;
5.重建AspNet Provider
C:\>sqlplus system/bankpro@oralce9i
將建置aspnet provider之script copy至c:\aspnet\路徑下!
SQL> start c:\aspnet\InstallAllOracleASPNETProviders.sql;
6.將有錯誤之procduce & function重新編譯過後即可!

select 包含 Row_Number

查詢所有產品編號,並加上行數!
select Row_Number() over (order by papdno) as RowNt,papdno from pm10d;
[輸出] 1 pdno1 2 pdno2 3 pdno3 . . . 10 pdno10 將行數轉為字串,並補0 select right('00'+ltrim(Row_Number() over (order by papdno)),3) as RowNt ,papdno from pm10d; [輸出] 001 pdno1 002 pdno2 003 pdno3 . . . 010 pdno10

Restore Sql Server 系統資料表Master

因為Master資料表的還原,需要將資料庫伺服器服務啟動於之SingleUser模式, 操作上較為複雜.因此特地將操作步驟寫下~ 1.先停止欲還原之資料庫伺服器服務!如下圖: 2.將資料庫伺服器服務,啟動於SingleUser模式! 於cmd視窗下,輸入指令: "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe" -m 輸入後會出現一連串的啟動訊息,一般無錯誤訊息發生即完成SingleUser模式之啟動! 3.使用SSMS資料庫管理工具開啟並執行Script,指令如下: RESTORE DATABASE master FROM disk='c:\master.bak' 執行後得到訊息如下圖: 4.停止SingleUser模式之資料庫伺服器! 此步驟只要將剛剛啟動伺服器用的cmd視窗關閉,即停止伺服器服務了! 5.重新啟動資料庫伺服器 此步驟可參考步驟一,選擇啟動之選項即可!

取得sql server系統日期

select getdate();

用Sql分析Profiler錄下之Trace資料

Script如下,參考~ SELECT top 5 substring(TextData,1,100) as SqlCmd, sum(Duration) as Duration, sum(Reads) as Reads, sum(Writes) as Writes, sum(cpu) as cpu, avg(Duration) as AvgDura FROM fn_trace_gettable('C:\Test\deadlock.trc', Default) where TextData is not null group by substring(TextData,1,100) order by AvgDura desc

IOC ( Inversion of Control )

IoC模式基本上是一個高層的概念,在 Martin Fowler 的 Inversion of Control Containers and the Dependency Injection pattern 中談到,實現IoC有兩種方式:Dependency Injection與Service Locator,Spring 所採用的是Dependency Injection 來實現 IoC,中文翻譯為依賴注入,依賴注入的意義是:「保留抽象介面,讓組件依賴於抽象介面,當組件要與其它實際的物件發生依賴關係時,藉過抽象介面來注入依賴的實際物件。」 看看下面這個程式:

public class BusinessObject {
  private FloppyWriter writer = new FloppyWriter();
  ....
  public void save() 
  {
    ...
    writer.saveToFloppy();
  }
} 

BusinessObject 依賴於實際的 FloppyWriter,為了讓 BusinessObject 獲得重用性,不讓 BusinessObject 直接依賴於實際的 FloppyWriter,而是依賴於抽象的介面:

public interface IDeviceWriter 
{
  public void saveToDevice();
} 

public class BusinessObject 
{ 
  private IDeviceWriter writer;
  
  public void setDeviceWriter(IDeviceWriter writer) 
  {
    this.writer = writer;
  }

  public void save() 
  {
    .... 
    writer.saveToDevice();
  }
}

public class FloppyWriter implement IDeviceWriter 
{
  public void saveToDevice() 
  {
    .... // 實際儲存至Floppy的程式碼
  }
} 

public class UsbDiskWriter implement IDeviceWriter 
{
  public void saveToDevice() 
  {
    ....// 實際儲存至UsbDisk的程式碼
  }
} 
如果今天BusinessObject想要與UseDiskWriter物件發生依賴關係,可以這麼建立: businessObject.setDeviceWriter(new UsbDiskWriter()); 由於BusinessObject依賴於抽象介面,在需要建立依賴關係時,可以透過抽象介面注入依賴的實際物件。 依賴注入在Martin Fowler的文章中談到了三種實現方式:Interface injection、Setter injection 與 Constructor injection。並分別稱其為Type 1 IoC、Type 2 IoC 與 Type 3 IoC。 上面的BusinessObject所實現的是Type 2 IoC,透過Setter注入依賴關係,而Type 3 IoC,則在是建構式上注入依賴關係,例如:
public class BusinessObject 
{ 
  private IDeviceWriter writer; 

  public BusinessObject(IDeviceWriter writer) 
  {
    this.writer = writer;
  }

  public void save() 
  {
    ....
    writer.saveToDevice();
  }
} 
Spring 鼓勵的是 Setter injection,但也允許您使用 Constructor injection,使用 Setter 或 Constructor 來注入依賴關係視您的需求而定,使用 Constructor 的好處之一是,您可以在建構物件的同時一併完成依賴關係的建立,然而如果要建立的物件關係很多,則會在建構式上留下一長串的參數,這時使用 Setter 會是個不錯的選擇,另一方面,Setter 可以有明確的名稱可以瞭解注入的物件會是什麼,像是setXXX()這樣的名稱會比記憶Constructor上某個參數位置代表某個物件來得好。 Type 1 IoC是Interface injection,使用Type 1 IoC時會要求實作介面,這個介面是為容器所用的,容器知道介面上所規定的方法,它可以呼叫實作介面的物件來完成依賴關係的注入,例如:
public interface IDependencyInjection 
{
  public void createDependency(Map dependObjects); 
} 

public class BusinessObject implement IDependencyInjection 
{
  private Map dependObjects;
  
  public void createDependency(Map dependObjects) 
  {
    this.dependObject = dependObjects;
    // 在這邊實現與BusinessObject的依賴關係   
    ......
  }
  
  public void save() 
  {
    ....
    writer.saveToDevice();
  } 
} 
如果要完成依賴關係注入的物件,必須實現IDependencyInjection介面,並交由容器管理,容器會呼叫被管理物件的createDependency()方法來完成依賴關係的建立。 在上面的例子中,Type 1 IoC要求BusinessObject實現特定的介面,這就使得BusinessObject依賴於容器,如果日後BusinessObject要脫離目前這個容器,就必須修改程式,想想在更複雜的依賴關係中產生更多複雜的介面,組件與容器(框架)的依賴會更加複雜,最後使得組件無法從容器中脫離。 所以Type 1 IoC具有強的侵入性,使用它來實現依賴注入會使得組件相依於容器(框架),降低組件的重用性。 Spring的核心是個IoC容器,您可以用Setter或Constructor的方式來實現您的業務物件,至於物件與物件之間的關係建立,則透過組態設定,讓Spring在執行時期根據組態檔的設定來為您建立物件之間的依賴關係,您不必特地撰寫一些Helper來自行建立這些物件之間的依賴關係,這不僅減少了大量的程式撰寫,也降低了物件之間的耦合程度。

MSSQL 交易層級改為Snapshot層級

開啟snapshot層級(開啟後會取代原預設Read Commited層級) ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON; ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON; 關閉snapshot層級 ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION OFF ; ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT OFF; --[開啟SNAPSHOT_ISOLATION] ALTER DATABASE VATC4 SET single_user with rollback immediate; go ALTER DATABASE VATC4 SET single_user; go ALTER DATABASE VATC4 SET ALLOW_SNAPSHOT_ISOLATION ON; go ALTER DATABASE VATC4 SET READ_COMMITTED_SNAPSHOT ON; go ALTER DATABASE VATC4 SET multi_user; go --[關閉SNAPSHOT_ISOLATION] ALTER DATABASE VATC4 SET single_user with rollback immediate; go ALTER DATABASE VATC4 SET single_user; go ALTER DATABASE VATC4 SET ALLOW_SNAPSHOT_ISOLATION OFF; go ALTER DATABASE VATC4 SET READ_COMMITTED_SNAPSHOT OFF; go ALTER DATABASE VATC4 SET multi_user; go

SqlServer Cache後的差異

下方為正常執行一張折讓單開立所耗用之時間. 下方為經過SqlServer幫我們Cache後的開立折讓單耗用時間 可以明顯看出來時間上的差異,所以在測試耗用效能時, 必須相當注意,可用下方指令,清除SqlServer的Cache, 保持無Cache狀態測試才有參考價值! DBCC dropcleanbuffers; 當然上方的網頁回應時間數據,也可能是經過網頁伺服器的Cache後, 才有這麼漂亮的數據!

html元件 vs Asp元件onclick事件的不同

<%@ Page Language="C#" AutoEventWireup="true" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <%--JavaScript—%>
    <script type="text/javascript">
         function ClientSideScript() { alert('ClientSide!'); }
    </script>
    <%--Inline Code—%>
    <script language="CS" runat="server">
         protected void ServerSideScript(object sender, EventArgs e) { Response.Write("alert('ServerSide!');"); }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <input type="button" id="Button2" runat="server" value="html_button" onserverclick="ServerSideScript" onclick="ClientSideScript();"      />
            <asp:button          id="Button1" runat="server" Text="aspx_button"  OnClick="ServerSideScript"       OnClientClick="ClientSideScript()" />
        </div>
    </form>
</body>
</html>

可比較上方asp元件與html元件的差異..

ServerSide:OnClick
ClientSide:OnClientClick

ServerSide:onserverclick
ClientSide:onclick

測試code

在 <code> 及 </code> 之間的東西要先做處理。 - 「&」(AND符號) 換成 '&amp;' - 「"」(雙引號) 換成 '&quot;' - 「'」 (單引號) 換成 '&#039;' - 「<」 (小於符號) 換成 '&lt;' - 「>」 (大於符號) 換成 '&gt;'

vs2003升級vs2008 ajax差異

<asp:TextBox ID="_Amount" onkeyup="CheckNumber(this)" ReadOnly="false" name="tbAmount" Style="text-align: right" runat="server" Width="80px" CssClass="InputText"> TextBox之ReadOnly屬性必須為False,否則於javascript改變其值, 並postback回server side時,server side並不會讀取此值!! 此情況於vs2003並不會發生?!不知道其原因!注意之!

LINQ強大威力

今天下午花了些時間研究 LINQ,這果然是殺手級的東西啊! 光是去 http://www.asp.net/learn/linq-videos/ 這裡看了四個影片,就覺得真是不可思議的強,LINQ to SQL 真是好東西,解決了許多之前 Typed DataSet 做不到的事,又將整個資料庫操作的過程徹底的物件化與簡化,跟 SQL Server 的整合又更完整了。 大家有興趣可以去看看影片,沒幾分鐘: http://www.asp.net/learn/linq-videos/ 底下是在 Scott Guthrie 網站的文章,寫得很清楚且圖文並茂,看完影片可以來這裡建立更完整的觀念: Part 1: Introduction to LINQ to SQL Part 2: Defining our Data Model Classes Part 3: Querying our Database Part 4: Updating our Database Part 5: Binding UI using the ASP:LinqDataSource Control Part 6: Retrieving Data Using Stored Procedures Part 7: Updating our Database using Stored Procedures Part 8: Executing Custom SQL Expressions Part 9 - Using a Custom LINQ Expression with the control

ADO.NET Entity Framework 概觀

http://www.microsoft.com/taiwan/msdn/columns/jhu_ming_jhong/ADO.NET_Entity_Framework_Overview.htm