PIXNET Logo登入

七月的筆記本

跳到主文

七月的筆記本

部落格全站分類:數位生活

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 9月 25 週五 200916:26
  • 運行中的資料庫改變定序方式

把運行中的資料庫改變定序方式
下面是不分大小寫
ALTER DATABASE [yourDBName] COLLATE Chinese_Taiwan_Stroke_CI_AS
下面是分大小寫
ALTER DATABASE [yourDBName] COLLATE Chinese_Taiwan_Stroke_CS_AS
 
執行前要鎖定資料庫為single_user
ALTER DATABASE [yourDBName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
執行後再開放資料庫為multi_user
ALTER DATABASE [yourDBName] SET multi_USER
修改前請先確定資料庫中資料大小寫皆已統一.
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(1,937)

  • 個人分類:學習系
▲top
  • 9月 23 週三 200918:34
  • 抽象class與介面interface(轉載的)


抽象class與介面interface



Abstract class
可擺放實做的method,也可放抽象的method,目的在擴充,所以抽象類別是未定義完全的類別,需繼承才能使用,抽象的method可實做(擴充),可不實做(擴充)
Interface
只定義不實做method,目的讓父類別可以呼叫子類別method,因此當有多個子類別實作父類別的method,即可只透過父類別(介面)的參考呼叫各子類別的method
*interface預設public及abstract,因此有加沒加沒差
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(275)

  • 個人分類:學習系
▲top
  • 3月 10 週二 200910:30
  • 關於權限設計的探討

關於權限設計的探討    
   
   
  但凡涉及多用戶不同權限的網絡或者單機程序,都會有權限管理的問題,比較突出的是MIS系統。    
   
  下面我要說的是MIS系統權限管理的數據庫設計及實現,當然,這些思路也可以推廣開來應用,比如說在BBS中用來管理不同級別的用戶權限。    
   
  權限設計通常包括數據庫設計、應用程序接口(API)設計、程序實現三個部分。    
   
  這三個部分相互依存,密不可分,要實現完善的權限管理體系,必須考慮到每一個環節可行性與複雜程度甚至執行效率。    
   
  我們將權限分類,首先是針對數據存取的權限,通常有錄入、瀏覽、修改、刪除四種,其次是功能,它可以包括例如統計等所有非直接數據存取操作,另外,我們還可能對一些關鍵數據表某些字段的存取進行限制。除此,我想不出還有另外種類的權限類別。    
   
  完善的權限設計應該具有充分的可擴展性,也就是說,系統增加了新的其它功能不應該對整個權限管理體繫帶來較大的變化,要達到這個目的,首先是數據庫設計合理,其次是應用程序接口規範。    
   
  我們先討論數據庫設計。通常我們使用關係數據庫,這裡不討論基於Lotus產品的權限管理。    
   
  權限表及相關內容大體可以用六個表來描述,如下:    
  1   角色(即用戶組)表:包括三個字段,ID,角色名,對該角色的描述;    
  2   用戶表:包括三個或以上字段,ID,用戶名,對該用戶的描述,其它(如地址、電話等信息);    
  3   角色-用戶對應表:該表記錄用戶與角色之間的對應關係,一個用戶可以隸屬於多個角色,一個角色組也可擁有多個用戶。包括三個字段,ID,角色ID,用戶ID;    
  4   限制內容列表:該表記錄所有需要加以權限區分限制的數據表、功能和字段等內容及其描述,包括三個字段,ID,名稱,描述;    
  5   權限列表:該表記錄所有要加以控制的權限,如錄入、修改、刪除、執行等,也包括三個字段,ID,名稱,描述;    
  6   權限-角色-用戶對應表:一般情況下,我們對角色/用戶所擁有的權限做如下規定,角色擁有明令允許的權限,其它一律禁止,用戶繼承所屬角色的全部權限,在此範圍內的權限除明令禁止外全部允許,範圍外權限除明令允許外全部禁止。該表的設計是權限管理的重點,設計的思路也很多,可以說各有千秋,不能生搬硬套說某種方法好。對此,我的看法是就個人情況,找自己覺得合適能解決問題的用。    
   
  先說第一種也是最容易理解的方法,設計五個字段:ID,限制內容ID,權限ID,角色/用戶類型(布爾型字段,用來描述一條記錄記錄的是角色權限還是用戶權限),角色/用戶ID,權限類型(布爾型字段,用來描述一條記錄表示允許還是禁止)    
   
  好了,有這六個表,根據表六,我們就可以知道某個角色/用戶到底擁有/禁止某種權限。    
   
  或者說,這麼設計已經足夠了,我們完全實現了所需要的功能:可以對角色和用戶分別進行權限定制,也具有相當的可擴展性,比如說增加了新功能,我們只需要添加一條或者幾條記錄就可以,同時應用程序接口也無須改動,具有相當的可行性。但是,在程序實現的過程中,我們發現,使用這種方法並不是十分科學,例如瀏覽某個用戶所擁有的權限時,需要對數據庫進行多次(甚至是遞歸)查詢,極不方便。於是我們需要想其它的辦法。使用過Unix系統的人們都知道,Unix文件系統將對文件的操作權限分為三種:讀、寫和執行,分別用1、2、4三個代碼標識,對用戶同時具有讀寫權限的文件被記錄為3,即1+2。我們也可以用類似的辦法來解決這個問題。初步的想法是修改權限列表,加入一個字段:標識碼,例如,我們可以將錄入權限標識為1,瀏覽權限標識為2,修改權限標識為4,刪除權限標識為8,執行權限標識為16,這樣,我們通過權限累加的辦法就可以輕易的將原本要分為幾條記錄描述的權限放在一起了,例如,假定某用戶ID為1,庫存表對應的限制內容ID為2,同時規定角色類型為0、用戶類型為1,我們就可以將該用戶具有錄入、瀏覽、修改、刪除庫存表的權限描述為:2,15,1,1。    
   
  確實很簡單,不是嗎?甚至還有更過激的辦法,將限制內容列表也加上一列,定義好標識碼,這樣,我們甚至可以用簡單的一條記錄描述某個用戶具有的對全部內容所具有的全部權限了。當然,這樣做的前提是限制內容數量比較小,不然,呵呵,2的n次方遞增起來可是數量驚人,不容易解析的。    
   
  從表面上看,上述方法足以達到實現功能、簡化數據庫設計及實現的複雜度這個目的,但這樣做有個弊端,我們所涉及的權限列表不是相互獨立而是互相依賴的,比如說修改權限,其實是包含瀏覽權限的,例如,我們可能只是簡單的設置用戶對庫存表存取的權限值為錄入+修改+刪除(1+4+8=13),但事實上,該用戶具有(1+2+4+8=15)的權限,也就是說,在這種方案中,13=15。於是當我們調用API詢問某用戶是否具有瀏覽權限時,就必須判斷該用戶是否具有對該數據表的修改權限,因此,如果不能在程序中固化權限之間的包含關係,就不能利用應用程序接口簡單的做出判斷。但這與我們的目的「充分的可擴展性」矛盾。    
   
  這個問題如何解決?我想到了另外一種設置標識碼的方法,那就是利用素數。我們不妨將錄入、瀏覽、修改、刪除、執行的基本標誌碼定為2,3,5,7,11,當遇到權限互相包含的時候,我們將它的標識碼設定為兩個(或多個)基本標誌碼的乘積,例如,可以將「修改」功能的標誌碼定為3*5=15,然後將所有的權限相乘,就得到了我們需要的最終權限標識值。這樣,我們在詢問用戶是否具有某項權限的時候,只需要將最終的值分解成質因子,例如,我們可以定義一個用戶具有錄入+修改+刪除庫存表的權限為   2*15*7=2*3*5*7,即表示,該用戶具有了對庫存表錄入+瀏覽+修改+刪除權限。    
   
  當然,對權限列表我們使用上述方法的前提是權限列表記錄條數不會太多並且關係不是十分複雜,否則,光是解析權限代碼就要機器忽悠半宿:)    
   
  我希望以上的分析是正確且有效的(事實上,我也用這些的方法在不止一套系統中實現),但無論如何,我覺得如此實現權限管理,只是考慮了數據庫設計和應用程序接口兩部分內容,對於實現,還是顯得很費勁。因此,我懇請有過類似設計、實現經驗的同志們提出建設性的意見和修改建議。  
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(658)

  • 個人分類:學習系
