[轉]ASP.NET MVC3 Razor 初心者容易遇到的問題

http://demo.tc/Post/679

在 ASP.NET MVC 3 中增加了一種新的 視圖引擎( View Engine )優點相當的多因此 demo 相信如果要寫 ASP.NET MVC 3 的朋友絕大多數都會選擇使用 Razor 但因為寫法改變,剛開始可能是會十分不習慣,甚至一些很簡單的東西還要 Try 很多次才會成功,因此 demo 特別整理了一下,我寫 demo小鋪時有停頓的地方,期望有需要的網友可以更快的接觸 Razor 這相當優良的 視圖引擎( View Engine )

Ads by Yahoo!

  • 雲端進銷存會計庫存管理系統

    Web-ACC.com

    跨平台且可以使用智慧型手機登錄的進銷存管理系統, 線上免費試用不需安裝APP

  • 台塑商業流程管理BPM方案

    www.efpg.com.tw

    FPG-Flow可整合ERP內建基本表單,彈性設計,強化bpm環境支援執行力。

  • 檔案版本:3
  • 最後更新:2012/8/14 上午 10:41:29
  • 2011-06-13:增加電子郵件與@() 的用法說明

●基本寫法介紹

為了讓文章更清楚這裡先假設以下輸出值

  1. Model.Content=“<a href=’http://demo.tc’ >demo小鋪</a>”
  2. item.Key=“<span>IsKey</span>”
  3. item.Value=“<span>IsValue</span>”

Razor Aspx
程式碼區塊:無輸出
@{
    int a = 123;
    string b = "demoshop";
 }
<%
    int a = 123;
    string b = "demoshop";
%>
HTML Encoded:<a href=’http://demo.tc’ >demo小鋪</a>
<div>
    @Model.Content
</div>
<div>
    <%:Model.Content %>
</div>
HTML Unencoded:demo小鋪
<div>
    @Html.Raw(Model.Content)
</div>
<div>
    <%=Model.Content %>
