在项目开发过程中我们常会遇到这样的情况:往数据库中插入了一条新数据后,需要知道这条新数据的唯一标识,比如ID
1.Oracle
string sqlStr = String.Format(" insert into TableName(id,A,B) values('{0}','{1}','{2}') ", id, a, b);
//。。。。。。
myCmd.ExecuteNonQuery();
对于oracle直接读取相应的序列就可以了,我之前还以为会产生冲突,后来才发现是自己对序列的机制不太了解。
值得注意的是:不管新数据插入成功与否,得到的都是这次操作准备插入的ID值,所以获取值之前最好判断一下插入成功了没有。
2.SQL Server
myConn.ConnectionString = connStr;
myConn.Open();
SqlCommand myCmd = myConn.CreateCommand();
string sqlStr = String.Format("insert into table(A,B) values('{0}','{1}');", a, b);
sqlStr += "select SCOPE_IDENTITY();";
string newID = "";
try
{
SqlTransaction myTran = myConn.BeginTransaction();
myCmd.Transaction = myTran;
myCmd.CommandText = sqlStr;
newID = myCmd.ExecuteScalar().ToString();
myTran.Commit();
}
catch (Exception ex)
{
myTran.Rollback();
}
这里面主要用到了事务和IDENT_CURRENT,IDENT_CURRENT 类似于 SQL Server 2000 标识函数 SCOPE_IDENTITY
和 @@IDENTITY。这三个函数都返回最后生成的标识值。但是,上述每个函数中定义的“最后”的作用域和会话有所不同。
▪ IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
▪ @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
▪ SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
例如,有两个表 Table1 和 Table2,在 Table1 上定义了一个 INSERT 触发器。当将某行插入 Table1 时,触发器被激发,
并在 Table2 中插入一行。这里有两个作用域:一个是在 Table1 上的插入,另一个是作为由于触发器的结果原因在 Table2
上的插入。如果我们不考虑多会话的情况,在Table1中插入一条数据,那么:
select SCOPE_IDENTITY(); --返回插入Table1 中的 IDENTITY 值
select @@IDENTITY ; --返回插入Table2 中的 IDENTITY 值
select IDENT_CURRENT ('Table1'); -- 返回Table1 最后生成的 IDENTITY 值
select IDENT_CURRENT ('Table2'); -- 返回Table2 最后生成的 IDENTITY 值
PS:在 SQL Server2005 中有更简单的方法: insert into TableName(A,B) output inserted.id values('a','b');
功能简介:
(1)可以访问并修改页面元素的相关属性(css,内容,事件等)
(2)与服务器异步交互。jQuery 也提供了一整套Ajax 相关的操作,大大方便了异步交互的开发和使用。
(3)为页面添加动画。通常在页面中添加动画都需要开发大量的JavaScript 代码,而jQuery大大简化了这个过程。jQuery 的库提
供了大量可自定义参数的动画效果。
(4)简化常用的JavaScript 操作。jQuery 还提供了很多附加的功能来简化常用的JavaScript操作,例如数组的操作、迭代运算等。
JQuery优点
▪ 体积小(v1.2.3 15kb)
▪ 丰富的DOM选择器(CSS1-3 + XPath)
▪ 跨浏览器(IE6,FF,Safari,Opera)
▪ 链式代码
▪ 强大的事件、样式支持
▪ 强大的AJAX功能
▪ 易于扩展,插件丰富
代码风格:
$(document).ready(function() {
//为页面上的每一个链接添加一个点击事件
$("a").click(function() {
alert("Hello world!");
});
//为ID为orderedlist的元素添加red样式
$("#orderedlist").addClass("red");
});
1.关于DOM元素的获取
$("#p"): ID为p的一个元素,相当于JavaScript里的document.getElementById("p")
$(".p"): 所有样式名为p的元素,返回的是一个元素集
$("p"): 所有HTML标签为p的元素,返回的是一个元素集
jQuery的选择符支持id,tagName,css1-3 expressions,XPath;
除此之外,还可以根据DOM元素的父子关系,内容,属性,位置等相关信息进行筛选,
也可以在获得的元素集上进一步筛选,具体功能参见API文档(中文,英文)
2.修改设置元素的属性、样式及DOM处理
html(),html(val) text(),text(val) val(),val(val)
height(),height(val) width(),width(val)
相信从字面上就能知道他们的意思了
此外jQuery还提供了强大的方法来方便我们操作DOM对象,详细说明请见API文档
3.事件
对于JavaScript里的onXXX事件(如onclick,onchange,onsubmit等),在jQuery里都有对应的表示方法,只是
jQuery不喜欢onXXX,所以都改成了XXX,去掉了on。其他的一些事件,如ready和hover,也提供了相应的方法。
//JavaScript:
obj.onclick=function(){alert('hello!');}
//jQuery:
$("#id").click(function(){alert('hello!');});
4.Ajax
(1)通用方式:
$.ajax(prop) 通过一个ajax请求,获取远程数据,prop是一个hash表,它可以传递的key/value有以下几种。
(String)type:数据传递方式(get或post)。
((String)url:数据请求页面的url
((String)data:传递数据的参数字符串,只适合post方式
((String)dataType:期待数据返回的数据格式(例如 "xml", "html", "script",或 "json")
((Boolean)ifModified: 当最后一次请求的相应有变化是才成功返回,默认值是false
((Number)timeout:设置时间延迟请求的时间。可以参考$.ajaxTimeout
((Boolean)global:是否为当前请求触发ajax全局事件,默认为true
((Function)error:当请求失败时触发的函数。
((Function)success:当请求成功时触发函数
((Function)complete:当请求完成后出发函数
相关代码
$.ajax({url: "ajax.htm",
success:function(msg){
$("#a").html(msg);
}
}); //将ajax.htm返回的内容作为id为a的div内容
$.ajax({ url: "ajax.aspx",
type:"get",
dataType:"html",
data: "name=John&location=Boston",
success:function(msg){
$("#a").html(msg);
}
}); //用get方式向ajax.aspx页面传参数,并将返回内容负给id为a的对象。
(2)简化方式:
$.get(url, params, callback) 用get方式向远程页面传递参数,请求完成后处理函数,除了url外,其它参数任意选择!
$.post(url, params, callback) 用post方式向远程页面传递参数,请求完成后处理函数callback
$.get( "ajax.htm" , function(data){ $("#a").html(data) });
$.post( "ajax.asp",
{ name: "young", age: "25" },
function(data){ alert("Data Loaded: " + data); }
);
5.动画
hide(), show() 显示/隐藏对象; toggle() 切换元素的可见状态。
slideDown, slideUp, slideToggle 通过高度变化显示/隐藏对象,切换元素的可见状态,即垂直方向上的滑动效果。
fadeIn, fadeOut, fadeTo 淡入淡出效果
animate 自定义动画效果
详细使用说明请参考API文档
jQuery官方API文档:
中文:http://jquery-api-zh-cn.googlecode.com/svn/trunk/index.html
英文:http://docs.jquery.com/Main_Page
其他一些参考文档:
http://www.k99k.com/jQuery_getting_started.html
http://thinhunan.cnblogs.com/archive/2008/03/05/1091816.html
http://wiki.jquery.org.cn/doku.php
http://www.cnblogs.com/skylaugh/archive/2006/12/18/595563.html
sql语句长度超过限制,一般有两种情况:
1.字段的值过长,比如新闻的内容等
解决办法:
begin
insert into TABLE( 字段名 ) values(a);
end;
当然该字段要设成clob类型的
2.动态生成sql语句时整体超过长度限制,比如“ in (‘1’,‘2’,。。。,‘n’)”,当然不只是这一种情况;
我最近就碰到了这种情况,错误提示: ORA-01795: 列表中的最大表达式数为 1000
google一下才知道原来in语句里的数据量不能大于1000条;
最好的解决办法就是优化sql语句,尽量不要产生超长的sql语句。
PS:
这种sql语句长度有限制的问题好像只有Oracle里才会发生,
SQL2000查询分析器里sql语句有64K的限制,但是程序里超过限制的sql语句还是可以执行的
而SQL2005(Express版本)没有此限制
类似sql语句超长的问题好像还有很多,也似乎很复杂,还请高手们多多指教。
response.redirect 其实是当服务器碰到这条语句时发送一条指令(包含新的地址)给浏览器,然后让浏览器去发送http请求,请求那个新的地址,流程如下:
浏览器ASP文件请求->服务器执行->遇到response.redirect语句->服务器发送response.redirect后面的地址给客户机端的浏览器->浏览器请求执行新的地址(服务器返回的Response.Redirect后面的地址)
PS: ASP.net里面用Response.Redirect跳转,PHP里面是Header("Location",$URL);这两种方式都是一样的原理,就是在输出的HTTP头里面加上一个Location字段,值为要跳转的目的地址,同时把返回的HTTP状态值设为302。
Server.Transfer 语句当接受地址后是直接转向后面的地址,流程如下:
浏览器ASP文件请求->服务器执行->遇到Server.Transfer语句->服务器转向新的文件。
优缺点比较:
1.Server.Transfer 只能在同一服务器端的同一站点内进行重定向;而response.redirect 没有此限制。而且Server.Transfer 后面只能使用形如test.asp这样的相对路径的文件或者目录地址,不能带参数。比如要定向到 test.asp?id=1就只能用Response.Redirect 而不能用Server.Transfer。
2.Server.Transfer 在服务器端直接重定向,不用像response.Redirect一样要先与浏览器通信再重定向,这样可以减轻服务器的压力,效率高。
3.Server.Transfer 可以保留上下文信息,Server.Transfer 方法有另一个参数——"preserveForm"。如果你设置这个参数为 True,比如:Server.Transfer("WebForm2.aspx", True), 那么 querystring 和任何 form 变量都会同时传递到你定位的页面。 例:WebForm1.aspx 有一个文本框名为 TextBox1,你利用 preserveForm 为 True 传递到 WebForm2.aspx,你仍然可以用 Request.Form("TextBox1") 来取得文本框的值。
4.Server.Transfer 不会改变客户端的浏览器地址栏内的地址,也不会更新浏览器的历史记录。而response.Redirect 则会显示重定向后的地址,也会更新浏览器的历史记录。
总结:Response.Redirect 简单地告诉浏览器访问另一个页面。Server.Transfer 有利于减少服务器请求,保持地址栏 URL 不变,允许你将 query string 和 form 变量传递到另一个页面(有一点小小的缺陷,请参见:http://support.microsoft.com/default.aspx?id=kb;en-us;Q316920 )。
1. 什么是WAP ?
原先的Web内容很难在移动电话、寻呼机之类移动通信设备的小尺寸屏幕上显示,同时,HTTP和TCP/IP协议也受到了无线带宽的限制,因此才有了WAP的研究。WAP是无线应用协议(Wireless Application Protocol )首字母的缩写。它的作用就是使移动电话和其他无线设备能够访问各种服务和信息,特别是Internet上的服务与信息。WAP不是简单的一个协议,它由许多协议组成的,涵盖了从WAP设备到用户代理以及传输协议与GSM信道的各个方面。许多站点都有关于WAP的信息,具有权威的资料一般来自于WAP Forum。虽然WAP目前还处在刚刚诞生的婴儿阶段,看起来的确有很多不尽人意的地方,但是随着无线通讯工具的普及、网络技术日益成熟、生产商和网络服务商的不断进步,WAP一定会实现现在人们使用IE等浏览器上网冲浪一样的快捷、愉悦,并且更能享受随时随地想上就上的轻松自在。
2. 谁发展了WAP ?
WAP是由一个名叫“WAP论坛”的公开组织发展的。这个讨论组的主要职责是制定WAP的标准和规范。该讨论组的网址为:http://www.wapforum.com/。
3. WAP可以在什么样类型的网络上运行?
WAP是为了可以在多种网络环境中运行而设计的。包括:GSM、PDC、CDPD、CDMA、TDMA、PHS和DECT,还包括3G。
4.WAP的网络架构
WAP网络架构由3部分组成,即WAP网关、WAP手机和WAP内容服务器。其中,WAP网关起着“翻译”协议的作用,是联系GSM网与Internet的桥梁;WAP内容服务器可以存储大量信息,以供WAP手机用户来访问、浏览和查询等;WAP手机为用户提供了上网用的微浏览器及信息、命令的输入方式等。当用户从WAP手机键入想要访问的WAP内容服务器的URL后,信号经过无线网络,以WAP协议方式发送请求至WAP网关,然后经过“翻译”处理,再以HTTP协议方式与WAP内容服务器交互,最后WAP网关将服务器返回的内容压缩、处理成二进制流,并返回到客户的WAP手机屏幕上。
5.WAP采用什么标准
(1)WML1.1 WML
WML指无线标记语言(Wireless Markup Language),就象HTML对普通的Web浏览器一样,与之对应的还有WMLScript。有人说它是基于XML,但是更准确地说WML是XML的一个应用。虽然在语法上和HTML相似,但更多的是XML。
(2)XHTML Mobile 1.0(WAP2.0)
XHTML 1.0是一种在HTML 4.0基础上优化和改进的的新语言,目的是基于XML应用。XHTML是一种增强了的HTML,它的可扩展性和灵活性将适应未来网络应用更多的需求。
6.WAP 1.x与WAP 2.0
与WAP 1.2相比,WAP 2.0主要采用的技术:
1.XHTMLMP。采用XHTMLMP来扩展XHTML的基本用户简介,并能够按需要增加其他语言元素。
2.TCP/IP传送协议移动简本。WAP 2.0 将推动业界为无线链路开发TCP移动简本,
3.能与目前Internet上运行的通用TCP互操作。
4.移动友好技术:包括XHTML的简本; 层叠样式表(CSS)移动简本; 用户个性喜好和设备能力介绍等。