▲top
  • 2月 26 週四 200916:55
  • 使用Forms實現WebService身份驗證

轉載自 http://www.builder.com.cn/2007/0907/495087.shtml
 
 在安全性要求不是很高的ASP.Net程序中,基於Forms的身份驗證是經常使用的一種方式,而如果需要對WebService進行身份驗證,最常用的可能是基於Soap 標頭的自定義身份驗證方
式。如果對兩者做一下比較的話,顯然,基於Forms的驗證方式更加方便易用,能否將Forms驗證方式應用到WebService中去呢? 
    從理論上講,使用基於Forms的方式對WebService進行身份驗證是可行的,但是使用過程中會存在以下兩個問題:
1.基於Forms的驗證方式同時也是基於Cookie的驗證方式,在使用瀏覽器時,這個問題是不需要我們考慮的。但對於使用WebService的應用程序來說,默認是不能保存Cookie的,需要我們自己去做這個工作。
2.WebService既然是一個A2A(Application To Application)應用程序,使用Web表單進行身份驗證顯然不太合適,而且,這將不可避免的造成人機交互,使WebService的應用大打折扣。
  接下來,我們就分步解決這兩個問題:
1.Cookie的保存問題
    WebService的客戶端代理類有一個屬性CookieContainer可用於設置或獲取Cookie集合,保存Cookie的任務就交給他了:

