Visual Studio
(1)重装Team Edition for Database Pros Add-on for Team Suite时, 要卸载下面的两个后再重装才能确保工程模版好用:
Microsoft Visual Stuido ProjectAggregator2
Microsoft Visual Studio 2005 Team Edition for Database Professionals - Trial - ENU
(2)用VS2005创建Infopath项目时候提示下面的错误:
英文的:
Package Load Failure.
Package 'ReportDesignerPackage' has failed to load properly (GUID={11B8C903-8FFD-4DFC-87CE-F6A82D77AF6B}).
Package 'DataWarehouse VSIntegration layer' has failed to load properly.
Package 'Microsoft Data Transformation Services Designer' has failed to load properly.
中文的:
包加载失败
未能正确加载包"ReportDesignerPackage"(GUID={11B8C903-8FFD-4DFC-87CE-F6A82D77AF6B})。请与包供应商联系以获得帮助。由于可能会发生环境损坏,建议重新启动应用程序。要禁止将来加载此包吗?可以使用"devenv/resetskippkgs"重新启用包加载。
原因可能是在VS2005中的Business Intelligence Projects模版丢失导致。
卸载并重装SQL Server 2005即可解决。
C#
(1)C#:
using System;
using System.Collections.Generic;
using System.Text;
namespace ClassLibrary1
{
public class Class1
{
void fun()
{
//一维数组的定义
int[] a1;
a1 = new int[10];
//二维且每行元素个数相同的数组
int[,] a2 = new int[2, 3];
//二维且每行元素个数不相同的数组
int[][] a3 = new int[2][];
a3[0] = new int[5];
a3[1] = new int[2];
}
}
}
(2)
改.aspx文件时记住改.cs文件的类名和命名空间的名字,此时相应的.aspx文件中<%@ Page~~%>中的Inherits的值会相应改变,同时要改变此文件中Codebehind的值。<%@ Page Codebehind="Country.aspx.cs" %>是告诉asp.net引擎这个页面有个某某后置代码需要动态编译。
改Global.asax文件的命名空间名<%@ Page language="c#" Codebehind="MoveInConfirm.aspx.cs" AutoEventWireup="false" Inherits="Olympic.MaterialManage.Category1.MoveInConfirm" %><%@ Page language="c#" Codebehind="MoveInConfirm.aspx.cs" AutoEventWireup="false" Inherits="Olympic.MaterialManage.Category1.MoveInConfirm" %><%@ Page language="c#" Codebehind="MoveInConfirm.aspx.cs" AutoEventWireup="false" Inherits="Olympic.MaterialManage.Category1.MoveInConfirm" %><%@ Page language="c#" Codebehind="MoveInConfirm.aspx.cs" AutoEventWireup="false" Inherits="Olympic.MaterialManage.Category1.MoveInConfirm" %><%@ Page language="c#" Codebehind="MoveInConfirm.aspx.cs" AutoEventWireup="false" Inherits="Olympic.MaterialManage.Category1.MoveInConfirm" %>。
改web应用程序所在的目录名时,要右键Project名-Properties:General中的Assembly Name,Default Namespace,Web Settings中的Path值,其中Default Namespace对于VB.NET来说是根名字空间,对于C#是default namespace即如果没有命名空间就用默认的,有则就用已有的。
删掉.sln文件,打开.webinfo文件,将URLPath值改成.csproj文件的本地URL路径,打开.csproj文件-右键Solution选Rebuild生成.sln文件。
如有“CS1595: 已在多处定义~~”的错误,一般是因重命名了虚拟目录的名称和文件夹而造成的,则有2种方法:1.改掉所有命名空间名称2.删掉“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files”目录下的此工程对应的文件(此时应进入任务管理器结束aspnet_wp.exe进程,才可以删掉此文件)再Rebuild再执行,如果还有错误就再删掉C:\Inetpub\wwwroot\OBFM\下的bin文件夹再Rebuild再执行,如果还有错误就再删掉c:\documents and settings\(username)\vswebcache
(3)aa/bb.xml路径是相对于上个页面的网站Virtual路径。
/aa/bb.xml是相对于webserver根的virtual path。
C:\Inetpub\wwwroot\aa\bb.xml是物理路径。
(4)服务器根目录要用“~/”
(5)将某个目录设成Virtual Directory时,其下面应该有.csproj等文件,不能在此目录下的子目录里。
(6)将某个目录设成Virtual Directory时,如用VS2003而又装了Framework2.0时,在Interent Information Services管理工具里右键其选properties-将其中的ASP.NET项下的Vertion值选对(VS2003选1.1.4322)。
(7)任何不在工程内的文件如图片文件,都可以通过拖动其到VS2003中来实现加入到工程里。
(8)对于VS2003中的.aspx文件中的表格等,不要在VS2003中拖动改变其大小,否则控制其大小的Width等属性会以style="width:30px"这种形式,如此时再在Dreamweaver中设置其值则造成重复,则页面不是你想要的。
当在VS2003中保存某个页面时,最好在Dreamweaver中使其页面处于激活状态,可避免使其在Dreamweaver中变成修改状态。
(9)将剪贴板上的字粘贴到.aspx文件里时,最好右键用Paste as HTML粘贴,这样得到的字是纯的前后不带样式标签的。
(10)在VS2003中的Solution Explorer视窗中点击“Show All Files”按钮会把后面的文件显示出来,再点一下又不显示。
(11)if(!IsPostBack)的IsPostBack的意义是“是否是第二次请求”。
(12)<%=Request.QueryString["~"] %>
Response.Write(Request.QueryString.Get("~"));
(13)在一个Project里使用另一个Project里的类时,要在References里通过Add Reference对话框里的Project栏里加此Project的bin\Debug里的.dll文件。
(14)Pet Shop4.0的安装只要象装软件一样装完就不用再按照它的Read me文件里说的手动安装了。选择完全安装时,会帮你自动建出4个数据库。
(15)C#编码规范:私有成员前加m,类和函数的注释用///,函数内部注释用//。
(16)如在写代码时候无智能提示则是因为在References里没有引入此组件即.dll的引用。
(17)当website项目没有.sln文件时候,可在VS2005里选file-open-web site之后选此项目的总文件夹就可以打开了。之后可以在file下拉菜单中保存一个.sln文件。
(18)启动用户实例的进程时出错
问题:
使用ASP.NET 2.0 + SQL2005 + aspnetdb(MemberShip等功能)时出现这个问题:
“由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。”
英文是:“Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.”
问题原因:
这是微软的bug,并且微软已经承认,详情如下:http://support.microsoft.com/?id=896613
出现此错误的条件是:你用过远程桌面连接,并且安装了SQL2005+VS2005,就有很大可能触发这个问题,微软说会在将来的XP SP3里面解决掉这个问题。
解决:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=128707&SiteID=1
如果你看不懂英文,那么我告诉你我的解决办法:
删除C:\Documents and Settings\[USERNAME]\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS目录即可,[USERNAME]是Windows用户名,比如说Administrator
(19)从客户端调用Web Method时发生[Method Error 12031]或[Method Error 500]异常:
若要从客户端调用某个服务器端Web Service中的Web Method,则该Web Service必须拥有Microsoft.Web.Script.Services.ScriptServiceAttribute属性:
//如果你装的是ASP.NET AJAX(Atlas)Beta 1则加下面的属性
[Microsoft.Web.Script.Services.ScriptService()]
//如果你装的是ASP.NET AJAX(Atlas)v1.0则加下面的属性
[System.Web.Script.Services.ScriptService]
public class MyService : System.Web.Services.WebService
{
//
}
若要从客户端调用某个定义与页面中的Page Method,则该Page Method必须用Microsoft.Web.Script.Services.ScriptMethodAttribute属性修饰(当然,System.Web.Services.WebMethod也是必不可少的),且必须为静态(static)方法。目前版本的一个Bug还导致我们必须在ASPX文件中定义这个Web Method,在CS文件中定义是没有作用的(真是无奈):
//如果你装的是ASP.NET AJAX(Atlas)Beta 1则代码只能写成下面的混合模式
<script runat="server">
[System.Web.Services.WebMethod]
//如果你装的是ASP.NET AJAX(Atlas)Beta 1则加下面的属性
[Microsoft.Web.Script.Services.ScriptMethod]
//如果你装的是ASP.NET AJAX(Atlas)v1.0则加下面的属性
[System.Web.Script.Services.ScriptMethod]
public static string GetHtml(string contextKey)
{
//
}
</script>
//如果你装的是ASP.NET AJAX(Atlas)v1.0则代码可以分离着写
[WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static CascadingDropDownNameValue[] GetArea(string knownCategoryValues, string category)
{
//
}
(20)关于String的解释:
1.给字符串变量赋值时是新建一个字符串对象,而不是修改此字符串变量原来指向的字符串对象。
2.DotNet 有字符串驻留机制:CLR内部有一张哈希表用来保存应用程序域的所有字符串;如果新创建一个字符串,如果在hash表中找到和这个字符串相同的值,那么返回相同的地址,如果不相同那么在hash表中新增一条记录。
3.不能修改字符串对象实例的值,而 StringBuilder 则是在原对象实例基础上的修改。
4.rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。
也有的人说:
ref是传入值,out是传出值。
ref侧重修改,out侧重输出。
ref是传递参数的地址。
(20)C#中out与ref的用法与区别
1、out必须在函数体内初始化,在外面初始化没意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。
2、ref必段在函数体外初始化。
3、两都在函数体的任何修改都将影响到外面。
例:
using System;
namespace ConsoleApplication1
{
class C
{
public static void reffun(ref string str)
{
str += " fun";
}
public static void outfun(out string str)
{
str = "test"; //必须在函数体内初始
str += " fun";
}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
string test1 = "test";
string test2; //没有初始
C.reffun( ref test1 ); //正确
C.reffun( ref test2 ); //错误,没有赋值使用了test2
C.outfun( out test1 ); //正确,但值test传进去
C.outfun( out test2 ); //正确
Console.Read();
}
}
}
在传值和传址情况下,C#强制要求参数在传入之前由用户明确初始化,否则编译器报错!但我们如果有一个并不依赖于参数初值的函数,我们只是需要函数返回时得到它的值是该怎么办呢?往往在我们的函数返回值不至一个时我们特别需要这种技巧。答案是用out修饰的输出参数。但需要记住输出参数与通常的函数返回值有一定的区别:函数返回值往往存在堆栈里,在返回时弹出;而输出参数需要用户预先制定存储位置,也就是用户需要提前声明变量--当然也可以初始化。
在函数体内所有输出参数必须被赋值,否则编译器报错!out修饰符同样应该应用在函数声明和调用两个地方,除了充当返回值这一特殊的功能外,out修饰符ref修饰符有很相似的地方:传址。
(21)数组参数的例子:
using System;
class Test
{
static int Sum(params int[] args)
{
int s = 0;
foreach (int n in args)
{
s += n;
}
return s;
}
static void Main()
{
int[] var = new int[] { 1, 2, 3, 4, 5 };
Console.WriteLine("The Sum:" + Sum(var));
Console.WriteLine("The Sum:" + Sum(10, 20, 30, 40, 50));
}
}
(22)GradView等控件的OnObjectCreated事件在第一次调用odsOrg3_ObjectCreated(object sender, ObjectDataSourceEventArgs e)函数时是创建表头。
(23)要想取得控件里面的控件的ID号如GradView里的模板列的,应该这样取:GradView$TemplateField。
(24)asp的控件的html端的ID如在Javascript里用其ID,可以这样得到<%=其服务器端ID.ClientID %>
(25).aspx中:<iframe id="content" runat="server" frameborder="0" style="width: 100%; height: 100%;"></iframe>
.cs中可以这样使用:((System.Web.UI.HtmlControls.HtmlGenericControl)content).Attributes["src"] = "aaa";
(26)在C#中switch的比对参数也可以是字符串:
switch (Request.QueryString["tem"])
{
case "ab":
addr = "aa.aspx";
break;
}
(27)这个<style type="text/css"></style>要放在<head runat="server"></head>中否则看不了设计视图。
(28)Javascript里也可以用else if(),如
if(1)
{}
else if(0)
{}
(29)
1.如果浏览页面时提示下面的错误:
Configuration Error
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
Parser Error Message: Could not load file or assembly 'System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
Source Error:
Line 51: <compilation debug="true">
Line 52: <assemblies>
Line 53: <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
Line 54: <add assembly="System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
Line 55: <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
Source File: E:\M\PerforceRoot\Olympic\OBFM\Web\web.config Line: 53
2.或者拖crystalreportviewer控件到页面提示:memory 写保护时,
3.或者一些系统提供的类找不到,
以上的异常的原因可能是没装ASP.NET 2.0 AJAX Extensions 1.0
(30)
using System;
using System.Collections.Generic;
using System.Text;
namespace OBFM.BusinessRules
{
[System.ComponentModel.DataObject]
public partial class BumpInBO
{
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]
public DataSetBumpIn.BumpInDocumentDataTable GetDocByDocId(string docId)
{
return BumpInDocAdapter.GetDocByDocId(docId);
}
}
}
上面的类和方法加的属性可以使在页面中配置ObjectDataSource数据源时既选Configure Data Source-Choose a Business Object里看到此类,在Define Data Methods中可以看到此方法。
(31)强类型的Dataset指系统建立的带外键关系等结构,很象数据库中的表结构的Dataset,而我们自己new的Dataset只加了colume等而没有结构关系的是非强类型的。
(32)如果Dataset视图中有多个表,那么此Dataset结构是有的只是是没有数据的空结构,通过下面的方法可以使一个Dataset中的某些表充满数据:
DataSetSystem dsRole = new DataSetSystem();
OBFM.DataEntities.DataSetSystemTableAdapters.PathTableAdapter pathTableAdapter = new OBFM.DataEntities.DataSetSystemTableAdapters.PathTableAdapter();
pathTableAdapter.Fill(dsRole.Path);
OBFM.DataEntities.DataSetSystemTableAdapters.RolePathTableAdapter rolePathTableAdapter = new OBFM.DataEntities.DataSetSystemTableAdapters.RolePathTableAdapter();
rolePathTableAdapter.FillByRoleId(dsRole.RolePath, Int32.Parse(gvRole.SelectedValue.ToString()));
上面的Dataset“dsRole”中就有了两个充满值的表。
(33)如果想给Dataset.xsd中的某个适配器类增加方法,可以右键.xsd选择View Code之后下面出现.cs文件,可以在此文件里扩展~TableAdapter类的方法。
(34)如果用<asp:ObjectDataSource/>作为数据源,查询语句的参数来自于<asp:ObjectDataSource/>监视的<asp:TextBox/>,那么当文本框为空时,虽然this.TextBoxID.Text的值为"",但SQL语句要用@~ is null对应。
如果用:
DepartmentTableAdapter departmentAdapter = new DepartmentTableAdapter();
Department.DepartmentDataTable aa = departmentAdapter.GetDataByPara("dscpn", this.txtSearchKey.Text);
this.gvOrg.DataSource = aa;
做数据源,那么传给SQL语句的值为"",所以要在SQL语句中用@~ = ''对应。
(35)在.aspx文件的
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
前面最好加上<script type="text/javascript"></script>,可使设计时见到的页面和浏览时看到的一样。
(36)http://jsjlcl.bokee.com/viewdiary.13765974.html Cookie的基本知识
(37)作安装程序时可设置的地方:
1.左键点击Setup工程-在属性窗中:
Author:JasonLi
Localization:Chinese(Simplified)
Manufacturer:
ProductName:将显示在安装对话框中
RemovePreviousVersions:True
Title:
2.右键点击Setup工程-View-File System-点击编辑窗中的Web Application Folder-在属性窗中:
VirtualDirectory:
3.右键点击Setup工程-View-User Interface-点击编辑窗中的Welcome-在属性窗中将WelcomeText改为“制作:~-~-安装程序将引导您完成在您的计算机上安装<[ProductName]>所需的步骤。”
如果是用WebSetup做个只有合并模块的安装程序则可以删掉编辑窗中的“Installation Address”
4.右键Setup工程-Properties-可在Output file name中修改生成后的.msi文件的名称如改为SetupEXT.msi
可点击Prerequisites在对话框中选预安装的东西,VS2005会将你选的东西做到你的安装程序里,在安装的时候会预先从你的安装程序里安装这些组件。记住如果改属性时候要改完debug模式后也要把release模式下的属性改成一样的。
5.右键Setup工程或右键File System里的东西都会有Add选项来添加东西。
(38)ASP.NET Error: Failed to access IIS metabase错误的解决办法
错误提示:
Server Error in '/PSP' Application.
Failed to access IIS metabase.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.Hosting.HostingEnvironmentException: Failed to access IIS metabase.
The process account used to run ASP.NET must have read access to the IIS metabase (e.g. IIS://servername/W3SVC). For information on modifying metabase permissions, please see http://support.microsoft.com/?kbid=267904.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. |
Stack Trace:
[HostingEnvironmentException: Failed to access IIS metabase.]
System.Web.Configuration.MetabaseServerConfig.MapPathCaching(String siteID, VirtualPath path) +3500410
System.Web.Configuration.MetabaseServerConfig.System.Web.Configuration.IConfigMapPath.MapPath(String siteID, VirtualPath vpath) +9
System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath, Boolean permitNull) +163
System.Web.CachedPathData.GetConfigPathData(String configPath) +382
System.Web.CachedPathData.GetConfigPathData(String configPath) +243
System.Web.CachedPathData.GetApplicationPathData() +68
System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +3393731
System.Web.Configuration.RuntimeConfig.GetLKGRuntimeConfig(VirtualPath path) +189
|
Version Information: Microsoft .NET Framework Version:2.0.50727.42; ASP.NET Version:2.0.50727.210
解决方法:
1.在run里运行cmd命令进入DOS命令行-cd \-cd C:\windows\microsoft.net\framework\v2.0.50727或在Microsoft Visul Studio 2005-Visul Studio Tool里调出Visual Studio 2005 Command Prompt后直接输入命令而不用退到C:\windows\microsoft.net\framework\v2.0.50727这个目录。
2.然后执行命令 aspnet_regiis -ga <账户名>
3.aspnet_regiis -i -enable
4.net stop iisadmin
5.net start w3svc
对了说一下,aspnet_regiis.exe这个程序是在c:\windows\microsoft.net\framework\v2.0.50727目录下的,如果你的不是windows xp sp2,那么请您搜寻该程序,只要执行相同的命令即可。
(39)“VSTS 启动web测试记录器无效”问题的解决
现象:
用VS2005做性能测试时,发现添加新的web测试,启用记录web动作,发现web记录器的按钮都是灰显的,只是web浏览器左面提示要从vs内部打开web记录器。
原因:
在微软的论坛中发现这个可能是个Bug,相关帖子http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=572411&SiteId=1
解决:
办法1:安装Visual Studio 2005 Service Pack 1 (SP1)即VS80sp1-KB926601-X86-ENU下载地址http://msdn2.microsoft.com/en-us/vstudio/bb265237.aspx 安装完后要重启才能起作用
办法2:使用工具Fiddler录制脚本,可以录制后保存为后缀为.webtest的文件,然后导入项目中。下载地址http://www.fiddlertool.com/fiddler/
办法3:可以通过重新注册插件恢复,但这种方法可能不起作用,打开记事本输入内容如下:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{8C84B9F5-3D9E-4204-BB0B-F85D46455868}]
@="Web Test Recorder"
"MenuText"="Web Test Recorder"
"HelpText"="Record Web Tests."
[HKEY_CLASSES_ROOT\CLSID\{8C84B9F5-3D9E-4204-BB0B-F85D46455868}\Implemented Categories]
[HKEY_CLASSES_ROOT\CLSID\{8C84B9F5-3D9E-4204-BB0B-F85D46455868}\Implemented Categories\{00021493-0000-0000-C000-000000000046}]
[HKEY_CLASSES_ROOT\CLSID\{8C84B9F5-3D9E-4204-BB0B-F85D46455868}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
[HKEY_CLASSES_ROOT\CLSID\{8C84B9F5-3D9E-4204-BB0B-F85D46455868}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="Microsoft.VisualStudio.TestTools.WebTest.RecorderBarControl"
"Assembly"="Microsoft.VisualStudio.QualityTools.RecorderBar, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
[HKEY_CLASSES_ROOT\CLSID\{8C84B9F5-3D9E-4204-BB0B-F85D46455868}\InprocServer32\8.0.0.0]
"Class"="Microsoft.VisualStudio.TestTools.WebTest.RecorderBarControl"
"Assembly"="Microsoft.VisualStudio.QualityTools.RecorderBar, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Explorer Bars\{8C84B9F5-3D9E-4204-BB0B-F85D46455868}]
"BarSize"=hex:06,01,00,00,00,00,00,00
然后保存为.reg文件,并双击植入注册表
部分原文内容http://www.cnblogs.com/oscarxie/archive/2007/01/11/618150.html
(40)
现象:
The specified display mode is currently disabled on this page. Make sure personalization is enabled for the current user.
Parameter name: value
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentException: The specified display mode is currently disabled on this page. Make sure personalization is enabled for the current user.
Parameter name: value
原因:
除Browse模式外其他模式都需要认证才能使用。
WebPart与Membership是有联系的,在DesignMode下需要认证的用户才能访问,如果用户没有登陆,那么会出现上面的提示.而微软说没有认证的用户也可以使用DesignMode,但是一切的改变只会存储在ViewState中。
解决办法:
1.在切换模式时让用户先登陆
2.在登入的地方加上:
FormsAuthentication.RedirectFromLoginPage(userid, false);
并且修改web.config如下:
<authentication mode="Forms"/>
3.如果想让没有被认证的用户也可以使用其他模式,可以通过加上下面的代码实现:
C#
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
HttpCookie authCookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName);
if (authCookie == null)
{
String MyCookieName = "Reminder";
System.Web.HttpCookie MyCookie = Request.Cookies.Get(MyCookieName);
String UserID;
if (MyCookie == null)
{
UserID = System.Guid.NewGuid().ToString().Replace("-", "");
MyCookie = new System.Web.HttpCookie(MyCookieName, UserID);
MyCookie.Expires = DateTime.Now.AddYears(10);
Response.Cookies.Add(MyCookie);
}
else
{
UserID = MyCookie.Value;
}
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, UserID, DateTime.Now, DateTime.Now.AddSeconds(30), false, "roles");
String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(authCookie);
Response.Redirect(Request.Url.ToString());
}
System.DateTime LastDate = System.DateTime.Now.AddYears(-1);
System.Data.SqlClient.SqlConnection cnn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString);
System.Data.SqlClient.SqlCommand cmd;
cmd = new System.Data.SqlClient.SqlCommand("DELETE FROM" + " aspnet_PersonalizationPerUser where UserID IN " + "(SELECT UserID from aspnet_Users where " + "[LastActivityDate] < @Date)", cnn);
cmd.Parameters.Add("@Date", SqlDbType.DateTime);
cmd.Parameters["@Date"].Value = LastDate;
try
{
cnn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
cnn.Close();
}
cmd = new System.Data.SqlClient.SqlCommand("DELETE FROM" + " aspnet_Users where [LastActivityDate] < @Date", cnn);
cmd.Parameters.Add("@Date", SqlDbType.DateTime);
cmd.Parameters["@Date"].Value = LastDate;
try
{
cnn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
cnn.Close();
cmd.Dispose();
cnn.Dispose();
}
}
}
VB.NET代码:
http://www.codeproject.com/aspnet/anonywebparts.asp
(41)
网页中调用qq和msn
调用qq的方法:
<A href="tencent://message/?uin=20989163&Site=博客园&Menu=yes"
target=blank><IMG alt=点击这里给我发消息 src="http://wpa.qq.com/pa?p=1:20989163:11"
border=0></A>
调用msn的方法:
<A href="msnim:chat?contact=xxqq0824@hotmail.com" target=blank>点这里和我MSN聊天</A>
放在页面上就能出效果了!
还要补充一点,如果你想要自定义的话,可以访问:
http://is.qq.com/cgi-bin/webpresence/wpa_code;在这里可以设置你的qq的图片,以及一些附加功能。
QQ:
<a target=blank href=tencent://message/?uin=QQ号&Site=网站名称&Menu=yes><img border="0" SRC=http://wpa.qq.com/pa?p=1:QQ号:7 alt="点击这里给我发消息">
MSN:
<A href="msnim:chat?contact=lyjier@hotmail.com" target=blank>点这里和我MSN聊天</A>
网页调用MSN功能
在新添加的功能中,还包括可通过网页中的链接添加联系人、开始交谈、开始视频交谈和开始语音交谈。链接的构造如下:
开始交谈:msnim:chat?contact=contact@hotmail.com
添加联系人:msnim:add?contact=contact@hotmail.com
启动一个语音聊天:msnim:voice?contact=contact@hotmail.com
启动一个视频聊天:msnim:video?contact=contact@hotmail.com
建立对话:msnim:chat?contact=[MSN ID]
添加好友:msnim:add?contact=[MSN ID]
语音聊天:msnim:voice?contact=[MSN ID]
视频聊天:msnim:video?contact=[MSN ID]
只要把以上的代码作为链接放入<a href="">中的引号里面,就可以了。。。。
网页调用msn对话框
<Script language=javascript>
function SendMSNMessage(name)
{
//MyStatus == 1 本地MSN未登录
//MyStatus == 2 本地MSN已登录
if(MsgrObj.MyStatus == 1){
alert("Please login your MSN Messenger!");
}else{
MsgrObj.InstantMessage(name);
}
}
function AddMSNContact(name)
{
MsgrObj.AddContact(0, name);
}
</script>
<object id="MsgrObj" classid="clsid:B69003B3-C55E-4B48-836C-BC5946FC3B28" codetype="application/x-oleobject" width="0" height="0"></object>
<a href="javascript:SendMSNMessage('name@hotmail.com')">msn_test</a>
(42)怎样使用#if test #endif:
先在“Configuration Manager”里New一个"Conditional compilation symbols", 之后在Project Properties里的Build项里的"Conditional compilation symbols"内输入刚刚新建的那个符号,之后在代码中的#if test #endif中使用这个符号就可以实现条件编译了。
(43)如果website不能通过vs打开可以尝试下面的方法:
1.如果是vs2003项目则要在IIS上创建此站点
2.确信ContentGroupManagement.sln文件能的路径是IIS上此站点的的虚拟路径(不用修改ContentGroupManagement.vbproj.webinfo文件的信息,因为.sln文件会更新.webinfo文件)
3.在vs里右键此项目选择reload
4.如果还不能打开,则单独打开此project,不要通过.sln,如果成功后再reload
5.如果Browse此站点时,报下面的错误:
Server Error in '/ContentGroupManagement' Application.
--------------------------------------------------------------------------------
Server cannot access application directory 'C:\Documents and Settings\jason_li\Desktop\MS@WorkoldWeb\MSAtWork\ContentGroupManagement\'. The directory does not exist or is not accessible because of security settings.
则可能是你把代码放到了桌面上。
6.如果在代码中使用System.Net.WebClient.OpenRead(webserviceUrl)打开webservice抛出异常可以到IIS上,右键站点选“Properties”-“Document”中添加CGManagement.asmx并将其设置成默认主页,右键选“Browse”核实是否能浏览成功。
7.如果报“没权限访问”的错误,可右键站点选“Properties”-“Directory Security”-勾选“Enable anonymous access”。
(44)Copy Local 属性:确定是否将引用复制到本地 bin 路径。在运行时,引用必须位于全局程序集缓存 (GAC) 或项目的输出路径中。如果将该属性设置为 true,则在运行时将把引用复制到项目的输出路径。
部署/复制包含对自定义组件(该组件在 GAC 中注册)的引用的应用程序时,无论 Copy Local 的设置如何,组件都不会与应用程序一起部署/复制。
http://msdn.microsoft.com/zh-cn/library/t1zz5y8c.aspx
(45)
安装VS6.0时可能遇到下面的问题:
问题一:
scrrun.dll was unable to register itself in the system registry.
DiffMrg.ocx was unable to register itself in the system registry.
pdm.dll was unable to register itself in the system registry.
解决办法:
方法一:
将安装盘上VID98\BIN\下的DIFFMRG.OCX拷贝到c:\winnt\system32下,运行:regsvr32 c:\winnt\system32\DIFFMRG.OCX
方法二:
如果方法一不能注册成功。使用ProcessMonitor软件查看在注册这些dll时那些注册表是access denied。将不能访问的赋给当前用户管理员权限。
方法三:
如果还不能注册成功,直接给HKEY_CLASSES_ROOT赋予管理员权限。就能安装成功了。
问题二:
setup was unable to create a DCOM user account in order to register 'E:\Program Files\Microsoft Visual Studio\Common\Tools\VS-Ent98\Vanalyzr\VALEC.EXE'
解决办法:
微软承认的一个bug。安装时不安装Enterprise Tools-Options-Visual Studio Analyzer就可以解决这个问题了。
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257413
(46)
当安装vs2005时如果不能设置安装路径,其原因是需卸载vs的一些辅助组件,如Team Explorer等。其中Microsoft Visual Studio 2005 premier partner Edition是由于装Microsoft Visual Studio 2005 Team Explorer后出现的。
(47)
调试项目时如果遇到下面的错误:
Could not write lines to file "obj\Components.csproj.FileListAbsolute.txt". Access to the path 'E:\InfoPath2007\Microsoft.ContractManagement\Components\obj\Components.csproj.FileListAbsolute.txt' is denied.
解释:
FileListAbsolute表示“文件绝对路径列表”,包括.dll、.exe以及.pdb文件等。
If you look in this file you should find the string of Illegal characters that match the error. Anyway, make a copy of this file as a backup (just in case). Then delete the original version and rebuild your project. This file apparently gets recreated if it does not exist and will correct itself, at least it did for me. You should get a clean build now.
VB
1)
function是函数,sub是子程序,都可以传递参数,但函数有返回值,子程序没有
sub过程是子过程,是在响应事件时执行的代码块。本身没有类型和返回值。
function是函数过程,有返回值,同时有数据类型,即返回值的类型
Win Form开发
(1)某些动作发生前的事件可以用e.Cancel=true;取消此事件例如:Validating事件。如果执行控件A时不想触发另外一个控件B的Validating事件,可以设置控件A的属性CausesValidation为False。
JavaScript
(1)用VS2005调试Javascript时最好用Ctrl+F5(不调试直接运行)不要用F5(调试后运行),因为后者的调试器还是用同一个VS2005且单步光标指示的位置也不是实际位置,而前者可以选择是否打开新的VS2005调试Javascript且光标停的位置也是正确的。
(2)如果不知道页面中某个控件的下面有什么属性可以用,可以给Javascript代码加断点并调试起来,然后右键此对象选择QuickWatch,之后可以象调试.cs文件里的代码一样使用。
(3)在.cs中加脚本的方法:
当给某个控件加脚本时可以用ddlID.Attributes.Add("onChange", "javascript:ControlItemEnable1();");
当给页面中加脚本时候可以用:
Page.ClientScript.RegisterStartupScript(~) 脚本块出现在Form结束符前,一般用于初始化Form页面,加载时启动。也可以注册Javascript文件。
Page.ClientScript.RegisterClientScriptBlock(~) 脚本块出现在Form开始符之后,一般用于注册与Form初始属性无关的脚本块。
参数key相同的脚本块只有第一个会出现在客户端页面上。在.cs文件中注册前用Page.ClientScript.IsClientScriptBlockRegistered(~)检查一下是否注册过。
if (!Page.ClientScript.IsClientScriptBlockRegistered("myKey"))
{
string sct = @"var viewer = document.getElementById('myID');
alert();";
Page.ClientScript.RegisterStartupScript(this.GetType(), "myKey", sct, true);
}
http://www.weiw.com/tech/javadict/ref_a-c.htm Javascript各个函数的使用示例
AJAX
(1)"An extender can't be in a different UpdatePanel than the control it extends." error really needs debugging information"错误。
出这里错误的ajax 控件一般为有target属性的,指定到一个updatePanel里面的控件里。
一个简单的解决方法可以把ajax 控件也放进updatepanel里。但不是对所有的有效的
That is a difference of the new release over previous... The error however is explicit - any controls that have target properties to point to something that the Update Panel triggers on can only be placed within the update panel.... HOWEVER... there is an override by programtically overriding it using the "ChldrenAsTriggers" property...http://ajax.asp.net/docs/mref/0b850465-67ca-2600-9fdc-2c16d689ab89.aspx
(2)Asp.net Ajax的PopupControl控件的CommitProperty属性是指:目标控件的客户端属性,这个属性是它的值在弹出窗口选择完值后要更新的属性,比如可以是TextBox客户端属性value(注:不是Text属性),即是<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>生成HTML标签<input type="text" name="textfield" value="aa">后的属性value。
最关键的地方是弹出控件选择值后,值被Ajax PopupControlExtender管理,PopupControl控件然后把值传给客户端TextBox的value属性。
(3)当用户快速点击按钮或其他会导致postback的动作时(即每次request还没有来得及接受到response就又再点击其他按钮)会发生下面的错误:
Invalid postback or callback argument. Event validation is enabled using in configuration or in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
原因如下:
这是由于在net2.0里增加了一项页面验证:enableEventValidation此属性默认值是TRUE。
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="AEBnx7v.........tS" />
在我们的页面PostBack的时候,asp.net会根据存储在这个隐藏控件中的Value来校验你点击的BUTTON被委托的事件是不是有效的,当它发现postback的资料不是原始的控制项发出来的就会产生上述异常,如果网页上有一些特殊的写法会去修改postback资料也会出现这个错误。
通常产生这个错误都是由于在该隐藏控件还没有被render出来之前执行了postback。
解决办法如下:
1.禁用事件校验,不过这个会产生安全问题, 在页面里用<%@ Page EnableEventValidation="false"%>,也可在web.config里<pages enableEventValidation="false"/>
2.呼叫ClientScriptManager.RegisterForEventValidation
(4)AJAX的<asp:UpdatePanel></asp:UpdatePanel>所囊括的部分区域被PostBack时其内的控件都会被恢复成初始状态,所以此前如果
<asp:TextBox ID="aa" runat="server">在Javascript里被设置成了不可编辑当PostBack时就会变成可编辑,所以应该设成
<asp:TextBox ID="aa" runat="server" Enabled="false">
(5)AJAX发送请求后的监视readystate的函数和原来的宿主页面内的函数是两个不同的线程。onreadystatechange的承接函数和监视readystate的函数在同一个线程,有执行的先后顺序的。
oXMLHttpRequest.open(bstrMethod, bstrUrl, varAsync);
当varAsync为true时为异步请求,宿主页面发送AJAX请求同时也会为AJAX再开一个线程用于处理此请求、监视readystate的状态等操作,此时宿主页面不会等此线程结束(请求返回)而是继续执行宿主页面的代码。
当varAsync为false时为同步请求,宿主页面发送AJAX请求同时也会为AJAX再开一个线程用于处理此请求、监视readystate的状态等操作,此时宿主页面只有等此线程结束(请求返回)才会执行宿主页面以下的代码。
document.writeln(sText);函数会覆盖掉当前页面内的所有代码,最后页面上内容只是其参数的内容,但不会覆盖掉提取到内存的代码。
document.writeln(sText);输出的内容会自动加入换行。document.write(sText);不加换行。
页面标签如“</head>”如果想作为js的字符串则要分开写如var str1 = "</"; var str2 = "head>";不能写成var str = "</head>";因为此时会当成页面标签了。也可以前加转义字符“\”。
(6)
掌握 Ajax 系列:
http://www.ibm.com/developerworks/cn/web/wa-ajaxintro/
Crystal Report
(1)用向导给水晶报表CrystalReportViewer加ReportSource时(Propertyies-DataBindings-ReportSource)如选Custom binding expression则其值的格式为:@"C:\Program Files\Microsoft Visual Studio .NET 2003\Crystal Reports\Samples\Reports\General Business\World Sales Report.rpt",即:一要为绝对路径,二要加双引号,三为了表示此“\”不是表示转义字符的作用前面要加@。
(2)Crystal report 出现
“
The maximum report processing jobs limit configured by your system administrator has been reached.
Exception Details: System.Runtime.InteropServices.COMException: The maximum report processing jobs limit configured by your system administrator has been reached.
”
错误的解决办法:
WEB下的水晶报表在正常运行一段时间后会出现以上错误,后来发现,水晶报表会在注册表中注册,并限制了打印数量为75,在“开始-Run”中运行regedit命令后在注册表编辑器里更改以下注册表内容:
HKEY_LOCAL_MACHINE\SOFTWARE\Crystal Decisions\10.2\Report Application Server\InProcServer\PrintJobLimit
或
HKEY_LOCAL_MACHINE\Software\Business Objects\Suite 11.0\Report Application Server\InProcServer\PrintJobLimit
将PrintJobLimit由75改为0,然后重启动计算机后,故障排除。
也可以通过关掉电脑右下脚的“ASP.NET Development Server”再浏览页面的方法解决这个异常。
上面的异常出现在ReportDocument.Load();之后,如果ReportDocument.Load();被写成
try
{
ReportDocument.Load();
}
catch ()
{
}
则提示下面的错误:
“
Invalid report file path.
Exception Details: CrystalDecisions.CrystalReports.Engine.LoadSaveReportException: Invalid report file path.
”
(3)水晶某些数据为汉字时打印出现“方框乱码”的解决办法:乱码一般是字体问题,在报表文件里右键出现乱码的字段-Format Object-Font将Font文本框改成宋体。
(4)在设计Reporting Services报表时如果左面没有数据库字段浏览窗口,可以通过“View-Datasets”掉出来。
(5)“System.Runtime.InteropServices.COMException: Invalid pointer”这个水晶报表的异常的原因可能是在“Database-Database Expert”里对水晶报表建立的连接数据库的连接已经没了。
(6)如果水晶报表预览时显示不出来数据,可以右键Database Fields-Database Expert-Links去掉其中多余的Link。
(7)如果在Database Expert中想通过Project Data设置报表的数据源,但Dataset.xsd文件又不在Web Site工程里即在Project Data中看不到想用的Dataset.xsd,可以先将报表建立在和那个Dataset.xsd在同一个工程下就可以用了并且可以设计报表了,然后在将此报表拷贝到相应工程里。
如果在Database Expert中用Dataset作为设计报表时的数据源时,Dataset视图中的表的字段可以自己构造既增加你想要的字段,也可以自己增加外键关系。
如果在Database Expert中多个表中有些表没有link关联,可以在Database Expert中的links里通过用鼠标拖一个表的字段到另一个表的字段上来给它们关联,也可以在.cs中的Dataset中构造所需的多个主表,然后写下面的代码:
ReportDocument docObj = new ReportDocument();
docObj.SetDataSource(dataset);
(8)如果想在Database Expert给水晶报表增加个表但建立的连接没有了即看不到那些表了,则可以在History里找到你以前的连接重新建立,之后加你想加的数据库表到水晶报表文件。
(9)对CrystalReportViewer控件的属性设置如下:
EnableDatabaseLogonPrompt="False" 页面不提示输入登陆数据库信息的对话框,此时可以在程序中设置登陆信息。
HasToggleGroupTreeButton="False" 不出现“显示/隐藏树”的按钮。
DisplayGroupTree="False" 默认左边的树是不显示的,点按钮才显示。
DisplayGroupTree="False" 不显示左边的树状结构。
HasCrystalLogo="False" 不显示水晶报表logo。
PrintMode="ActiveX" 设置点击打印按钮时出现的提示形式。
(10)当水晶报表重复多次显示一条记录时,有两种解决办法:
A.先在Database Expert中只导入一张表不要一次把所需的报表都导入,之后设计报表,显示正确后,再一次性的导入其他所需的数据库表,如果在程序中用ReportDocument给报表赋数据源则只需要用Dataset取出第一个表的字段(不用追溯其他关联表的字段,Crystal Report会根据主表即第一个导入的表并通过自己的link得到其他关联表的所需字段),但要保证Database Expert中link存在。因为如果一次性的导入所有所需表会让Crystal Report不知道哪个是主表。
B.在Database Expert中一次把所需的报表都导入,并删掉所有的link,在代码中用Dataset在数据库中取出所有导入表中的所需字段,把Dataset给ReportDocument,再用ReportDocument给报表赋数据源。
(11)如果既想用ReportDocument给报表赋数据源,又在Database Expert中一次把所需的报表都导入,可能浏览页面时会报下面的错误:
“Cannot determine the queries necessary to get data for this report. Failed to open a rowset. Error in File C:\DOCUME~1\jqli\LOCALS~1\Temp\NOCMR{30B5E15A-2756-44D8-AEA7-0A4723A9CBA7}.rpt: Failed to open a rowset.”
两种解决办法:
1.是重新设计报表且分两次打开Database Expert第一次只导入一张表作为主表,第二次导入其他所需的表。
2.除了主表外都删掉,再打开Database Expert导入其他表。
(12)如果水晶报表显示不出数据或显示的记录数目比用SQL命令查水晶报表主表得到的记录少,可能原因是因为水晶报表内不只一个表而是有很多关联表但从主表向下追溯时可能传了null造成此条由多表组成的一行记录查不出来则少了此个记录。
(13)如何调节水晶报表.rpt文件的最大宽度:
1.右键报表空白处-Design-Printer Setup,在Paper栏里设置Size
2.点击.rpt文件上某个节,选择Section Expert-Details-勾选Format with Multiple Columns-标签页会多出一个标签为“Layout”-点击“Layout”标签后在里面就可以设置报表的宽度了。
Reporting Service
(1)电脑A放置代码-有report view,电脑B安装有数据库和report server,如果在A上安装过TFS再卸载后并且删掉了A上IIS上的report server应用程序池后,可能造成报表显示不出来,页面提示:
为用户“HSLCN\CSSERVER$”授予的权限不足,无法执行此操作。 (rsAccessDenied)
解决办法:
打开B电脑上的IIS的ReportServer应用程序的Properties-Directory Security-Edit-勾选Enable anonymous access,将默认帐号IUSR_HCSSERVER改为域帐户,如输入B电脑的域帐户,注意域帐户一定要加上域名如“hslcn\hcsserv”,可通过Browse的Check Names来检查输入的帐户的正确性。
SQL
SQL Server 2005 联机丛书
http://msdn.microsoft.com/zh-cn/library/ms189826(SQL.90).aspx
SQL教程:
http://www.ibook8.com/book/sql.htm
如何一个数据库服务器的存储过程中远程更新另一个数据库服务器的表的内容:
http://www.80diy.com/home/20060118/17/4524068.html#
(1)两种连接字符串的写法:
“Driver={SQL Server};Server=LIJIANQIANG\SQLSERVER2;DataBase=OBFM;user id=HSLCN\jqli;password=ass;”
“workstation id=10.167.9.83;packet size=4096;integrated security=SSPI;data source=LIJIANQIANG\SQLSERVER2;persist security info=False;initial catalog=OBFM”
(2)在存储过程中加上exec pGetDepartmentByPara 'aaa', 'bbb'可测试存储过程pGetDepartmentByPara(@searchCategory nvarchar(20), @searchKey nvarchar(300)),其中后面两个是参数。
用光标亮选哪个语句,点执行后就执行被选择的语句。
(3)将一个表新增加的若干列用语句一次性插入进去:
insert into City(ID, State, Name) select ID, State, Name from Collector.dbo.City where ID not in (select ID from City)
(4)select distinct age from [Person],加distinct可以避免选出重复的值。
(6)
如何查看SQL Server的版本号:
方法一:
打开企业管理器-右键数据库引擎-选属性-在General标签里可以看到版本。
方法二:
select serverproperty('ProductLevel')查看SQL补丁
select serverproperty('ProductVersion')查看SQL版本号
select serverproperty('Edition')查看SQL是企业版还是开发版
Select @@Version查看版本号等信息
(7)char、varchar、nchar、nvarchar、text、ntext区别:
char 定长
varchar 变长,ASCII字符,只占1个字节
nvarchar 变长,Unicode字符,字符都占2个字节
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。varchar变长字符数据类型与存储数据的实际长度是一致的。
例如char(100),无论储存了一个字节还是100个字节,它占用的空间都是100字节,而varchar(100)的字段,则如果储存一个字节就是一个字节大小,储存10个字节就是10个字节大小。
N表示national character varying,字符数据采用Unicode编码,可以解决多语言字符集之间的转换问题。它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。
(7)SQL分页语句
-----------------------------------------
--据说效率最高,适用于SQL 2005
-----------------------------------------
declare @topn int,@skipm int
set @topn=100
set @skipm=3000
select * from
(select ROW_NUMBER ( ) OVER (order by pn desc,sn asc) as fno,* from (select top (@skipm+@topn) * from serial order by pn desc,sn asc) a) a
where fno>@skipm and fno<=@skipm+@topn order by fno
-----------------------------------------
--效率高(利用ID大于多少和SELECT TOP分页)语句形式.前提是必需有一列是自动增长类型,且唯一性.即表中主键必须为标识列"[ID] int IDENTITY (1,1)",如果没有主键,可以用临时表.
-----------------------------------------
SELECT TOP 10 * FROM TestTable WHERE (ID > (SELECT MAX(id) FROM (SELECT DISTINCT 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 [每页记录数*(当前页码-1)] id FROM 表 ORDER BY id) AS T)) ORDER BY ID
-----------------------------------------
--前提是必需有一列是自动增长类型,且唯一性.即表中主键必须为标识列"[ID] int IDENTITY (1,1)",如果没有主键,可以用临时表.
-----------------------------------------
select top 10 * from [order details] where orderid > all(select top 10 orderid from [order details] order by orderid) order by orderid
-----------------------------------------
--效率次之(利用Not In和SELECT TOP分页)语句形式.前提是必需有一列是自动增长类型,且唯一性.即表中主键必须为标识列"[ID] int IDENTITY (1,1)",如果没有主键,可以用临时表.
-----------------------------------------
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 [每页记录数*(当前页码-1)] id FROM 表 ORDER BY id)) ORDER BY ID
-----------------------------------------
--利用SQL未公开的游标存储过程实现分页.方法简单且效率高(也有人说“效率低,但是最为通用.建议优化的时候,加上主键和索引,查询效率会提高”)已知的问题就是要多返回一个空的记录集.解决的方法是在前台调用时,用 set recordset=recordset.nextrecordset的方法跳过第一个记录集.
-----------------------------------------
If Exists (Select * From Dbo.Sysobjects Where Id = Object_Id(N'[Dbo].[P_Splitpage]') And Objectproperty(Id, N'isprocedure') = 1)
Drop Procedure [Dbo].[P_Splitpage]
Go
Create Procedure p_splitpage
@Sql nvarchar(4000), --要执行的sql语句
@CurrentPage int=2, --要显示的页码
@PageSize int=10, --每页的大小
@PageCount int=0 OUTPUT --总页数
As
Set Nocount On
Declare @P1 Int
--初始化分页游标
Exec Sp_Cursoropen @cursor=@P1 Output,@stmt=@Sql,@Scrollopt=1,@Ccopt=1,@Rowcount=@PageCount Output
--计算总页数
Select @PageCount=Ceiling(1.0*@Pagecount/@Pagesize),@Currentpage=(@Currentpage-1)*@Pagesize+1
Select @Currentpage
--显示指定页的数据
Exec Sp_Cursorfetch @P1,16,@Currentpage,@Pagesize
--关闭分页游标
Exec Sp_Cursorclose @P1
set nocount off
Go
--调用示例
declare @temPageCount int
exec p_splitpage @sql='select id,name from sysobjects', @CurrentPage=2, @PageCount=@temPageCount OUTPUT
SELECT @temPageCount
-----------------------------------------
--数据量小的时候可用ROW_NUMBER()实现分页功能.适用于SQL 2005
-----------------------------------------
DECLARE @pagenum AS INT, @pagesize