</div>
混合程式碼:<span>IsKey</span>
@foreach (var item in collection)
{
    <span>@item.Key</span>
}
<%foreach (var item in collection)
    {%>
        <span><%:item.Key %></span>
<%%>
混合程式碼:我是純文字 <span>IsValue</span>
@foreach (var item in collection)
{
    <text>我是純文字</text> @item.Value
}
<%foreach (var item in collection)
    {%>
        我是純文字 <%:item.Key %>
<%%>
混合程式碼:我是純文字 <span>IsValue</span>
@foreach (var item in collection)
{
    @:我是純文字 @item.Value
}
<%foreach (var item in collection)
    {%>
        我是純文字 <%:item.Key %>
<%%>
混合程式碼:目前是第 0. 目前是第 1. 目前是第 2.
@for (int i = 0; i < 3; i++)
{
    @:目前是第 @i. 
}
<%for (int i = 0; i < 3; i++)
  {%>
      目前是第<%=%>.
<%%>
三元運算子:<a href=’http://demo.tc’ >demo小鋪</a>
@(Model.Content == "" ? "沒貨" : Model.Content)

<%:Model.Content==""?"沒貨": Model.Content%>
註解:無輸出
@*你看不到我*@
<%--你看不到我--%>

以上部分表格參考C# Razor Syntax Quick Reference


●神奇的 [at] 符號

@念法是 [at] ,台灣俗稱小老鼠,在 Razor 中它有舉足輕重的用處,因為同時列在上表 demo 覺得有點亂因此在給它一個區塊來放它,Razor 很有趣!基本上它會判斷空白字元與斷行符號

●比如說我需要輸出 item.Key和item.Value 的值可以有以下的寫法

@item.Key@item.Value

@(item.Key + item.Value)

●如果你需要 Unencoded

@:item.Key @item.Value

●如果要輸出 I @ Taiwan

I @@ Taiwan

●email 的輸出根本不需要有任何調整

test@test.com

demo廢言前文有提到 Razor 會判斷空白字元和斷行符號,也因為 Email 的 @ 前後都有字所以會很聰明的認定它為字串,並不會當變數看,再來看下面一個範例會更清楚

依據上面的範例今天我們要輸出 demo歡迎登入的字樣,網友們可能會這樣寫

@User.Identity.Name 歡迎登入 //變數和文字中利用一個半型空白來斷開

但這有可能是我們不想要的效果,那就可以利用 @() 包住變數將它改寫為

@(User.Identity.Name)歡迎登入

就會是黏在一起的文字了


●同場加映HTML5 支援

在 HTML5 中有一個很不錯的資料記錄標籤 data-xxx ,因為使用他不需要自行定義標籤因此 demo 還滿喜歡的而且利用 jQuery 就可以相當簡單的把 這標籤的值取出( 官方 API )但是如果你想在 ASP.NET MVC3 中使用需要調整一下寫法

@Html.TextBoxFor(model => model.Key, new {data_test="500" })

必須要使用底線,編譯的時候會自動轉換

參考文章

[轉帖][ASP.NET & jQuery]使用jQuery的Ajax存取資料(ashx,aspx,asmx)

來源:http://www.dotblogs.com.tw/hatelove/archive/2009/12/22/jqueryajax.aspx

前言

之前沒太多xmlHttpRequest與撰寫CallBack javascript的經驗,
一開始寫程式,就被AJAX.NET的UpdatePanel養壞了。

慢慢瞭解到UpdatePanel只是個偽裝的ajax,背後付出的effort仍然相當龐大後,
才慢慢的想去瞭解ajax該如何撰寫。

想要擺脫AutoPostBack付出的龐大成本,javascript與ajax的能力就一定要能養成。

這邊搭配jQuery的ajax功能,來示範一下在ASP.NET上的作法。

Play it

這邊範例的需求是,我們有兩個textbox,一個是ID,一個是Name,
當輸入ID改變時,要帶出Name的資料。(學會之後,就可以擺脫AutoPostBack=true,Text_Changed的方式啦…)

在這裡我把ID帶Name的程式碼,分別寫在三種檔案上來處理。

  1. .ashx(泛型處理常式)
  2. .aspx(一般網頁頁面)
  3. .asmx(Web Service)

為方便各位下載sample code後可以直接跑,
這邊的Name,就是取first name,加上js傳過來的第二個參數MiddleName:『middle』字樣,
last name的部分,則是測試Session值能否被Server端讀取到,所以再補上Session的值『91』來紀念代表從server端回傳的Name。

也就是ajax return回來的值是:畫面上輸入的first name+『middle』+ Session[“LastName”]
接著,讓我們繼續看下去。

  1. .ashx
    • 先新增一個泛型處理常式檔案,記得引用System.Web.SessionState與實作IReadOnlySessionState,我們才能在程式碼裡面讀到Session。
    • 接參數的部分,使用context.Request.Form[“參數名稱]
    • 最後return的值,則是使用context.Response.Write(回傳值)
      ashx
  2. .aspx
    • 先新增一個.aspx,接著只保留第一行<%@ Page %>那行
    • 在Page_Load的事件撰寫要處理的程式碼
    • 接參數的部分,使用的是Request.Form[“參數名稱]
    • 最後return的值,則是直接Response.Write(回傳值)
      aspx
  3. .asmx
    • 先新增一個.asmx,接著把[System.Web.Script.Services.ScriptService]取消註解
    • 新增一個public的method,叫做GetFullName,method上頭加上[WebMethod(EnableSession=true)],才能使用Session
    • return的資料直接return即可,雖然return的型別是string,但是javascript實際接到的是xml格式的字串
      asmx

有了這三種處理ID回傳Name的程式後,
來看看我們的頁面要怎麼撰寫。

網頁的部分,用三組來當試驗:

01 <body>
02     <form id="form1" runat="server">
03     <div>
04         .ashx: first name<asp:TextBox ID="txtIDbyAshx" runat="server"></asp:TextBox>
05         full name<asp:TextBox ID="txtNamebyAshx" runat="server"></asp:TextBox><br />
06         
07         .aspx: first name<asp:TextBox ID="txtIDbyAspx" runat="server"></asp:TextBox>
08         full name<asp:TextBox ID="txtNamebyAspx" runat="server"></asp:TextBox><br />
09         
10         .ashx: first name<asp:TextBox ID="txtIDbyAsmx" runat="server"></asp:TextBox>
11         full name<asp:TextBox ID="txtNamebyAsmx" runat="server"></asp:TextBox><br />
12     </div>
13     </form>
14 </body>

接著使用jQuery的ajax功能,注意的地方:

  1. 註冊在change事件
  2. ajax option:
    • type:使用post
    • url的部分,web service需加上method名稱
    • 傳入參數的部分,可用json,或一般字串使用『&』串接,如同一般的post或QueryString
    • ajax成功的話,會進入success,失敗會進入error
    • 成功回傳的字串,在success的function(回傳值)
    • web service回傳為XML格式,需自行parse使用

jQuery

結論

ajax的能力未來一定得具備,因為不管是一般的html、畫面冗重的Web form、或是ASP.NET MVC,
要等待Post的過程,對User來說都是種折磨。

既然沒有多難,就順手把它學起來吧!

In 91 it!!

Sample Code: jQueryAjax.zip

ASP.NET C# 3個執行SQL的方法說明

ExecuteNonQuery()

用法:ExecuteNonQuery用來執行INSERT、UPDATE、DELETE和其他沒有返回值得SQL命令。例如:CREATE DATABASE 和 CREATE TABLE 命令。

當使用 INSERT、UPDATE、DELETE時,ExecuteNonQuery返回被命令影響的行數。若是用在對其他命令,則返回-1。

ExecuteScalar()

用法1:ExecuteScalar 執行一個SQL命令返回結果集的第一列的第一行。它經常用來執行SQL的COUNT、AVG、MIN、MAX 和 SUM 函數,這些函數都是返回單行單列的結果集。

‘注意:’ExecuteScalar 一般返回一個Object類型,因此必須把它轉換為強類型。如果轉換不正確,.NET框架就會引發 InvalidCastException異常。

用法2:ExecuteScalar 的另一個普遍的用法是從資料庫中檢索BLOB(二進位大物件)。下面的例子從Pubs資料庫的Pub_Info表的Logo欄位中檢索圖像,並把他封裝到一個點陣圖中。

MemoryStream stream = new MemoryStream();

SqlConnection conn = new SqlConnection(“連線字串”);

try
{
conn.open();
SqlCommand cmd = new SqlCommand(“SELECT logo FROM pub_info WHERE pub_id=’0736′”, conn);
byte[] blob = (byte[]) cmd.ExecuteScalar();
stream.Write(blob, 0, blob.Length);
Bitmap bitmap = new Bitmap(stream);

// TODO:使用點陣圖
bitmap.Dispose();
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
stream.Close();
conn.Close();
}

用法3:您也許對如何把BLOB寫入資料庫感興趣,答案是在包裝了INSERT命令(該命令中包含了類型為byte[]的輸入參數)的命令物件上調用ExcuteNonQuery方法。下面例子在Pubs資料庫的Pub_Info表中插入一條記錄,記錄的Logo欄位包含一個BLOB。

— 定義和初始化blob變數
FileStream stream = new FileStream(“Logo.jpg”, FileMode.Open);
byte[] blob = new byte[stream.Length];
stream.Read(blob, 0, (int) stream.Length);
stream.Close();
SqlConnection conn = new SqlConnection(“連線字串”);

try
{
conn.open();
SqlCommand cmd = new SqlCommand(“INSERT INTO pub_info(pub_id, logo) VALUES(‘9937’, @logo)”, conn);
cmd.Parameters.Add(“@logo”, blob);
cmd.ExecuteNonQuery();
}
catch(SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
stream.Close();
conn.Close();
}

ExecuteReader()

用法:ExecuteReader 方法存在的目的只有一個:盡可能快地對資料庫進行查詢並得到結果。ExecuteReader 返回一個DataReader物件:如果在SqlCommand物件中調用,則返回SqlDataReader;如果在OleDbCommand物件中調用,返回的是OleDbDataReader。可以調用DataReader的方法和屬性反覆運算處理結果集。它是一個快速枚舉資料庫查詢結果的機制,是唯讀、只進的。對SqlDataReader.Read的每次調用都會從結果集中返回一行。

[筆記] string.Format 格式整理

前言

常用到string.Format方法,每次用到都要上網查說明,心想不如整理成文章懶人包方便自己日後查詢,若有錯誤的地方,請各位不吝指教

 

標準數值格式

格式

說明

Format

Input

Output

補充

C 貨幣 {0:C} 1234.567 NT$1,234.57 Currency C預設到小數2位…C1取小數一位,C3取小數三位…
D 十進位 {0:D} 1234 1234 Decimal 只支援整數資料型別(integral types),D後面數字表示指定的位數
E 科學指數 {0:E} 1234 1.234000E+003 Scientific
F 固定 {0:F} 1234.4567 1234.46 Fixed-point
G 一般 {0:G} 1234.567 1234.57 General
N 數字 {0:N} 120000 120,000.00 Number每三位數用 “,” 隔開
P 百分比 {0:P} 0.25 25.00% Percent輸入數值*100 ; 預設取小數2位,P0可取小數
R 來回 {0:R} 0.25 0.25 Round-trip只支援Double、Single
X 十六進位 {0:R} 123 7B Hexadecimal:只支援整數資料型別(integral types)



自訂數值格式

格式

說明

Format

Input

Output

補充

0 零值預留位置 {0:000.000} 12.3 012.300 Zero placeholder
# 數字預留位置 {0:###.###} 12.3 12.3 Digit placeholder 
#,,:1234567890→1235
#,,,:1234567890→1
#,##0,,:1234567890→1,235
. 小數點 {0:0.0} 12.3 12.3 Decimal point
, 千位分隔符號 {0:0,0} 1200 1,200 Thousand separator and number scaling
% 百分比預留位置 {0:0%} 0.25 25%  Percentage placeholder
e 科學標記法 {0:0e+0} 123 1e+2 Scientific notation
\ 跳脫字元 {0:00\n0} 123 12 3  Escape character

 

備註:自訂數值格式化:{0:(###) ### – ####} ,1234567890→(123) 456 – 7890,詳細請參考 自訂數值格式輸出範例

 

標準DateTime格式

測試時間:2012/3/11 下午 01:02

格式

說明

Format

Output

補充

d 簡短日期 {0:d} 2012/3/11 MM/dd/yyyy
D 完整日期 {0:D} 2012年3月11日  
f 完整可排序日期/時間 {0:f} 2012年3月11日 下午 01:02  
F 完整可排序日期/時間 {0:F} 2012年3月11日 下午 01:02:03  
g 一般可排序日期/時間 {0:g} 2012/3/11 下午 01:02  
G 一般可排序日期/時間 {0:G} 2012/3/11 下午 01:02:03  
M、m 月日 {0:m} 3月11日  
o 來回日期/時間 {0:o} 2012-03-11T13:02:03.0000000  
R、r RFC1123 {0:R} Sun, 11 Mar 2012 13:02:03 GMT  
s 可排序日期/時間 {0:s} 2012-03-11T13:02:03  
t 簡短時間 {0:t} 下午 01:02 HH:mm
T 完整時間 {0:T} 下午 01:02:03 HH:mm:ss
u 通用可排序日期/時間 {0:u} 2012-03-11 13:02:03Z yyyy’-‘MM’-‘dd HH’:’mm’:’ss’Z’
U 通用可排序日期/時間 {0:U} 2012年3月11日 上午 05:02:03  
Y、y 年月 {0:y} 2012年3月  

備註:輸出日期格式顯示可以依據〈控制台〉 〈地區語言選項〉做修改,詳細請參考:標準DateTime格式輸出範例String.Format yyyy/MM/dd? 誤會大了 by 黑暗大

 

自訂DateTime格式

測試時間:2012/3/11 下午 02:21

格式

說明

Format

Output

補充

dd 月份日期 {0:dd} 11  
ddd 星期幾的縮寫 {0:ddd} 星期日 Sun
dddd 星期幾的完整名稱 {0:dddd} 星期日 Sunday
f, ff… 秒數 {0:fff} 364  
gg,… 時期或時代 {0:gg} 西元  
hh 小時(12 小時制) {0:hh} 02  
HH 小時(24 小時制) {0:HH} 14  
mm 分鐘 {0:mm} 21  
MM 月份 {0:MM} 03  
MMM 月份的縮寫名稱 {0:MMM} 三月 Mar
MMMM 月份的完整名稱 {0:MMMM} 三月 March
ss 秒數 {0:ss} 49  
tt A.M./P.M {0:tt} 下午  
yy 兩個位數的數字來表示年份 {0:yy} 12  
yyy 三個位數的數字來表示年份 {0:yyy} 2012  
yyyy 四個位數的數字來表示年份 {0:yyyy} 2012  
zz 時差(小時) {0:zz} +08 系統時區與格林威治標準時間 (GMT) 時差
zzz 時差(小時&分鐘) {0:zzz} +08:00 系統時區與格林威治標準時間 (GMT) 時差 (帶正負號)
: 時間分隔符號 {0:hh:mm:ss} 02:29:06  
/ 日期分隔符號 {0:yyyy/MM/dd} 2012/03/11  

詳細請參考 自訂DateTime格式字串

 

字串格式

1 string myBook = "book";
2 string myPencil = "pencil";
3 string FormatString = String.Format("This is a {0}, not a {1}", myBook, myPencil);
4 Response.Write(FormatString);

Result:This is a book, not a pencil

ASP.net C# 陣列操作

001 using System;
002 using System.Collections;
003
004 public partial class _00_Basic : System.Web.UI.Page
005 {
006     //當頁面正在載入時所要執行動作。
007     protected void Page_Load(object sender, EventArgs e)
008     {
009         //====  建立陣列資料  ==============================================
010
011         //宣告一維字串陣列並加入內容。(內容多少決定大小)
012         string[] arrStringA = { "A1""A2""A3""A4" };
013
014         //宣告一維字串陣列並設定大小與加入內容。
015         string[] arrStringB = new string[4];
016         arrStringB[0] = "B1"; arrStringB[1] = "B2"; arrStringB[2] = "B3"; arrStringB[3] = "B4";
017
018         //宣告一維陣列清單會依照增加項目的多少而動態調整大小。
019         ArrayList arrltStringC = new ArrayList();
020         arrltStringC.Add("C1"); arrltStringC.Add("C2"); arrltStringC.Add("C3"); arrltStringC.Add("C4");
021
022         //宣告一維整數陣列並加入內容。(內容多少決定大小)
023         int[] arrIntA = { 1, 2, 3, 4 };
024
025         //宣告一維整數陣列並設定大小與加入內容。
026         int[] arrIntB = new int[4];
027         arrIntB[0] = 11; arrIntB[1] = 12; arrIntB[2] = 13; arrIntB[3] = 14;
028
029         //宣告二維字串陣列並加入內容。(內容多少決定大小)
030         string[,] arrStringD = { { "a1""a2""a3" }, { "b1""b2""b3" } };
031
032         //將字串內容依照特定符號分割成為一維陣列元素。
033         string strWords = "a1 a2,a3.b1:b2,c1";
034         string[] arrStringE = strWords.Split(new Char[] { ' '',''.'':' });
035        
036         //將陣列內的元素順序反轉。
037         //Array.Reverse(arrStringA);
038         //將陣列內的元素排序
039         //Array.Soft(arrStringA);
040         //在陣列內使用二分搜尋法,尋找指定資料。(使用之前必須先用Array.Soft()方法排序過,找到資料會傳回該index值)
041         //Array.BinarySearch(arrStringA, "A3");
042         //在陣列內搜尋資料,找到傳回給索引值。
043         //Array.IndexOf(arrStringA, "A3");
044         //從arr1陣列拷貝i個元素至arr2陣列。
045         //Array.Copy(arr1, arr2, i);
046
047         //====  讀取陣列資料  ==============================================
048
049         //方法一、利用「元素長度」取得一維陣列內容值。
050         for (int i = 0; i < arrStringA.Length; i++)
051         {
052             //輸出結果。
053             Response.Write("方法一:" + arrStringA[i] + "<br />");
054         }
055
056         //方法二、利用「特定維度」取得一維陣列內容值。從0開始算,表示一維度
057         for (int i = 0; i < arrStringA.GetLength(0); i++)
058         {
059             //輸出結果。
060             Response.Write("方法二:" + arrStringA[i] + "<br />");
061         }
062
063         //方法三、利用「維度的上下限」取得一維陣列內容值。
064         for (int i = arrStringB.GetLowerBound(0); i < arrStringB.GetUpperBound(0) + 1; i++)
065         {
066             //輸出結果。
067             Response.Write("方法三:" + arrStringB[i] + "<br />");
068         }
069
070         //方法四、利用「元素個數」取得一維陣列內容值。
071         for (int j = 0; j < (int)arrltStringC.Count; j++)
072         {
073             //輸出結果。
074             Response.Write("方法四:" + arrltStringC[j] + "<br />");
075         }
076
077         //方法五、利用「集合迴圈」取得一維陣列內容值。
078         foreach (int intItem in arrIntA)
079         {
080             //輸出結果。
081             Response.Write("方法五:" + intItem.ToString() + "<br />");
082         }
083
084         //方法六、利用「二層迴圈」取得二維陣列內容值。(Length=個數,Rank=維度)
085         for (int x = 0; x < arrStringD.Rank; x++)
086         {
087             for (int y = 0; y < (arrStringD.Length / arrStringD.Rank); y++)
088             {
089                 //輸出結果。
090                 Response.Write("方法六:" + arrStringD[x, y] + "<br />");
091             }
092         }
093
094         //方法七、利用「集合迴圈」取得二維陣列內容值。
095         foreach (string strItem in arrStringD)
096         {
097             //輸出結果。
098             Response.Write("方法七:" + strItem + "<br />");
099         }
100
101         //方法八、將字串內容依照特定符號所分割成為一維陣列元素讀取。
102         foreach (string strItem in arrStringE)
103         {
104             //當陣列元素項目不是空值時。
105             if (strItem.Trim() != "")
106             {
107                 //輸出結果。
108                 Response.Write("方法八:" + strItem + "<br />");
109             }               
110         }
111
112     }
113 }

[轉帖][ASP.NET]Session

閱讀本文章之前的準備
    閱讀本文章前,需要讀者對以下知識有所瞭解。否則,閱讀過程中會在相應的內容上遇到不同程度的問題。
  
    懂得ASP/ASP.NET編程 
    瞭解ASP/ASP.NET的Session模型 
    瞭解ASP.NET Web應用程序模型 
    瞭解ASP.NET Web應用程序配置文件Web.config的作用、意義及使用方法 
    瞭解Internet Information Services(以下簡稱IIS)的基本使用方法 
    瞭解如何在Microsoft SQL Server中創建一個數據庫。
  Session模型簡介
    Session是什麼呢?簡單來說就是服務器給客戶端的一個編號。當一台WWW服務器運行時,可能有若干個用戶瀏覽正在運正在這台服務器上的網站。當每個用戶首次與這台WWW服務器建立連接時,他就與這個服務器建立了一個Session,同時服務器會自動為其分配一個SessionID,用以標識這個用戶的唯一身份。這個SessionID是由WWW服務器隨機產生的一個由24個字符組成的字符串,我們會在下面的實驗中見到它的實際樣子。
  
    這個唯一的SessionID是有很大的實際意義的。當一個用戶提交了表單時,瀏覽器會將用戶的SessionID自動附加在HTTP頭信息中,(這是瀏覽器的自動功能,用戶不會察覺到),當服務器處理完這個表單後,將結果返回給SessionID所對應的用戶。試想,如果沒有SessionID,當有兩個用戶同時進行註冊時,服務器怎樣才能知道到底是哪個用戶提交了哪個表單呢。當然,SessionID還有很多其他的作用,我們會在後面提及到。
  
    除了SessionID,在每個Session中還包含很多其他信息。但是對於編寫ASP或ASP.NET的程序與來說,最有用的還是可以通過訪問ASP/ASP.NET的內置Session對象,為每個用戶存儲各自的信息。例如我們想瞭解一下訪問我們網站的用戶瀏覽了幾個頁面,我們可能在用戶可能訪問到每個的頁面中加入:
  
  <%
  If Session(“PageViewed”) = “”Then
   Session(“PageViewed”) = 1
  Else
   Session(“PageViewed”) = Session(“PageViewed”)  1
  End If
  %> 
    通過以下這句話可以讓用戶得知自己瀏覽了幾個頁面:
  
  
  <%
  Response.Write(“You have viewed ” &; Session(“PageViewed”) &; ” pages”)
  %> 
  
    可能有些有些讀者會問:這個看似像是數組的Session(「..」)是哪裡來的?需要我定義嗎?實際上,這個Session對象是具有ASP解釋能力的的WWW服務器的內建對象。也就是說ASP的系統中已經給你定義好了這個對象,你只需要使用就行了。其中Session(「..」)中的..就好像變量名稱,Session(「..」)=$$中的$$就是變量的值了。你只需要寫上句話,在這個用戶的每個頁面中都可以訪問..變量中的值了。
  
    其實ASP一共內建了7個對象,有Session、Application、Cookie、Response、Request、Server等。在其他的服務器端腳本語言如JSP、PHP等中也有其類似的對象,只是叫法或者使用方法上不太一樣。
  
  ASP Session的功能的缺陷
    目前ASP的開發人員都正在使用Session這一強大的功能,但是在他們使用的過程中卻發現了ASP Session有以下缺陷:
  
    進程依賴性:ASP Session狀態存於IIS的進程中,也就是inetinfo.exe這個程序。所以當inetinfo.exe進程崩潰時,這些信息也就丟失。另外,重起或者關閉IIS服務都會造成信息的丟失。 
    Session狀態使用範圍的局限性:剛一個用戶從一個網站訪問到另外一個網站時,這些Session信息並不會隨之遷移過去。例如:新浪網站的WWW服務器可能不止一個,一個用戶登錄之後要去各個頻道瀏覽,但是每個頻道都在不同的服務器上,如果想在這些WWW服務器共享Session信息怎麼辦呢? 
  Cookie的依賴性:實際上客戶端的Session信息是存儲與Cookie中的,如果客戶端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
  鑒於ASP Session的以上缺陷,微軟的設計者們在設計開發 ASP.NET Session時進行了相應的改進,完全克服了以上缺陷,使得ASP.NET Session成為了一個更加強大的功能。
  
  Web.config文件簡介
    有的ASP.NET程序員說:Web.config文件?我從來沒有聽說過啊,可是我寫的程序不是也能很正常的運轉嗎?是的,你說得沒錯,沒有Web.config文件程序是可以正常運行的。但是,如果你做了一個大型的網站,需要對整個網站做一些整體配置,例如整個網站的頁面使用何種語言編寫的、網站的安全認證模式、Session信息存儲方式等,這時你就需要使用Web.config文件了。雖然Web.config文件中的某些選項是可以通過IIS配置的,但是如果在Web.config中也有相應的設置就會覆蓋掉IIS中的配置。而且,Web.config文件的最大的便利之處就是可以在ASP.NET頁面中通過調用System.web名字空間訪問Web.config中的設置。
  
    Web.config有兩種,分別是服務器配置文件和Web應用程序配置文件,他們都名為Web.config。在這個配置文件中會保存當前IIS服務器中網頁的使用哪種語言編寫的、應用程序安全認證模式、Session信息存儲方式的一系列信息。這些信息是使用XML語法保存的,如果想對其編輯,使用文本編輯器就行了。
  
    其中服務器配置文件會對IIS服務器下所有的站點中的所有應用程序起作用。在.NETFramework 1.0中,服務器的Web.config文件是存在:\WinNT\Microsoft.NET\Framework\v1.0.3705中的。
  
    而Web應用程序配置文件Web.config則保存在各個Web應用程序中。例如:當前網站的根目錄\Inetpub\wwwroot,而當前的Web應用程序為MyApplication,則Web應用程序根目錄就應為:\Inetpub\wwwroot\MyApplication。如果你的網站有且只有一個Web應用程序,一般說來應用程序的根目錄就是\Inetpub\wwwroot。如果想添加一個Web應用程序,在IIS中添加一個具有應用程序起始點的虛擬目錄就行了。這個目錄下的文件及目錄將被視為一個Web應用程序。但是,這樣通過IIS添加Web應用程序是不會為你生成Web.config文件的。如果想創建一個帶有Web.config文件的Web應用程序,需要使用Visual Studio.NET,新建一個Web應用程序項目。
  
    Web應用程序的配置文件Web.config是可選的,可有可無。如果沒有,每個Web應用程序會使用服務器的Web.config配置文件。如果有,則會覆蓋服務器Web.config配置文件中相應的值。
  
    在ASP.NET中,Web.config修改保存後會自動立刻成效,不用再像ASP中的配置文件修改後需要重新啟動Web應用程序才能生效了。
  
  Web.config文件中的Session配置信息
    打開某個應用程序的配置文件Web.config後,我們會發現以下這段:
  
  <sessionState
    mode=”InProc”
    stateConnectionString=”tcpip=127.0.0.1:42424″
    sqlConnectionString=”data source=127.0.0.1;Trusted_Connection=yes”
    cookieless=”false”
    timeout=”20″ 
  /> 
    這一段就是配置應用程序是如何存儲Session信息的了。我們以下的各種操作主要是針對這一段配置展開。讓我們先看看這一段配置中所包含的內容的意思。sessionState節點的語法是這樣的:
  
  <sessionState mode=”Off|InProc|StateServer|SQLServer”
                cookieless=”true|false”
                timeout=”number of minutes”
                stateConnectionString=”tcpip=server:port”
                sqlConnectionString=”sql connection string”
                stateNetworkTimeout=”number of seconds”
  />
  
  
  必須有的屬性是
  
  屬性 選項 描述 
  mode  設置將Session信息存儲到哪裡 
  Off 設置為不使用Session功能 
  InProc 設置為將Session存儲在進程內,就是ASP中的存儲方式,這是默認值。 
  StateServer 設置為將Session存儲在獨立的狀態服務中。 
  SQLServer 設置將Session存儲在SQL Server中。 
  
  可選的屬性是:
  
  屬性 選項 描述 
  cookieless  設置客戶端的Session信息存儲到哪裡 
  ture 使用Cookieless模式 
  false 使用Cookie模式,這是默認值。 
  timeout  設置經過多少分鐘後服務器自動放棄Session信息。默認為20分鐘 
  stateConnectionString  設置將Session信息存儲在狀態服務中時使用的服務器名稱和端口號,例如:”tcpip=127.0.0.1:42424」。當mode的值是StateServer是,這個屬性是必需的。
  sqlConnectionString  設置與SQL Server連接時的連接字符串。例如”data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind”。當mode的值是SQLServer時,這個屬性是必需的。 
  stateNetworkTimeout  設置當使用StateServer模式存儲Session狀態時,經過多少秒空閒後,斷開Web服務器與存儲狀態信息的服務器的TCP/IP連接的。默認值是10秒鐘。 
  
  ASP.NET中客戶端Session狀態的存儲
    在我們上面的Session模型簡介中,大家可以發現Session狀態應該存儲在兩個地方,分別是客戶端和服務器端。客戶端只負責保存相應網站的SessionID,而其他的Session信息則保存在服務器端。在ASP中,客戶端的SessionID實際是以Cookie的形式存儲的。如果用戶在瀏覽器的設置中選擇了禁用Cookie,那末他也就無法享受Session的便利之處了,甚至造成不能訪問某些網站。為了解決以上問題,在ASP.NET中客戶端的Session信息存儲方式分為:Cookie和Cookieless兩種。
  
    ASP.NET中,默認狀態下,在客戶端還是使用Cookie存儲Session信息的。如果我們想在客戶端使用Cookieless的方式存儲Session信息的方法如下:
  
    找到當前Web應用程序的根目錄,打開Web.Config文件,找到如下段落:
  
  <sessionState
    mode=”InProc”
    stateConnectionString=”tcpip=127.0.0.1:42424″
    sqlConnectionString=”data source=127.0.0.1;Trusted_Connection=yes”
    cookieless=”false”
    timeout=”20″ 
  /> 
  
    這段話中的cookieless=”false”改為:cookieless=”true”,這樣,客戶端的Session信息就不再使用Cookie存儲了,而是將其通過URL存儲。關閉當前的IE,打開一個新IE,重新訪問剛才的Web應用程序,就會看到類似下面的樣子:
  


  
    其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑體標出的就是客戶端的Session ID。注意,這段信息是由IIS自動加上的,不會影響以前正常的連接。
  
  ASP.NET中服務器端Session狀態的存儲
  準備工作
  
    為了您能更好的體驗到實驗現象,您可以建立一個叫做SessionState.aspx的頁面,然後把以下這些代碼添加到<body></body>中。
  
  
  <scriptrunat=”server”>
  Sub Session_Add(sender As Object, e As EventArgs)
     Session(“MySession”) = text1.Value
     span1.InnerHtml = “Session data updated! <P>Your session contains: <font color=red>” &; \
              Session(“MySession”).ToString() &; “</font>”
  End Sub
  
  Sub CheckSession(sender As Object, eAs EventArgs)
     If (Session(“MySession”)Is Nothing) Then
      span1.InnerHtml = “NOTHING, SESSION DATA LOST!”
     Else
      span1.InnerHtml = “Your session contains: <font color=red>” &; \
               Session(“MySession”).ToString() &; “</font>”
  End If
  End Sub
  </script>
  <formrunat=”server”id=”Form2″>
     <inputid=”text1″type=”text”runat=”server”name=”text1″>
     <inputtype=”submit”runat=”server”OnServerClick=”Session_Add”
        value=”Add to Session State” id=”Submit1″name=”Submit1″>
     <inputtype=”submit”runat=”server”OnServerClick=”CheckSession”
        value=”View Session State” id=”Submit2″name=”Submit2″>
  </form>
  <hrsize=”1″>
  <fontsize=”6″><spanid=”span1″runat=”server” /></font> 
  
    這個SessionState.aspx的頁面可以用來測試在當前的服務器上是否丟失了Session信息。
  
  將服務器Session信息存儲在進程中
    讓我們來回到Web.config文件的剛才那段段落中:
  
  <sessionState
    mode=”InProc”
    stateConnectionString=”tcpip=127.0.0.1:42424″
    sqlConnectionString=”data source=127.0.0.1;Trusted_Connection=yes”
    cookieless=”false”
    timeout=”20″ 
  /> 
    當mode的值是InProc時,說明服務器正在使用這種模式。
  
    這種方式和以前ASP中的模式一樣,就是服務器將Session信息存儲在IIS進程中。當IIS關閉、重起後,這些信息都會丟失。但是這種模式也有自己最大好處,就是性能最高。應為所有的Session信息都存儲在了IIS的進程中,所以IIS能夠很快的訪問到這些信息,這種模式的性能比進程外存儲Session信息或是在SQL Server中存儲Session信息都要快上很多。這種模式也是ASP.NET的默認方式。
  
    好了,現在讓我們做個試驗。打開剛才的SessionState.aspx頁面,隨便輸入一些字符,使其存儲在Session中。然後,讓我們讓IIS重起。注意,並不是使當前的站點停止再開始,而是在IIS中本機的機器名的節點上點擊鼠標右鍵,選擇重新啟動IIS。(想當初使用NT4時,重新啟動IIS必須要重新啟動計算機才行,微軟真是@#$%^&;)返回到SessionState.aspx頁面中,檢查剛才的Session信息,發現信息已經丟失了。
  
  將服務器Session信息存儲在進程外
    首先,讓我們來打開管理工具->服務,找到名為:ASP.NET State Service的服務,啟動它。實際上,這個服務就是啟動一個要保存Session信息的進程。啟動這個服務後,你可以從Windows任務管理器->進程中看到一個名為aspnet_state.exe的進程,這個就是我們保存Session信息的進程。
  
    然後,回到Web.config文件中上述的段落中,將mode的值改為StateServer。保存文件後的重新打開一個IE,打開SessionState.aspx頁面,保存一些信息到Session中。這時,讓我們重起IIS,再回到SessionState.aspx頁面中查看剛才的Session信息,發現沒有丟失。
  
    實際上,這種將Session信息存儲在進程外的方式不光指可以將信息存儲在本機的進程外,還可以將Session信息存儲在其他的服務器的進程中。這時,不光需要將mode的值改為StateServer,還需要在stateConnectionString中配置相應的參數。例如你的計算你是192.168.0.1,你想把Session存儲在IP為192.168.0.2的計算機的進程中,就需要設置成這樣:stateConnectionString=”tcpip=192.168.0.2:42424″。當然,不要忘記在192.168.0.2的計算機中裝上.NET Framework,並且啟動ASP.NET State Services服務。
  
  將服務器Session信息存儲在SQL Server中
    首先,還是讓我們來做一些準備工作。啟動SQL Server和SQL Server代理服務。在SQL Server中執行一個叫做InstallSqlState.sql的腳本文件。這個腳本文件將在SQL Server中創建一個用來專門存儲Session信息的數據庫,及一個維護Session信息數據庫的SQL Server代理作業。我們可以在以下路徑中找到那個文件:
  
  [system drive]\winnt\Microsoft.NET\Framework\[version]\ 
    然後打開查詢分析器,連接到SQL Server服務器,打開剛才的那個文件並且執行。稍等片刻,數據庫及作業就建立好了。這時,你可以打開企業管理器,看到新增了一個叫ASPState的數據庫。但是這個數據庫中只是些存儲過程,沒有用戶表。實際上Session信息是存儲在了tempdb數據庫的ASPStateTempSessions表中的,另外一個ASPStateTempApplications表存儲了ASP中Application對像信息。這兩個表也是剛才的那個腳本建立的。另外查看管理->SQL Server代理->作業,發現也多了一個叫做ASPState_Job_DeleteExpiredSessions的作業,這個作業實際上就是每分鐘去ASPStateTempSessions表中刪除過期的Session信息的。
  
    接著,我們返回到Web.config文件,修改mode的值改為SQLServer。注意,還要同時修改sqlConnectionString的值,格式為:
  
  sqlConnectionString=”data source=localhost; Integrated Security=SSPI;”
    其中data source是指SQL Server服務器的IP地址,如果SQL Server與IIS是一台機子,寫127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份驗證,這樣,訪問數據庫將以ASP.NET的身份進行,通過如此配置,能夠獲得比使用userid=sa;password=口令的SQL Server驗證方式更好的安全性。當然,如果SQL Server運行於另一台計算機上,你可能會需要通過Active Directory域的方式來維護兩邊驗證的一致性。
  
    同樣,讓我們做個試驗。向SessionState.aspx中添加Session信息,這時發現Session信息已經存在SQL Server中了,即使你重起計算機,剛才的Session信息也不會丟失。現在,你已經完全看見了Session信息到底是什麼樣子的了,而且又是存儲在SQL Server中的,能幹什麼就看你的發揮了,哈哈。
  
  總結
    通過這篇文章,你可以看到在Session的管理和維護上,ASP.NET比ASP有了很大的進步,我們可以更加隨意的挑選適合的方法了。對於企業級的應用來說,這無疑對於服務器的同步、服務器的穩定性、可靠性都是有利的。相信在強大的微軟支持下,新一代的電子商務平台將會搭建的更好!
  
    同時,大家也會發現,在這個整個技術中包括了操作系統、Web服務及數據庫多種技術的整合。我相信,也許Windows沒有Unix穩定,IIS沒有Apache穩定,SQL Server也沒有Oracle強大,但是,誰可以將他們如此完美的聯動到一起呢?所以說,雖然微軟每一方面都不是太強,但是如果把微軟的東西都整合到一起,誰敢說他不強大呢?微軟就是微軟!

如何將SQL Server 2008 R2中Table的數據匯出成Insert Into SQL檔案

1) 選擇Database, 然後按下滑鼠右鍵, [Tasks]à[Generate Scripts…], 如下圖…

image

2) 按下Next 繼續…

image

3) 選擇需要匯出的Tables, 選擇完畢, 按下Next繼續, 如下圖…

image

4) 這邊選擇將結果直接顯示在Query視窗(Save to new Query window項目)

     然後按下Advanced鍵, 會跳出Advanced Scripting Options畫面, 如下圖…

     如果只要匯出資料, 則修改Types of data to script的設定,

     預設為Schema only, 請改成Data only, 按下OK繼續…

image

5) 按下Next繼續…如下圖…

image

6) 開始匯出中, 完成后, 按下Finish繼續…如下圖…

image

7) 如下圖, 匯出的結果, 會在Query視窗上顯示…