System.Net.CookieContainer cookieContainer = new System.Net.CookieContainer();

MyService.WebService service 
= new App.MyService.WebService();
service.CookieContainer 
= cookieContainer;

2.我們不想使用Web表單進行身份驗證,幸運的是,ASP.Net表單驗證中的表單頁(即Web.config文件中 forms 元素內的loginUrl)同樣可以指定為WebService文件。
    我們創建一個專門用作身份驗證的Web服務,暫且命名為Login.asmx,然後讓 loginUrl 等於 「Login.asmx」,當然,還需要在Web.config文件中的 authorization 節中禁止匿名訪問(否則我們可就白忙活了),完成配置後的Web.config文件如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    
<system.web>
       
<compilation debug="false" />
      
<authentication mode="Forms">
        
<forms name="MyService" loginUrl="Login.asmx"></forms>
      
</authentication>
      
<authorization >
        
<deny users="?"/>
      
</authorization>
    
</system.web>
</configuration>

    其實我們並不想在未通過身份驗證時讓瀏覽器轉向到Login.asmx,對於使用WebService的客戶程序來說,真正的實惠在於:可以匿名訪問Login.asmx中的方法(當然我們也可以把Login.asmx放在單獨的目錄中,然後允許對該目錄的匿名訪問來達個這個目的,但我覺得還是用loginUrl更優雅一些)。
    接下來,我們為Login.asmx添加用於身份驗證的WebMethod:
[WebMethod]
public bool Check(string userName,string password)
{
    
if (userName == "aaaaaa" && password == "123456")//添加驗證邏輯
    {
        System.Web.Security.FormsAuthentication.SetAuthCookie(userName, 
false);
        
return true;
    }

    
else
    
{
        
return false;
    }

}

    最後一步工作就是:讓客戶程序中的WebService實例與Login實例共享CookieContainer。
