私の青い色スペース

专注于.NET,认真把握好生命的每一秒,让每天都过的有意义。。!
 
 

与我联系

  • 发短消息

搜索

 

常用链接

  • 我的随笔
  • 我的空间
  • 我的短信
  • 我的评论
  • 更多链接
  • 我的参与
  • 我的新闻
  • 最新评论
  • 我的标签

留言簿(4)

  • 给我留言
  • 查看留言

我参与的团队

  • 福州.NET俱乐部(0/517)

随笔分类

  • Asp(vbs) Vbscript 技术(5) (rss)
  • Asp.net(C#) 编程(12) (rss)
  • Javascript And Ajax 技术(5) (rss)
  • Microsoft SQL Server 杂侃(3) (rss)
  • Xml/Css Web相关(2) (rss)

随笔档案

  • 2006年10月 (1)
  • 2006年9月 (7)
  • 2006年8月 (15)
  • 2006年7月 (1)

文章分类

  • 人际关系/职场风云(2) (rss)
  • 人生感悟(2) (rss)

博客站点链接

个人网站

  • 蓝色天空

最新评论

阅读排行榜

  • 1. 使用Js的Replace替换字符,在用正则时有问题。。(2250)
  • 2. Asp.net 用DataSet对象更新数据(SqlDataAdapter)(1056)
  • 3. 使用 Asp(vbs) 来读取 XML 数据岛 来制作网站菜单(883)
  • 4. ASP.NET中17种常用正则表达式(861)
  • 5. XmlHttp.readyState属性整理(陆续加入中)(763)

评论排行榜

  • 1. ASP.NET中17种常用正则表达式(3)
  • 2. Asp.net 用DataSet对象更新数据(SqlDataAdapter)(2)
  • 3. 如何实现某一目录的forms身份验证(2)
  • 4. 使用Js的Replace替换字符,在用正则时有问题。。(2)
  • 5. 读取config文件的两种方法(1)

Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2006年9月9日

Asp.net 用DataSet对象更新数据(SqlDataAdapter)
  大家知道,DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本”进行更新,然后在将“原本”更新,按照我的理解就是把“原本”覆盖掉。具体到过程,首先是要找到需要更新的行,然后赋新值,最后更新原数据库。
  要找到需要修改的行,比较方便的做法就是根据记录中的某个值进行查找,这样比用“列号”“行号”什么的方便多了。要做到这一点,首先就是要给数据库指定一个主键,然后即可按照主键进行查找。要注意的是这个主键必须要是在程序中指定的,并且这个主键不一定和你数据库原来有的主键一样。
  然后就是最后的更新,当然是用DataAdapter的Update()方法借助CommandBuilder来实现,要注意的是,如果你的数据库一开始没有定义主键,那进行更新的时候会出错,返回的错误将是“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成。”这是因为我们用的Update()实际上是通过CommandBuilder动态生成sql语句,然后才进行的数据库操作。但如果你在一开始创建DataAdapter时的那个sql语句没有包含有主键的列的话,那CommandBuilder将不会发生作用。这一点是必须要牢记的。
  说了这么多,如果有不明白的就看下面的程序,这个是我练习时写的,里面有一些个人的设定,比如记录名什么的,相信大家一看就明白。
<%@import namespace="System.Data"%>
<%@import namespace="System.Data.OleDb"%>
<script language="c#" runat="server">
//定义处理更新的方法
//因为是简单示例,所以这个程序已经简化,直接进行更新
//这里有两个参数,第一个用来查找需要更新的行,第二个是要修改的值
private void up_date(int ids,string names){
//连接字符串,不明白的可以看本专题第二篇文章
string connstr=ConfigurationSettings.AppSettings["color"];
OleDbConnection conn=new OleDbConnection(connstr);
string sql="select * from member";
OleDbDataAdapter ada=new OleDbDataAdapter(sql,conn);//建立一个DataAdapter对象
//这里的CommandBuilder对象一定不要忘了,一般就是写在DataAdapter定义的后面
OleDbCommandBuilder cb=new OleDbCommandBuilder(ada);
DataSet ds=new DataSet();//建立DataSet对象
conn.Open();//打开连接
ada.Fill(ds,"mems");//填充DataSet
conn.Close();//注意及时关闭连接
DataTable dt=ds.Tables["mems"];//建立一个DataTable对象,方便操作
dt.PrimaryKey=new DataColumn[]{dt.Columns["id"]};//建立一个主键
DataRow dr=dt.Rows.Find(ids);//根据参数查找到需要修改的行

dr["name"]=names;//对需要修改的记录赋新值
ada.Update(ds,"mems");//用DataAdapter的Update()方法进行数据库的更新
}
//定义用来响应按钮单击事件的方法
private void b1_Click(object sender,System.EventArgs e){
if(Page.IsValid){
int ids=Int32.Parse(idst.Text);//取得要修改的行的id值,并转换成int类型
string names=namest.Text;//取得新值
up_date(ids,names);//调用我们定义的方法处理
lb1.Text="ok!";
</script>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>用dataset更新记录</title>
</head>
<body>
<asp:Label id="lb1" runat="server"/>
<form runat="server">
<asp:TextBox id="idst" runat="server"/>
<asp:RequiredFieldValidator id="rfv1" ControlToValidate="idst" ErrorMessage="error!" runat="server"/>
<asp:TextBox id="namest" runat="server"/>
<asp:RequiredFieldValidator id="rfv2" ControlToValidate="namest" ErrorMessage="error!" runat="server"/>
<asp:Button id="b1" Text="here!!" OnClick="b1_Click" runat="server"/>
</form>
</body>
</html>
补充一点,如果想设多于两个的主键的话,可以用这个
dt.PrimaryKey=new DataColumn[]{dt.Columns["id"],dt.Columns["id2"]};
就是给数组添加两个值,然后使用的时候:
Object[] keyValues=new object[1]; //这里必须实例化否则会向你要初值
//而且需要后面方括号中的这个索引范围
keyValues[0]=(object)key1;
keyValues[1]=(object)key2;
...... 另外一种写法
Object[] keyValues={(object)key1,(object)key2};//以楣举方式赋初值

很明白了吧 :)
posted @ 2006-10-04 22:46 メ冰枫ぱ雪 阅读(1056) | 评论 (2) | 编辑
 
asp中正则表达式的应用
一、正则表达式概述 
  二、正则表达式在VBScript中的应用 
  三、正则表达式在VavaScript中的应用 
  四、示例 
  五、总结 

  一、正则表达式概述 
  如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。 
  请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名 
中的单个字符,而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件:data1.dat、data2.dat等 
等。如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名:data.dat、 
data1.dat、data12.dat等等,尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使你 
对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也更灵活。 
  在我们编写ASP程序时,经常会判断一个字符串的有效性,如;一个串是否是数字、是否是有效的Email地址等等。如 
果不使用正则表达式,那么判断的程序会很长,并且容易出错,如果使用正则表达式,这些判断就是一件很轻松的工作 
了。后面我们将介绍如何判断数字和Email地址的有效性。 
  在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够 
了,但是由于它缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。 
  使用正则表达式,能完成些什么事情呢? 
  测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信 
用卡号码模式。这称为数据有效性验证。 
  替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。 
  根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。 
  例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记,则可以使用正则表达式对每 
个文件进行测试,看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法,就可以将受影响的文件范围 
缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料,最后,可以再次使用正则表达 
式来查找并替换那些需要替换的标记。 
  那么,正则表达式语法的语法是如何呢? 
  一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文 
字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 
  这里有一些可能会遇到的正则表达式示例: 
  /^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。 
  /\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。 
  /<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配一个 HTML 标记。 

  二、正则表达式在VBScript中的应用 
  VBScript使用RegExp对象、Matches集合以及Match对象提供正则表达式支持功能。我们还是先看一个例子。 
<%
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches   '建立变量。
Set regEx = New RegExp   '建立正则表达式。
regEx.Pattern = patrn  '设置模式。
regEx.IgnoreCase = True   '设置是否区分字符大小写。
regEx.Global = True   '设置全局可用性。
Set Matches = regEx.Execute(strng)  '执行搜索。
For Each Match in Matches  '遍历匹配集合。
RetStr = RetStr & "Match found at position "
RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
RetStr = RetStr & Match.Value & "'." & "
"
Next
RegExpTest = RetStr
End Function
response.write RegExpTest("[ij]s.", "IS1 Js2 IS3 is4")
%> 
在这个例子中,我们查找字符串中有无is或者js这两个词,忽略大小写。运行的结果如下: 
Match found at position 0. Match Value is 'IS1'. 
Match found at position 4. Match Value is 'Js2'. 
Match found at position 8. Match Value is 'IS3'. 
Match found at position 12. Match Value is 'is4'. 
下面我们就介绍这三个对象和集合。 
  1、RegExp对象是最重要的一个对象,它有几个属性,其中: 
  ○Global 属性,设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如 
果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 False。 
  ○IgnoreCase 属性,设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 
IgnoreCase 属性为 False;否则为 True。缺省值为 False。 
  ○Pattern 属性,设置或返回被搜索的正则表达式模式。必选项。总是一个 RegExp 对象变量。 
  2、Match 对象 
  匹配搜索的结果是存放在Match对象中,提供了对正则表达式匹配的只读属性的访问。 Match 对象只能通过 RegExp 
对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的 Match 对象属性都是只读的。在执行正则 
表达式时,可能产生零个或多个 Match 对象。每个 Match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的 
长度,以及找到匹配的索引位置等。 
  ○FirstIndex 属性,返回在搜索字符串中匹配的位置。FirstIndex 属性使用从零起算的偏移量,该偏移量是相对于 
搜索字符串的起始位置而言的。换言之,字符串中的第一个字符被标识为字符 0 
  ○Length 属性,返回在字符串搜索中找到的匹配的长度。 
  ○Value 属性,返回在一个搜索字符串中找到的匹配的值或文本。 
  3、Matches 集合 
  正则表达式 Match 对象的集合。Matches 集合中包含若干独立的 Match 对象,只能使用 RegExp 对象的 Execute 方 
法来创建之。与独立的 Match 对象属性相同,Matches `集合的一个属性是只读的。在执行正则表达式时,可能产生零个 
或多个 Match 对象。每个 Match 对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位 
置的索引。 
  学习了这三个对象和集合,如何应用于字符串的判断和替换呢?regExp对象的三个方法正好解决了这个问题,它们是 
Replace方法、Test方法和Execute方法。 
  1、Replace 方法 
  替换在正则表达式查找中找到的文本。我们还是先看个例子:下面的例子说明了 Replace 方法的用法。 
<%
Function ReplaceTest(patrn, replStr)
Dim regEx, str1 ' 建立变量。
str1 = "The quick brown fox jumped over the lazy dog."
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分大小写。
ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
End Function
Response.write ReplaceTest("fox", "cat") & "
" ' 将 'fox' 替换为 'cat'。
Response.write ReplaceTest("(\S+)(\s+)(\S+)", "$3$2$1") ' 交换词对.
%> 
  2、Test 方法 
  对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。正则表达式搜索的实际 
模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。 
  如果找到了匹配的模式,Test方法返回True;否则返回False。下面的代码说明了Test 方法的用法。 
<%
Function RegExpTest(patrn, strng)
Dim regEx, retVal ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = False ' 设置是否区分大小写。
retVal = regEx.Test(strng) ' 执行搜索测试。
If retVal Then
RegExpTest = "找到一个或多个匹配。"
Else
RegExpTest = "未找到匹配。"
End If
End Function
Response.write RegExpTest("is.", "IS1 is2 IS3 is4")
%> 
  3、Execute 方法 
  对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。 
  Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹 
配,Execute 将返回空的 Matches 集合。 

  三、JavaScript中正则表达式的使用 
  在JavaScript 1.2版以后,JavaScript也支持正则表达式。 
  1、replace 
  replace在一个字符串中通过正则表达式查找替换相应的内容。replace并不改变原来的字符串,只是重新生成了一个 
新的字符串。如果需要执行全局查找或忽略大小写,那么在正则表达式的最后添加g和i。 
例: 
<SCRIPT> 
re = /apples/gi; 
str = "Apples are round, and apples are juicy."; 
newstr=str.replace(re, "oranges"); 
document.write(newstr) 
</SCRIPT> 
结果是:"oranges are round, and oranges are juicy." 
例: 
<SCRIPT> 
str = "Twas the night before Xmas..."; 
newstr=str.replace(/xmas/i, "Christmas"); 
document.write(newstr) 
</SCRIPT> 
结果是:"Twas the night before Christmas..." 
例: 
<SCRIPT> 
re = /(\w+)\s(\w+)/;str = "John Smith"; 
newstr = str.replace(re, "$2, $1"); 
document.write(newstr) 
</SCRIPT> 
结果是:"Smith, John". 
  2、search 
search通过正则表达式查找相应的字符串,只是判断有无匹配的字符串。如果查找成功,search返回匹配串的位置, 
否则返回-1。 
         search(regexp) 
<SCRIPT> 
function testinput(re, str){ 
if (str.search(re) != -1) 
midstring = " contains "; 
else 
midstring = " does not contain "; 
document.write (str + midstring + re.source); 
} 
testinput(/^[1-9]/i,"123") 
</SCRIPT> 
  3、match 
  match方法执行全局查找,查找结果存放在一个数组里。 
例一: 
<SCRIPT> 
str = "For more information, see Chapter 3.4.5.1"; 
re = /(chapter \d+(\.\d)*)/i; 
found = str.match(re); 
document.write(found); 
</SCRIPT> 
显示结果:Chapter 3.4.5.1,Chapter 3.4.5.1,.1 
例二: 
<SCRIPT> 
str = "abcDdcba"; 
newArray = str.match(/d/gi); 
document.write(newArray); 
</SCRIPT> 
显示结果D, d. 

  四、示例 
1 、判断数字的正确性 
<%@ Language=VBScript %> 
<script language="javascript" runat="server"> 
function isNumeric(strNumber) { 
return (strNumber.search(/^(-|\+)?\d+(\.\d+)?$/) != -1); 
} 
function isUnsignedNumeric(strNumber) { 
return (strNumber.search(/^\d+(\.\d+)?$/) != -1); 
} 
function isInteger(strInteger) { 
return (strInteger.search(/^(-|\+)?\d+$/) != -1); 
} 
function isUnsignedInteger(strInteger) { 
return (strInteger.search(/^\d+$/) != -1); 
} 
</script> 
<HTML> 
<BODY> 
判断数字的正确性 
<%
Dim strTemp
strTemp = CStr(Request.Form("inputstring"))
If strTemp = "" Then strTemp = "0"
%> 
<TABLE BORDER="1" CELLPADDING="4" CELLSPACING="2"> 
<TR> 
<TD ALIGN="right">原始字符串</TD> 
<TD><%= strTemp %></TD> 
</TR> 
<TR> 
<TD ALIGN="right">数字</TD> 
<TD><%=isNumeric(strTemp)%></TD> 
</TR> 
<TR> 
<TD ALIGN="right">非负数字</TD> 
<TD><%=isUnsignedNumeric(strTemp)%></TD> 
</TR> 
<TR> 
<TD ALIGN="right">整数</TD> 
<TD><%=isInteger(strTemp)%></TD> 
</TR> 
<TR> 
<TD ALIGN="right">非负整数()</TD> 
<TD><%=isUnsignedInteger(strTemp)%></TD> 
</TR> 
</TABLE> 
<FORM ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>" METHOD="post"> 
请输入一个数字:
 
<INPUT TYPE="text" NAME="inputstring" SIZE="50"></INPUT>
 
<INPUT TYPE="submit" Value="提交"></INPUT>
 
</FORM> 
</BODY> 
</HTML> 
2、判断Email地址的正确性 
<%
Function isemail(strng)
isemail = false
Dim regEx, Match
Set regEx = New RegExp
regEx.Pattern = "^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$"
regEx.IgnoreCase = True
Set Match = regEx.Execute(strng)
if match.count then isemail= true
End Function
%>


五、总结 
  上面我们介绍了正则表达式的基本概念,以及在VBScript和JavaScript中如何使用正则表达式,同时,通过一些实例 
让大家有了感性的认识。正则表达式的应用范围很广,能为大家解决很多实际中的问题。本文介绍的内容只是一些初步的 
知识,还有很多语法规则需要大家继续学习,在实践中发现问题,解决问题。 返回顶部 



             怎么实现数据记录的分页显示(作者:DarkMan) 

怎么实现数据记录的分页显示 (1) 

通过Recordset的GetRows方法,可以实现数据记录的分页显示。下面是一个完整的例子: 
<%@ Language = VBSCRIPT %> 
<% Option Explicit %> 
<%
Dim iStart, iOffset
iStart = Request("Start")
iOffset = Request("Offset")

if Not IsNumeric(iStart) or Len(iStart) = 0 then
  iStart = 0
else
  iStart = CInt(iStart)
end if

if Not IsNumeric(iOffset) or Len(iOffset) = 0 then
  iOffset = 10
else
  iOffset = Cint(iOffset)
end if

Response.Write "察看 " & iOffset & " 个记录从 " & iStart & "开始
"

Dim objConn, objRS
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=SQLOLEDB.1;Data Source=(local);uid=sa;pwd=;Initial    Catalog=pubs"

Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "SELECT * FROM Authors", objConn

Dim aResults
aResults = objRS.GetRows

objRS.Close
Set objRS = Nothing

objConn.Close
Set objConn = Nothing

Dim iRows, iCols, iRowLoop, iColLoop, iStop
iRows = UBound(aResults, 2)
iCols = UBound(aResults, 1)

If iRows > (iOffset + iStart) Then 
  iStop = iOffset + iStart - 1 
Else 
  iStop = iRows 
End If 

For iRowLoop = iStart to iStop 
  For iColLoop = 0 to iCols 
 Response.Write aResults(iColLoop, iRowLoop) & " " 
 Next 
  Response.Write "
" 
 Next 

Response.Write "<P>" 
if iStart > 0 then 
'显示“前 10个”连接 
  Response.Write "<A HREF=""paging.asp?Start=" & iStart-iOffset & _
 "&Offset=" & iOffset & """>前 " & iOffset & "" 
 end if 

if iStop < iRows then
'显示“后 10个”连接
 Response.Write " <A HREF=""paging.asp?Start=" & iStart+iOffset & _
  "&Offset=" & iOffset & """>后 " & iOffset & "" 
end if 
%> 


怎么实现数据的分页显示(2) 
这里介绍另外一种分页显示的方法,是通过 MS SQL的存储过程。本方法不适用于Access数据库。 
假设我们要对数据表MyTable的数据实现分页显示,首先写一个存储过程 如下: 
CREATE PROCEDURE sp_PagedItems 
 ( 
  @Page int, 
  @RecsPerPage int 
  ) 
  AS 

  -- 加快表的 插入速度 
  SET NOCOUNT ON 

  -- 开始记录 号 
  DECLARE @RecCount int 
  SELECT @RecCount = @RecsPerPage * @Page + 1 

  --创建临时 表 
  CREATE TABLE #TempItems 
  ( 
  ID int IDENTITY, 
  Name varchar(50), 
  Price currency 
 ) 

  -- 准备临时 表 
  INSERT INTO #TempItems (Name, Price) 
  SELECT Name,Price FROM MyTable ORDER BY Price 

  -- 求出要查 询的最小ID和最大ID 
  DECLARE @FirstRec int, @LastRec int 
  SELECT @FirstRec = (@Page - 1) * @RecsPerPage 
  SELECT @LastRec = (@Page * @RecsPerPage + 1) 

  -- 得到实际 的记录,并返回是否还有数据! 
  SELECT *, 
  MoreRecords = 
 ( 
  SELECT COUNT(*) 
  FROM #TempItems TI 
  WHERE TI.ID >= @LastRec 
 ) 
  FROM #TempItems 
  WHERE ID > @FirstRec AND ID < @LastRec

  -- 恢复设置
  SET NOCOUNT OFF

  在这个存储过程里,我们首先创建一个全部 记录的临时表,并增加了一个自动编号的字段ID。这样,不同的记录就有
一个递增的唯一标志。
  根据当前的页号和每页的记录数,可以计算 出每页的最小和最大的ID。从而得到当前页的所有记录。
  为了显示的方便,存储过程还计算了 MoreRecords字段,作为显示下一页的判断条件。
  利用了这个存储过程的程序代码如下:
 <%
  '每页显示10条
  Const iRecordsPerPage = 10

  Dim currentPage '当前页号
  Dim bolLastPage '在最后一页?
  
 if len(Request.QueryString("page")) = 0 then
   currentPage = 1
 else
   currentPage = CInt(Request.QueryString("page"))
 end if

  '得到当前页的记录
  strSQL = "sp_PagedItems " & currentPage & "," & iRecordsPerPage
  objRS.Open strSQL, objConn
  
  '判断是否在最后一页
 if Not objRS.EOF then
   if CInt(objRS("MoreRecords")) > 0 then 
    bolLastPage = False 
   else 
    bolLastPage = True 
   end if 
  end if 
  %> 
  <P> 

 <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=4 ALIGN=CENTER> 
  <TR><TH COLSPAN=2 BGCOLOR=NAVY> 
  <FONT SIZE=+1 COLOR=WHITE> 
    List of Items 
   
  </TH></TR> 
 <%
  Do While Not objRS.EOF %> 
   <TR><TD ALIGN=LEFT BGCOLOR=GRAY> 
   <%=objRS("Name")%> 
   </TD><TD ALIGN=CENTER BGCOLOR=GRAY> 
   <%=FormatCurrency(objRS("Price"))%> 
   </TD></TR> 
  <% objRS.MoveNext
  Loop %> 
 </TABLE> 
  <P> 
  <CENTER> 
 <%

  '第一页不 显示“前一页”
 if currentPage > 1 then %> 
  <INPUT TYPE=BUTTON VALUE="<< 前 <%=iMaxRecords%> 记录 " 
  ONCLICK="document.location.href='thispage.asp?page=<%=currentPage-1%>'"> ; 
     
 <% end if

  '最后一页 不显示“后一页”
 if Not bolLastPage then %> 
  <INPUT TYPE=BUTTON VALUE="后 <%=iMaxRecords%> 记录 >>" 
  ONCLICK="document.location.href='thispage.asp?page=<%=currentPage+1%>'"> ; 
 <% end if %> 
  </CENTER> 
posted @ 2006-09-21 03:15 メ冰枫ぱ雪 阅读(426) | 评论 (0) | 编辑
 
Asp.Net细节性问题精萃
  1.<%=...%>与<%#... %>的区别:
   答:<%=...%>是在程序执行时调用,<%#... %>是在DataBind()方法之后被调用

2.控件接收哪些类型数据?
      答:接收Bind的控件,一般有DropDownList,DataList,DataGrid,ListBox这些集合性质的控件,而被捆绑   的主要是ArrayList(数组),Hashtable(哈稀表),DataView(数据视图),DataReader这四个,以后我们就可以   对号入座,不会出现DataTable被捆绑的错误了:)

3.DataBind,获得的数据,系统会将其默认为String,怎样转化为其它的类型?
  DataBinder.Eval(Container.DataItem,"转换的类型","格式")
  最后一个"格式"是可选的,一般不用去管他,Container.DataItem是捆绑的数据项,"转换类型"指的是    Integer,String,Boolean这一类东西.

4.主要命名空间:
  <% @ Import Namespace="System.Data" %>    处理数据时用到
  <% @ Import Namespace="System.Data.ADO" % >  使用ADO.net ; 时用到
  <% @ Import Namespace="System.Data.SQL" %>   SQL Server 数据库专用
  <% @ Import Namespace="System.Data.XML" %>   不用看处理XML用到
  <% @ Import Namespace="System.IO" %>   处理文件时用到
  <% @ Import Namespace="System.Web.Util" %>   发邮件时大家会用到
  <% @ Import Namespace="System.Text" %>    文本编码时用到

5.Connections(SQLConection 或者 ADOConnection)的常用属性和方法:
  | ConnectionString 取得或设置连结数据库的语句
  | ConnectionTimeout 取得或设置连结数据库的最长时间,也是就超时时间
  | DataBase 取得或设置在数据库服务器上要打开的数据库名
  | DataSource 取得或设置DSN,大家不会陌生吧:)
  | Password 取得或设置密码
  | UserID 取得或设置登陆名
  | State 取得目前联结的状态
  | Open() 打开联结
  | Close() 关闭联结
  | Clone() 克隆一个联结。(呵呵,绵羊可以Connection我也可以)
 示例:
     SQLConnection myConnection = new SQLConnection();
     myConnection.DataSource = "mySQLServer";
     myConnection.Password = "";
     myConnection.UserID = "sa";
     myConnection.ConnectionTimeout = 30;
     myConnection.Open();
     myConnection.Database = "northwind";
     myConnection.IsolationLevel = IsolationLevel.ReadCommitted
6.Command常用的方法和属性
   | ActiveConnection 取得或设置联结Connections
   | CommandText 执行的SQL语句或储存过程(StoredProcedure)名
   | CommandTimeout 执行的最长时间
   | CommandType Command操作的类型(StoredProcedure,Text,TableDirect)三种,默认Text
   | Parameters 操作储存过程时使用
   | Execute() 执行SQL语句或储存过程
   | ExecuteNonQuery() 同上,区别在于不返回记录集
   | Clone() 克隆Command
  示例:
     string mySelectQuery = "SELECT * FROM Categories ORDER BY CategoryID";
     stringmyConnectString="userid=sa;password=;database=northwind;server=mySQLServer";
     SQLCommand myCommand = new SQLCommand(mySelectQuery);
     myCommand.ActiveConnection = new SQLConnection(myConnectString);
     myCommand.CommandTimeout = 15;
     myCommand.CommandType = CommandType.Text;< /FONT >

 

7.打开和关闭数据库两种方法:
      1.MyConnection.Open();    //打开联结
        MyConnection.Close();
      2.MyCommand.ActiveConnection.Open();
        MyCommand.ActiveConnection.Close() 

8.使用DataSet,在数据库中增加、修改、删除一个数据
      a.添加数据
            DataRow dr=MyDataSet.Tables["UserList"].NewRow();
            dr["UserName"] = "周讯";
            dr["ReMark"] = "100";
            dr["Comment"] = "漂亮MM";
            MyDataSet.Tables.Rows.Add(dr);

      b.修改数据
            MyDataSet.Tables["UserList"].Rows[0]["UserName"]="飞刀大哥";

      c.删除数据
            MyDataSet.Tables["UserList"],Rows[0].Delete();

      d.恢复数据
            if(MyDataSet.HasErrors)
             {
               MyDataSet.RejectChanges();
             }
     
      e.探测DataSet是否有改动
            if(MyDataSet.HasChanges)
             {
                //保存代码
             }else{
                //因为没有变化,所以不用保存,以节省时间
             }

      f.更新数据库
            MyComm.Update(MyDataSet);   //更新数据库中所有的表
            MyComm.Update(MyDataSet,"UserList");  //更新某个表
9.DataGrid实现分页功能
     AllowPaging="True"   //是指允许分页,这个是最主要的。有了它,我们才能分页。
     PageSize="5"         //是指定每页显示的记录数,如果不写,就会默认为10条。
     PagerStyle-HorizontalAlign="Right"  //是指定分面显示的定位,默认是Left

     PagerStyle-NextPageText="下一页"    //把<>改为上一页和下一页字符串
     PagerStyle-PrevPageText="上一页"

     PagerStyle-Mode="NumericPages"       //把<>改为123数字显示
10.显示一共有多少页,并且报告当前为第几页
     当前页是:<font color=red><%=DataGrid1.CurrentPageIndex+1%></font><br>
     总页数是:<font color=red><%=DataGrid1.PageCount%></font><br>
11.个性化分页
     程序员大本营之"亲密接触ASP.Net(14)"有完整代码

12.要将页面重置为有效的状态
 IValidator val;
        foreach(val in Validators)
         {
            Val.IsValid = true;
         }
13.重新执行整个验证序列   
        IValidator val;
        foreach(val in Validators)
         {
            Val.Validate();
         }
14.禁用客户端验证
 <%@ Page Language="c#" clienttarget=downlevel %>
15.Repeater、DataList和DataGrid控件用途"
     这些控件可以简化几种常见的 Web 应用程序方案,包括报表、购物车、产品列表、查询
 结果和导航菜单。  Repeater是唯一允许在其模板中存在 HTML片段的控件.
16.Server.Execute("another.aspx")和Server.Transfer("another.aspx")区别:
       Execute是从当前页面转移到指定页面,并将执行返回到当前页面
 Transfer是将执行完全转移到指定页面
17.XML文件中可以自己存有架构,也可以存在于*.xsl文件中,但必须通过xmlns属性在xml文档的根节点中指定该信息,如下所示:
 <rootelement xmlns="x-schema:scheduledSchema.xsl">
18.XML文件的读取
 FileStream myfs=new Filestream(Server.MapPath("xmldtagrid.xml"),FileMode.Open,FileAccess.Read);
 StreamReader myreader=new StreamReader(myfs);
 DataSet myds=new DataSet();
 myds.ReadXml(myreader);
19.正则表达式 控件RegularExpressionValidator
 符号   含义
 ^   指定检查开始处
 $   指定检查结束处
 []   检查输入的值是否与方括弧中的字符之一相匹配
 \W   允许输入任何值
 \d{}   "\d"指定输入的值是一个数字,{}表示已指定数据类型的出现次数
 +   表明一个或多个元素将被添加到正在检查的表达式
    示例:电子邮件格式(具有@号,且以.com/.net/.org/.edu结尾) 
     validationexpression="^[\w-]+@[\w-]+\.(com|net|org|edu)$"
20.DataGrid控件中数据操作重要语句:
 属性:DataKeyField="userid"  //设userid为表的主键,无法将该字段的值更新到数据库,最好设表的主键为DataGrid的主键
 SqlCommand.Parameters["@userid"].Value=dg.DataKeys[(int)e.Item.ItemIndex]; //检索所要更新的行的主键(将当前选定的行的               主键值赋给命令的一个参)数
 SqlCommand.Parameters["@fname"].Value=((TextBox)e.Item.Cells[2].Controls[0]).Text; //为参数赋予已修改的行值
21.自定义控件:
 a.用户控件(ASP创建页面一样)
  (I).  创建页面,拖入控件,设置属性/方法.   <% @Control Language="C#" Debug="True" %>中的@Control指令来定义此页         将包含控件代码
  (II)  保存为*.ascx文件,如a.ascx.
  (III).使用: 头<%@Register Tagprefix="MyFirstControl" TagName="MyLbl" Src="a.axcs" %>
    //Tagprefix为控件的前缀,像ASP:TextBox中的ASP
    //TagName用于指定自定义控件的名称
    //Src指定控件文件源
      身体:<MyFirstControl:MyLbl runat="Server" id="AllMine" MyText="成功了" />    
 b.使用C#创建自定义控件
  (I). 创建纯代码文件,继承基类Control,并保存为*.cs,如a.cs.
  (II).将代码编译生成程序集: csc /t:library /r:System.dll,System.Web.Dll a.cs 
      //library告诉C#编译器生成程序集
      //  /r:System.dll System.Web.Dll告诉C#编译器引用指定的程序集
  (III).将生成dll文件放在bin目录中
  (IV).使用: <% @Register TagPrefix="Mine" Namespace="MyOwnControls" Assembly="a" %>
22.复合控件注意事项:
 public class MyCompositin:Control,INamingContainer   //INamingContainer:如果在页面上有多个此控件实例,则此结口可以给每         {}           //个实例有唯一标志

 this.EnsureChildControls();//表示将复合控件的子控件都呈现到页面上,此方法检查服务器控件是否包含子控件

 CreateChildControls
23.Button/LinkButton/ImageButton/HyperLink什么时候用?
         1.Button和ImageButton用于将数据传递回服务器.
         2.Hyperlink用于在页面之间导航
         3.LinkButton用于将数据保存到服务器或访问服务器上的数据
24.跟踪调试
     跟踪:
 1.页级别跟踪: 在页的开头包括如下的页指令<%@ Page Trace="True" TraceMode="SortByCategory/SortByTime" %>
  自定义消息:
        Trace.Write("这里为要显示的字符串");
        Trace.Warn("这里为要显示的字符串");   //与Trace.Write相同,只是字体为红色
                检查是否使用了跟踪
        例句: if(Trace.IsEnabled) { Trace.Warn("已启用跟踪")}   
 2.应用程序级别跟踪: 在Web.config文件的<System.Web>节中 <trace enabled="true" pageOutput="true"/>
25.设置缓存:
 1.输出缓存:
            I.页面设置: 将  <%@ OutputCache Duration="120" VaryByParam="none" %>  加在需要缓存页的开头 
                               注释:在请求该页的后两分钟之内,输出内容不变
     II.编程方式设置:
                   主要使用类System.Web.HttpCachePolicy类下的方法
         (1). Response.Cache.SetExpires(DateTime.Now.AddSeconds(120));  //在此方法中必须指定到期时间,如本语                                                                                       //句为两分钟
         (2). Response.Cache.SetExpires(DateTime.Now.AddSeconds(120));
                            Response.Cache.SetSlidingExpiration(true);  //"可调到期",主要用于那些开始访问量大,但随后访问                                                                              //量平衡的情况
                            功能:第一句设置缓存到期时间,第二行打开 sliding expiration(可调到期).
         2.数据缓存:
               (1).DataView mySource; (2).给mySource赋值;
               (3).Cache["myCache"]=mySource; (4).mySource=(DataView)Cache["myCache"]
26.部署: 直接复制到产品服务器即可 复制语句: XCOPY <source_path> <destination_path> //XOPY只接受物理路径,不接受虚拟路径

posted @ 2006-09-18 17:26 メ冰枫ぱ雪 阅读(88) | 评论 (0) | 编辑
 
Asp 高效分页代码,带注释,收集中。。

<SCRIPT LANGUAGE=javascript>
<!--
function sss(i)
{
 document.s.pagelabel.value =i;
 document.s.submit();

}
//-->
</SCRIPT>

<%


mysql="select count(*) from youtableName "
rs.open mysql,conn,1
totalcount=rs(0)   '总记录数
rs.close

pagesize=30  '每页显示记录数
pagelabel=clear(request("pagelabel"))  '第pagelabel页
if pagelabel="" then
 pagelabel=1
end if

'***********************下面是关键,我们每页显示pagesize条数据,我们select的时候就只选择pagesize数量的记录。

if pagelabel<>1 then  '如果不是第一页,假设是第3页,那么你需要知道前(pagelabel-1)*pagesize条记录最大的ID(该ID是表自增加ID索引)
 mysql="select max(id) from (select top "&(pagelabel-1)*pagesize&" id from youtableName " )
 mysql=mysql&") ta" 
 rs.open mysql,conn,1
 pagelabel=rs(0)     
 rs.close()
 mysql="select top "&pagesize&" * from youtableName where id>"&pagelabel '取出大于ID的pagesize条记录
else
 mysql="select top "&pagesize&" * from youtableName " 
end if


set rs=conn.Execute(mysql)
%>
<table border=0 cellpadding=0 cellspacing=0 width="100%" class="big">
 <form name="s" action="" method="post">
 <tr class="head">
  <td align='center'>列名1</td>
  <td align='center'>列名2</td>
  <td align='center'>列名3</td>
 
 </tr>
 <input type="hidden" name="pagelabel">
 </form>
 
<%
if not rs.eof then
arrdata1=rs.GetRows()
rs.close
set rs=nothing

rowsA=ubound(arrdata1,2) '本页的记录数

pagecount=totalcount / pagesize  '页数
if ((totalcount mod pagesize)<>0) then
 pagecount=int(pagecount)+1
else
 pagecount=int(pagecount)
end if
 
  for i=0 to rowsA       
 
   Response.Write "<TR><TD  align=center>"&arrdata1(1,i)&"</td>"
   Response.Write "<td align='center'>"&arrdata1(2,i)&"</td>"
   Response.Write "<td align='center'>"&arrdata1(3,i)&"</td>"
   'Response.Write "<td align='center'>"&arrdata1(4,i)&"</td>"
   'Response.Write "<td align='center'>"&arrdata1(4,i)&"</td>"
   Response.Write "</tr>"
   Response.Write "<TR><TD colspan='5' height='1' bgcolor='#E6E7E4'></td></tR>"
  
  next 
  %>
  <tr><td height="30" align="center">
  <%
  Response.write "总条数:<font color=red>"&totalcount&"</font></td><td colspan=4>&nbsp;&nbsp;分页</font>&nbsp;&nbsp;&nbsp;&nbsp;"
  for i=1 to pagecount 
   Response.Write "<a href='javascript:sss("&i&")' style='color:#398CE7'>"&i&"</a>&nbsp;&nbsp;"
  next
  %>
 
  </td></tr>
  <%
else
 Response.Write "<tr><td colspan=5 align=center>无纪录</td></tr>"
end if
%>
</table>

posted @ 2006-09-09 18:53 メ冰枫ぱ雪 阅读(432) | 评论 (1) | 编辑