image

sql 2008很鳥的設定-防止儲存需要資料表重建的變更

Sql server 2008相對於2005有些奇怪的預設規定

常會讓人摸不著頭緒

比如說我已經是系統管理者了,但為啥改個table的欄位也不行,目前發現一個狀況,我要改table的欄位

但會彈出下列視窗

image

第一次看到還真是令我傻眼,怎麼會這樣!,一開始還以為是database的設定有什麼地方要調,結果都不是

後來在google一陣後,找到解決方法

居然是在ssms的工具->選項中

image

在designers中要把”防止儲存需要資料表重建的變更”的勾選取消,這樣就可以了

image

後來發現,原來如果這個選項是勾選的,且你的table中有資料的話,就會彈出

如果這個選項是勾選的,但你的table中是沒有任何資料的話,就可以修改..

以上資料提供給跟我遇到情況一樣的人

SQL Server View檢視表心得

創造View

CREATE VIEW wellView

AS

SELECT  欄位1,欄位2

FROM 某個資料表

上面不能加入ORDER BY語法

要排序的話要在取出View時再用

SELECT * FROM wellView

ORDER BY 欄位2

指定View欄位的別名:

CREATE VIEW wellView(我是欄位1的別名,我是欄位2的別名)

AS

SELECT  欄位1,欄位2

FROM 某個資料表

加密選項:

CREATE VIEW wellView

WITH  ENCRYPTION

AS

SELECT  欄位1,欄位2

FROM 某個資料表

WITH  ENCRYPTION是把這個View加密

加密後只看得到資料而看不到其中的語法

不過加密後就不能解密了

刪除View

DROP VIEW wellView

或是按滑鼠右鍵點刪除