class Sample
{
    System.Net.CookieContainer cookieContainer 
= new System.Net.CookieContainer();

    
public void Login()
    
{
        MyServiceLogin.Login login 
= new App.MyServiceLogin.Login();
        login.CookieContainer 
= cookieContainer;
        login.Check(
"aaaaaa", "123456");                       
    }


    
public void ShowHelloWorld()
    
{
        MyService.WebService service 
= new App.MyService.WebService();
        service.CookieContainer 
= cookieContainer;

        Console.WriteLine(service.HelloWorld());
    }

}

    Login()以後再ShowHelloWorld(),你是否看到了我們熟悉的「Hello World」?Ok,就這麼簡單!
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(1,860)

  • 個人分類:學習系
▲top
  • 12月 25 週四 200816:02
  • C#日期函數使用大全

DateTime dt = DateTime.Now;
dt.ToString();
//2005-11-5 13:21:25

dt.ToFileTime().ToString();//127756416859912816
dt.ToFileTimeUtc().ToString();//127756704859912816
dt.ToLocalTime().ToString();//2005-11-5 21:21:25
dt.ToLongDateString().ToString();//2005年11月5日
dt.ToLongTimeString().ToString();//13:21:25
dt.ToOADate().ToString();//38661.5565508218
dt.ToShortDateString().ToString();//2005-11-5
dt.ToShortTimeString().ToString();//13:21
dt.ToUniversalTime().ToString();//2005-11-5 5:21:25
dt.Year.ToString();//2005
dt.Date.ToString();//2005-11-5 0:00:00
dt.DayOfWeek.ToString();//Saturday
dt.DayOfYear.ToString();//309
dt.Hour.ToString();//13
dt.Millisecond.ToString();//441
dt.Minute.ToString();//30
dt.Month.ToString();//11
dt.Second.ToString();//28
dt.Ticks.ToString();//632667942284412864
dt.TimeOfDay.ToString();//13:30:28.4412864
dt.ToString();//2005-11-5 13:47:04
dt.AddYears(1).ToString();//2006-11-5 13:47:04
dt.AddDays(1.1).ToString();//2005-11-6 16:11:04
dt.AddHours(1.1).ToString();//2005-11-5 14:53:04
dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04
dt.AddMonths(1).ToString();//2005-12-5 13:47:04
dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05
dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10
dt.AddTicks(1000).ToString();//2005-11-5 13:47:04
dt.CompareTo(dt).ToString();//0
dt.Add(?).ToString();//問號為一個時間段
dt.Equals("2005-11-6 16:11:04").ToString();//False
dt.Equals(dt).ToString();//True
dt.GetHashCode().ToString();//1474088234
dt.GetType().ToString();//System.DateTime
dt.GetTypeCode().ToString();//DateTime
   
dt.GetDateTimeFormats(
's')[0].ToString();//2005-11-05T14:06:25

dt.GetDateTimeFormats('t')[0].ToString();//14:06
dt.GetDateTimeFormats('y')[0].ToString();//2005年11月
dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日
dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05
dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05
dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日
dt.GetDateTimeFormats('M')[0].ToString();//11月5日
dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06
dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06
dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT
string.Format("{0:d}",dt);//2005-11-5
string.Format("{0:D}",dt);//2005年11月5日
string.Format("{0:f}",dt);//2005年11月5日 14:23
string.Format("{0:F}",dt);//2005年11月5日 14:23:23
string.Format("{0:g}",dt);//2005-11-5 14:23
string.Format("{0:G}",dt);//2005-11-5 14:23:23
string.Format("{0:M}",dt);//11月5日
string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT
string.Format("{0:s}",dt);//2005-11-05T14:23:23
string.Format("{0:t}",dt);//14:23
string.Format("{0:T}",dt);//14:23:23
string.Format("{0:u}",dt);//2005-11-05 14:23:23Z
string.Format("{0:U}",dt);//2005年11月5日 6:23:23
string.Format("{0:Y}",dt);//2005年11月
string.Format("{0}",dt);//2005-11-5 14:23:23 
string.Format("{0:yyyyMMddHHmmssffff}",dt);

計算2個日期之間的天數差
-----------------------------------------------

DateTime dt1 
= Convert.DateTime("2007-8-1");    
DateTime dt2 
= Convert.DateTime("2007-8-15"
);   
TimeSpan span 
=
 dt2.Subtract(dt1);              
int dayDiff = span.Days + 1
;                    
計算某年某月的天數
-----------------------------------------------
    
int days = DateTime.DaysInMonth(2007, 8
);       
days 
= 31
;                                      
給日期增加一天、減少一天
-----------------------------------------------

DateTime dt 
=DateTime.Now;
dt.AddDays(
1); //增加一天

dt.AddDays(-1);//減少一天
其它年份方法類似
Oracle SQL裡轉換日期函數
-----------------------------------------------

to_date(
"2007-6-6",'YYYY-MM-DD");
to_date("2007/6/6",'yyyy/mm/dd");

如下一組數據,如何查找表裡包含9月份的記錄:
CGGC_STRATDATE  CGGC_ENDDATE
=========================================
2007-8-4  2007-9-5
2007-9-5  2007-9-20
2007-9-22  2007-10-5
SELECT 
* FROM TABLE
(TO_DATE(
'2007/9/1','yyyy/mm/dd'
) BETWEEN CGGC_STRATDATE
AND CGGC_ENDDATE OR CGGC_STRATDATE 
>=TO_DATE('2007/9/1','yyyy/mm/dd'
)
AND CGGC_ENDDATE
<=TO_DATE('2007/9/30','yyyy/mm/dd') 
"
OR TO_DATE('2007/9/30','yyyy/mm/dd'
) BETWEEN CGGC_STRATDATE
AND CGGC_ENDDATE) ORDER BY CGGC_STRATDATE ASC
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(46,347)

  • 個人分類:學習系
▲top
  • 6月 15 週五 200716:24
  • 從ip顯示國家

http://blog.blueshop.com.tw/ajun/archive/2005/04/26/3403.aspx
 
 
 
所需檔案
相關網站http://ip-to-country.webhosting.info/
1.IP-to-Country資料庫
在上面這個網站,已經有整理好的ip位置資料庫,當然,除了這個外,有些論壇程式中或是流量統計的程式中也有附類似的資料庫,而在這我們是使用這個網站所提供的資料庫.
而它的下載區可以下載到資料庫,不過它是CSV的格式,所以要先將他匯入mdb中.
2.國旗圖片
同樣的,在上面這個網站中也有提供一些國旗的圖片,
你可以在他的resources - flags找個你覺得不錯的壓縮檔下載.
開始寫程式
要從IP顯示國家所在的話,第一步當然是取得IP,
strIP = Request.ServerVariables("REMOTE_ADDR")

當然,如果你還要考慮說使用者是不是有使用proxy的話,
你可以在修改一下上面這段,
不過因為抓取proxy後的真實IP並不是我們現在要討論的課題,
所以我們就很單純的使用上面這個方式抓取IP.
而我們抓到IP後,就是要判斷這個IP在哪個IP區段間,
如果你已經看過資料庫內容的話,
你會發現,它的資料長的像是下面這樣
996671488
| 996802559 | TW | TWN | TAIWAN

這時你會發現並沒有看到像是 xxx.xxx.xxx.xxx 的IP資料欄位,
所以我們必須將IP位址轉換成"數值",
而轉換的公式如下
A
* (256*256*256) + B * (256*256) + C * 256 + D
以 A.B.C.D 的IP位址為例

所以用ASP作轉換的函數如下

Private Function ipAd2ipNum(ipA)
strO = ipA
pos1 = InStr(strO, ".")
intA = CInt(Left(strO, (pos1-1)))
strO2 = Mid(strO, pos1+1, len(strO))
pos2 = InStr(strO2, ".")
intB = CInt(Left(strO2, (pos2-1)))
strO3 = Mid(strO2, pos2+1, len(strO2))
pos3 = InStr(strO3, ".")
intC = CInt(Left(strO3, (pos3-1)))
intD = CInt(Mid(strO3, pos3+1, len(strO3)))
intConvert = (intA*(256*256*256)) + (intB*(256*256)) + (intC*256) + intD
ipAd2ipNum = Trim(intConvert)
End Function

而呼叫的程式如下

strIP = Request.ServerVariables("REMOTE_ADDR")
strIPN = ipAd2ipNum(strIP)

到這,我們已經作抓取IP並將它轉換成IP數值了,
在來就是查詢資料庫判斷看看這個IP是在哪個區段,
然後抓取該區段所在的國家資訊.
而SQL的查詢語法如下
strSQL
= "select country_code2,country_name from ip2country where ip_from<=" & strIPN
strSQL = strSQL & " and ip_to>=" & strIPN

其中的country_code2是取得國家的簡碼(2碼)用來取得國旗圖片用,因為我所抓取的圖示名稱是用國家簡碼來命名.
country_name 是取得國家的名稱,
所以顯示的程式如下

If NOT rs.eof Then
strCounrtyCode = rs.Fields("country_code2")
strCountry = rs.Fields("country_name")
response.write "你的IP為 : " & strIP
response.write "你的國家為 : " & strCountry & "<IMG src=""images/" & strCounrtyCode & ".png"">"
Else
response.write "你的IP為 : " & strIP
response.write "你的國家為 : 不在名單中"
End If

到這,大致就完成了我們的目標了,
將它改成是函數的話,就可以更方便我們在各個程式的套用了!!
完整的程式,晚點有人要的話,在上傳上來...
程式的部份作了一點修改,現在提供範例程式下載!
下載 : 範例程式與資料庫
相關網址
Extracting the Country from the IP Address
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(3,522)

  • 個人分類:學習系
▲top
  • 5月 31 週四 200715:20
  • 取的 WEBCONFIG 內的 APPSETING

private static string SafeConfigString(string configSection, string configKey, string defaultValue)
  {
   NameValueCollection configSettings = ConfigurationSettings.GetConfig(configSection) as NameValueCollection;
   if ( configSettings != null )
   {
    string configValue = configSettings[configKey] as string;
    if ( configValue != null )
    {
     return configValue;
    }
   }
   return defaultValue;
  }
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(11)

  • 個人分類:學習系
▲top
  • 5月 07 週一 200715:14
  • SQL分頁_PartII

http://blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx

SQL Server 存儲過程的分頁,這個問題已經討論過幾年了,很多朋友在問我,所以在此發表一下我的觀點
建立表:

CREATE TABLE [TestTable] (
 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

 

插入數據:(2萬條,用更多的數據測試會明顯一些)
SET IDENTITY_INSERT TestTable ON

declare @i int
set @i=1
while @i<=20000
begin
    insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
    set @i=@i+1
end

SET IDENTITY_INSERT TestTable OFF

 

-------------------------------------

分頁方案一:(利用Not In和SELECT TOP分頁)
語句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 20 id
         FROM TestTable
         ORDER BY id))
ORDER BY ID


SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 頁大小*頁數 id
         FROM 表
         ORDER BY id))
ORDER BY ID

-------------------------------------

分頁方案二:(利用ID大於多少和SELECT TOP分頁)
語句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 20 id
                 FROM TestTable
                 ORDER BY id) AS T))
ORDER BY ID


SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 頁大小*頁數 id
                 FROM 表
                 ORDER BY id) AS T))
ORDER BY ID


-------------------------------------

分頁方案三:(利用SQL的游標存儲過程分頁)
create  procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查詢字符串
@currentpage int, --第N頁
@pagesize int --每頁行數
as
set nocount on
declare @P1 int, --P1是游標的id
 @rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁 
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
建議優化的時候,加上主鍵和索引,查詢效率會提高。

通過SQL 查詢分析器,顯示比較:我的結論是:
分頁方案二:(利用ID大於多少和SELECT TOP分頁)效率最高,需要拼接SQL語句
分頁方案一:(利用Not In和SELECT TOP分頁)   效率次之,需要拼接SQL語句
分頁方案三:(利用SQL的游標存儲過程分頁)    效率最差,但是最為通用

在實際情況中,要具體分析。


更多的討論見:
http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515

(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(290)

  • 個人分類:學習系
▲top
  • 5月 07 週一 200710:47
  • 轉載:數據分頁方法

來源: http://www.ravs.ntct.edu.tw/know/show.asp?questionid=140
假設:
   1.有一sql語句將產生1000條記錄 (select 唯一ID,其他字段 from 表集 where 條件 order by 排序)
   2.每頁顯示20條記錄
   3.目前顯示第5頁
  
  實現如下:
   select * from
   (
   select * from (select top 20*4 唯一ID,其他字段 from 表集 where 條件 order by 排序) as a
   union all
   select * from (select top 20*5 唯一ID,其他字段 from 表集 where 條件 order by 排序) as b
   )
   a
   group by 唯一ID,其他字段 having count(唯一ID)=1 order by 排序
  
  運行此SQL,至此取記錄集後N條記錄大法就些完畢
詳細說明:
  
  此SQL語句的關鍵應用技巧在於union all和分組上的條件過濾語句
  
  大家可以根據此技巧完全可以做出一個通用的分頁方法,如直接由用戶傳入sqlstr(sql語句),NumPerPage(每頁顯示數),currpage(目前頁),自己在再函數內組織成通成的SQL分頁語句
  
  備注:
  
  目前頁為1的話就不需要運行該SQL了,直接TOP一下就OK了
  由於沒有環境,該SQL性能無法測試,但相信不會低效
  運行平臺在access,sqlserver上都可運行,其它資料庫平臺只需改top關鍵字應該就可以就地運行了
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(37)

  • 個人分類:學習系
▲top
  • 4月 30 週一 200715:20
  • 重新指定 Form 的 action (在 asp.net 不 sumbit 給自己的方法)

http://www.codeproject.com/aspnet/jsnopostback.asp
轉載自blueshop
 
因為你就算是在Form的Action寫你的B網頁了也會被.NET Framework改寫成自己的頁面
所以你可能要試試祥大的參考
用HTML控制項的Button
去呼叫類似像下面的JavaScript來重新指定Form.Action目標













1
<script language="javascript">  
2
function noPostBack(sNewFormAction)  
3
{  
4
    document.forms[0].action = "B網頁";   
5
    document.forms[0].__VIEWSTATE.name = 'NOVIEWSTATE';    
6
    document.forms[0].submit();  
7
}  
8
</script>
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(0) 人氣(1,515)

  • 個人分類:學習系
▲top
«1234»

自訂側欄

自訂側欄

遊樂新香港

弦子

小賈斯汀音樂貼紙

fasio

熱門文章

  • (282,941)製造業中常用的英文縮寫
  • (30,870)[ASP.NET]Session詳解 (轉載)
  • (663)如何透過IHttpHandler讓某虛擬目錄中檔案(例如Test.txt)必須登入才可瀏覽(或下載)
  • (7,560)HttpModule與HttpHandler詳解(轉載)
  • (46,347)C#日期函數使用大全
  • (1,363)VBScript 中單引號、雙引號的問題

文章分類

  • 旅行 (1)
  • 電腦和網際網路 (1)
  • 學習系 (29)
  • 未分類文章 (1)

最新文章

  • 製造業中常用的英文縮寫
  • 使用HttpWebRequest 登入網站並POST查詢‏
  • [ASP.NET]Session詳解 (轉載)
  • JavaScript : 判斷瀏覽器種類
  • 如何透過IHttpHandler讓某虛擬目錄中檔案(例如Test.txt)必須登入才可瀏覽(或下載)
  • 關於權限設計的探討(轉載的)
  • UrlRewrite有什麼用處?
  • 事件觸發
  • AJAX 下,阻止按鈕連續觸發
  • HttpModule與HttpHandler詳解(轉載)

文章精選

文章搜尋

誰來我家

參觀人氣

  • 本日人氣:
  • 累積人氣: