mikebai.com

  • Home
  • dev
  • DotNET
  • M365
  • 搞笑
  • 杂七杂八
  • FocusDict
DotNET
DotNET

SQLite不支持的SQL语法有哪些

1 TOP这是一个大家经常问到的问题,例如在SQLSERVER中可以使用如下语句来取得记录集中的前十条记录:SELECT TOP 10 * FROM [index] ORDER BY indexid DESC;但是这条SQL语句在SQLite中是无法执行的,应该改为:SELECT * FROM [index] ORDER BY indexid DESC limit 0,10;其中limit 0,10表示从第0条记录开始,往后一共读取10条 2 创建视图(Create View)SQLite在创建多表视图的时候有一个BUG,问题如下:CREATE VIEW watch_single AS SELECT DISTINCTwatch_item.[watchid],watch_item.[itemid] FROM watch_item;上面这条SQL语句执行后会显示成功,但是实际上除了SELECT COUNT(*) FROM [watch_single ] WHERE watch_ single.watchid = 1;能执行之外是无法执行其他任何语句的。其原因在于建立视图的时候指定了字段所在的表名,而SQLite并不能正确地识别它。所以上面的创建语句要改为:CREATE VIEW watch_single AS SELECT DISTINCT [watchid],[itemid] FROM watch_item;但是随之而来的问题是如果是多表的视图,且表间有重名字段的时候该怎么办? 3 COUNT(DISTINCT column)SQLite在执行如下语句的时候会报错:SELECT COUNT(DISTINCT watchid) FROM [watch_item] WHERE watch_item.watchid = 1;其原因是SQLite的所有内置函数都不支持DISTINCT限定,所以如果要统计不重复的记录数的时候会出现一些麻烦。比较可行的做法是先建立一个不重复的记录表的视图,然后再对该视图进行计数。 4 外连接虽然SQLite官方已经声称LEFT OUTER JOIN 已经实现,但还没有 RIGHT OUTER JOIN 和 FULL OUTER JOIN。但是实际测试表明似乎并不能够正常的工作。以下三条语句在执行的时候均会报错:SELECT tags.[tagid] FROM [tags],[tag_rss] WHERE tags.[tagid] = tag_rss.[tagid](*);SELECT tags.[tagid] FROM [tags],[tag_rss] WHERE LEFT OUTER JOIN tag_rss.[tagid] = tags.[tagid];SELECT tags.[tagid] FROM [tags],[tag_rss] WHERE LEFT JOIN tag_rss.[tagid] = tags.[tagid];此外经过测试用+号代替*号也是不可行的。   收集SQLite与Sql Server的语法差异 1.返回最后插入的标识值 返回最后插入的标识值sql server用@@IDENTITY sqlite用标量函数LAST_INSERT_ROWID() 返回通过当前的 SQLConnection 插入到数据库的最后一行的行标识符(生成的主键)。此值与 SQLConnection.lastInsertRowID 属性返回的值相同。 2.top n 在sql server中返回前2行可以这样: select top 2 * from aa order by ids desc sqlite中用LIMIT,语句如下: select * from aa order by ids desc LIMIT 2 3.GETDATE ( ) 在sql server中GETDATE ( )返回当前系统日期和时间 sqlite中没有 4.EXISTS语句 sql server中判断插入(不存在ids=5的就插入) IF NOT EXISTS (select * from aa where ids=5) BEGIN insert into aa(nickname) select 't' END 在sqlite中可以这样 insert into aa(nickname) select 't' where not exists(select * from aa where ids=5) 5.嵌套事务 sqlite仅允许单个活动的事务 6.RIGHT 和 FULL OUTER JOIN sqlite不支持 RIGHT OUTER JOIN 或 FULL OUTER JOIN 7.可更新的视图 sqlite视图是只读的。不能对视图执行 DELETE、INSERT 或 UPDATE 语句,sql server是可以对视图 DELETE、INSERT 或 UPDATE

2009-11-08 0comments 143hotness 0likes mikebai Read all
DotNET

C#使用SQLite数据库

SQLite 是目前比较流行的一个开源、免费的小型的Embeddable RDBMS(关系型数据库),用C实现,内存占用较小,支持绝大数的SQL92标准,个别不支持的情况,在这里说明 对各种语言的支持也比较不错,wrapper很多。 Google Gears 、Mozilla 和 Adobe AIR 都在使用sqlite,应该说明其还是很不错的 SQLite 的关键字列表,这里 支持的sql语法,在这里 在 .NET 里面使用 SQLite, 我这里使用的wrapper是 System.Data.SQLite,它只需要一个dll,接口符合ADO.Net 2.0的定义,性能也不错,NHibernate用的也是它,目前支持ADO.NET 3.5了,支持集成在 VS2005 和 VS2008里面,而且支持wince,是个亮点 因为符合ADO.NET的规范,所以使用方式,基本和 SqlClient, OleDb等原生的一致 using System.Data; using System.Data.SQLite; //... using (SQLiteConnection cn = new SQLiteConnection( "Data Source=Test.db3;Pooling=true;FailIfMissing=false") ) { //在打开数据库时,会判断数据库是否存在,如果不存在,则在当前目录下创建一个 cn.Open(); using (SQLiteCommand cmd = new SQLiteCommand()) { cmd.Connection = cn; //建立表,如果表已经存在,则报错 cmd.CommandText = "CREATE TABLE [test] (id int, name nvarchar(20))"; cmd.ExecuteNonQuery(); //插入测试数据 for (int i = 2; i < 5; i++) { [我的空间服务商竟然把下面的单词也屏蔽了,太业余了.如果你怕买到这么牛逼的空间的话,可以联系] cmd.CommandText = string.Format("I_NSERT INTO [test] V_ALUES ({0}, '中文测试')", i); cmd.ExecuteNonQuery(); } for (int i = 5; i < 10; i++) { cmd.CommandText = string.Format("I_NSERT INTO [test] V_ALUES ({0}, 'English Test')", i); cmd.ExecuteNonQuery(); } //读取数据 cmd.CommandText = "SELECT * FROM [test]"; using (SQLiteDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { while (dr.Read()) { Console.WriteLine("第{0} 条:{1}", dr.GetValue(0), dr.GetString(1)); } } } }//引用2http://www.cnblogs.com/chris1943/archive/2008/02/03/1063279.html刚开始的时候没注意语法后来才发现,原来用SQLite分页是世界上最简单的。如果我要去11-20的Account表的数据Select * From Account Limit 9 Offset 10;以上语句表示从Account表获取数据,跳过10行,取9行嗯,我觉得这个特性足够让很多的web中型网站使用这个了。也可以这样写 select * from account limit10,9和上面的的效果一样。这种写法MySQL也支持。

2009-11-08 0comments 145hotness 0likes mikebai Read all
DotNET

ASP.NET页面跳转后再返回原页面保持最初结果的处理办法

现在用ASP.NET实现一个任务就是解决页面返回的问题,开始他们使用的全是goback();的方法。按照项目的设计,每一个功能都是跳转到一个新的页面(不是在新窗口中打开)。 这样最后使用起来就会有一个很不好的体验。比如,我进入到一个页面,选择了N多查询条件以后,会有个结果列表,点具体信息的时候,会跳转到一个详细信息页面(非新窗口),我在这个详细页面进行信息修改。这个时候操作完毕。需要返回到结果列表页面。就需要点2次按钮。这样操作者就会觉得很麻烦。所以我建议不使用我们项目现在用的这个方法,任何新功能都跳转到一个新的页面。 推荐几种方法 1:在同一个页面,工具功能,显示和隐藏不同的PANL。不涉及到页面之间传值 2:在新窗口中打开 3:使用弹出层 4:视图状态 5:post数据到详细页面,然后在详细页点返回的时候再post回来,不过这样就不太符合asp.net了 但是我的项目不可能大改,只能在原来的基础上改了。改的办法有很多种 1:SESSION,不推荐,会影响程序性能 2:URL参数:不安全,因为参数会暴露在外面 3:通过HttpContext.Current.Handler来获取附上一小段代码,让大家理解 Codepublic partial class Serach : System.Web.UI.Page{    protected void Page_Load( object sender, EventArgs e )    {        if ( !IsPostBack )        {            Result result;            if ( HttpContext.Current.Handler is Result )            {                result = HttpContext.Current.Handler as Result;                Response.Write( result.text );            }        }    }     public string datatime    {        get { return this.TextBox1.Text; }        set { this.TextBox1.Text = value; }    }     protected void Button1_Click( object sender, EventArgs e )    {        Server.Transfer( "Result.aspx" );    }}//查询页面public partial class Result : System.Web.UI.Page{       protected void Page_Load(object sender, EventArgs e)    {        if ( !IsPostBack )        {            Serach serach;            if ( HttpContext.Current.Handler is Serach )            {                serach = HttpContext.Current.Handler as Serach;                this.HiddenField1.Value=serach.datatime ;            }        }    }     public string text    {        get { return this.HiddenField1.Value; }        set { this.HiddenField1.Value = value; }    }    protected void btnText_Click( object sender, EventArgs e )    {        Server.Transfer( "Serach.aspx" );    }} //结果页面 这样你可以保存你最初的查询SQL语句,返回的时候再重新加载SQL语句   4:Server.transfer配合previouspage属性page类有个previouspage属性,这样你可以获取上个页面的信息了 if ( Page.PreviousPage != null ) {      ContentPlaceHolder content = ( ContentPlaceHolder ) Page.PreviousPage.Master.FindControl( "UIContentAreaPlaceHolder" );            //Response.Write( hf.Value );  

2009-11-05 0comments 136hotness 0likes mikebai Read all
DotNET

asp.net 返回上一页的实现方法小集

返回上一页的这个东东在我们做项目的时候一般是用于填写完表单后确认的时候,有对原来输入的数据进行修改时用的,或者是因为网站为了方便浏览者而有心添加 的一个东东,一般这种功能的实现在ASP.net中都是用一个button的控件来实现的,实现的方法有很多,今天恰好在做项目时碰到要用这个东东,我就 把能实现" 返回上一页","返回前一页"的几种方法总结了一下,供大家学习之用,请多多指教:0) 其实要实现这个功能主要还是要用到javascript 方法一: 在asp.net的aspx里面的源代码中<input type="button onclick="javascript:window.history.go(-1);"value="返回上一页"> 浅析:这个是用了HTML控件,通过一个onclick的事件,调用了javascript中的一个方法就可以了。这个是最简单的了,也同样适用于静态页面,ASP页面等。 方法二: 利用Reponse.write如果你对ASP有一定的了解,那么对Response.write这个东东就不会陌生了,方法一是直接有HTML页面中实现,则这个则是在后台环境中实现(这个说法好像不是很规范,呵呵) Response.write("<script language=javascript>history.go(-2);</script>) <a   href="#"   onclick="javascript:history.back();">返回前一页</a> 这里为会么要采用-2的值呢,我个人认为是这样的:因为在asp.net中的页面,当你按下一个button后,由于页面中会实现page.postback的缘故,实际上在这其中是刷新了两次页面,我们要的是第一次的,所以就...... 方法三 利用Response.Redirect() 或 server.transfer() 在page_load中加入if(!IsPostBack)           ViewState["retu"]=Request.UrlReferrer.ToString();       而在在返回按钮事件中     Response.Redirect(ViewState["retu"].ToString());     或Server.Transfer   (ViewState["retu"].ToString());   浅析:Request.UrlReferrer可以获取客户端上次请求的url的有关信息,我们在使用这个的时候最好对其进行一个判断 if(ViewState["UrlReferrer"]!=null)         Response.Redirect(ViewState["UrlReferrer"].ToString(); else{Response.write("对不起,当前是最前页码“); 这样才好使一点点喔} 以下这段来自:http://stswordman.cnblogs.com/archive/2006/06/12/423910.html在使用Request.UrlReferrer时还要注意: 1.  如果上一页面使用document.location方法导航到当前页面,Request.UrlReferrer返回空值2.   如果有A,B两个页面,在浏览器中直接请求A页面,在A页面的中Page_Load事件中导航到B 页面,则     Request.UrlReferrer返回空。因为 在Page_load事件中页面还未初始化,所以无法记录当前页的信息,导航到b页面也就 无法获得上一页面的信息   3.  点击刷新按钮不会改变Request.UrlReferrer 方法四: 这个方法估计很少人用,不过我试了一下,也还很不错喔 在button的onClick事件中输入 this.RegisterClientScriptBlock("e", "<script language=javascript>history.go(-2);</script>"); 一样可以 返回到上一页 方法五 <a href=<%=request.servervariable("http_Referre)%> <asp:image id="imageback" visible = true" imagurl="上一页" runat="server"/></a> 这 里还要啰嗦一下用Javascript来实现与用Response.redirect()来实现的一点点区别,如果你是用天表单的时候想保留你填的数据, 那就要用history.go();这个东东,如果你只是直接返回不用做任何操作,你就可以用reponse.redirect()了.  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mhkbluesky/archive/2008/04/12/2284462.aspx

2009-11-05 0comments 133hotness 0likes mikebai Read all
DotNET

ASP.NET 中处理页面“回退”的方法

我们在编写基于 ASP.NET 的应用程序时,如果代码执行出错或检测到异常,一般会提示用户“返回”或“回退”,或者在多步操作、列表/详细的查看界面中,也会给用户提供回退到上一页面的链接,对于这种情况,大家很快就会想到的简单做法就是利用 Javascript 来实现,即 history.go(-1) ,但是由于 ASP.NET 页面的 PostBack 机制,所以 history.go(-1) 可能还是当前页面,而不能真正回退到上一页面。     在 Classifieds Site Starter Kit 中,学习到一种不错的关于回退的处理方法,可以分别在客户端和服务器控件中实现页面的回退,代码如下: 1)首先在页面中增加两个属性 //记录上一个页面的信息 private string UrlReferrer ...{ get ...{ return ViewState["UrlReferrer"] as string; }

2009-11-05 0comments 138hotness 0likes mikebai Read all
DotNET

callback笔记

public string GetCallbackEventReference ( Control control, 处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。 string argument, 从客户端脚本传递给服务器端的一个参数、RaiseCallbackEvent 方法。  string clientCallback, 一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果。即服务器端GetCallbackResult方法返回给客户端JS所在的方法。用户定义在<script>块中的JavaScript回调(callback)函数名。回调(callback)执行后,此函数最终负责页面的更新。 string context 上下文对象,客户端回调的客户端函数(即该方法的返回值函数)返回给clientCallback的一个参数. string clientErrorCallback,客户端事件处理程序的名称,该处理程序在服务器端事件处理程序出现错误时接收结果。  bool useAsync true 表示同步执行回调;false 表示异步执行回调。 ) 返回值调用客户端回调的客户端函数的名称。 GetCallbackEventReference函数将产生如下的脚本调用:WebForm_DoCallback(pageID, input, UpdateEmployeeViewHandler, null, null); 客户端JS需要2个函数一是出发改回调的激发函数,即GetCallbackEventReference的返回值二是处理服务器端所返回的结果数据,并对当前client页面进行更新的函数.即上述函数参数中的clientCallback <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="SRS.Web.WebForm1" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    <title></title>     <script type="text/javascript">        function DoCallBack(arg, evt, context) {            WebForm_DoCallback("__Page", arg, evt, context, null, false);        }         function btnCallback(arg, context) {            DoCallBack(arg, this.callbackEvent, context);        }         function callbackEvent(arg, context) {            alert(arg + context);        }    </script> </head><body>    <form id="form1" runat="server">    <div>        <input type="button" value="Callback" onclick="btnCallback(1, 'Message')" />    </div>    </form></body></html>     public partial class WebForm1 : System.Web.UI.Page, ICallbackEventHandler    {        protected void Page_Load(object sender, EventArgs e)        {            Page.ClientScript.GetCallbackEventReference(this, "", "", "");        }        protected void Button1_Click(object sender, EventArgs e)        {            Response.Write("");        }        void ICallbackEventHandler.RaiseCallbackEvent(String eventArgument)        {            eventArgument = "i have changed~";        }        string ICallbackEventHandler.GetCallbackResult()        {            return "Data from server...";        }    }   例子2 <%@ Page Language="C#" AutoEventWir

2009-11-04 0comments 134hotness 0likes mikebai Read all
DotNET

msdn之GetCallbackEventReference

http://msdn.microsoft.com/zh-cn/library/ms153103(VS.80).aspx   http://pwqzc.cnblogs.com/archive/2005/11/10/273277.html   http://book.csdn.net/bookfiles/185/1001858503.shtml    

2009-11-02 0comments 135hotness 0likes mikebai Read all
DotNET

GetCallbackEventReference的用法

GetCallbackEventReference函数在 .NET Framework 2.0 版中是新增的。 MSDN解释:获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文。函数原型:public string GetCallbackEventReference ( Control control, string argument, string clientCallback, string context) 第一个参数指定了服务器端将要处理回调的目标对象,即处理客户端回调的服务器端控件。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。    如果传入的是this,则表示页面本身。也可以传入任何实现了ICallbackEventHandler的页面控件(page control)的引用。    在任何情况下,客户端的提交动作(submit action)会提交至和标准回传(postback)机制相同的ASPX页面。第二个参数是一个JavaScript常量表达式,表示页面传给服务器的输入数据。如将一个下拉列表当前选中元素的值传入"document.getElementById['cboEmployees'].value":。第三个参数是一个用户定义在<script>块中的JavaScript回调(callback)函数名。回调(callback)执行后,此函数最终负责页面的更新。最后两个可选参数可用来指定错误处理函数(error handler)和上下文对象(context object)。 GetCallbackEventReference函数将产生如下的脚本调用:WebForm_DoCallback(pageID, input, UpdateEmployeeViewHandler, null, null);此函数的代码会自动下载到客户端并通过<script>标签添加到页面响应(page's response)中。WebForm_DoCallback 使用XmlHttpRequest DOM对象(XmlHttpRequest DOM object)回调(call back)当前页面的URL。与此同时,它会添加一些额外的隐藏域(hidden field)以便服务器区分更简单的轻量级回调(callback)请求和一般回传(postback)请求。处理请求时,ASP.NET运行时(runtime)标识出调用的目标对象(传给GetCallbackEventReference的第一个参数),确认它实现了ICallbackEventHandler接口后调用RaiseCallbackEvent方法:void RaiseCallbackEvent ( string eventArgument)eventArgument一般即是通过GetCallbackEventReference指定的页面传递到服务器端的输入数据,即参数2RaiseCallbackEvent处理完毕,即通过调用public string GetCallbackResult()将处理结果返回给调用控件,交由客户端执行GetCallbackEventReference指定的客户端脚本clientCallback,由其完成客户端刷新。 上面说过,脚本回调(script callback)并不适用于所有浏览器,尽管最新的浏览器,包括Internet Explorer 5+, Netscape 6+, and Safari1.2+都能行。Microsoft在ASP.NET 2.0中加入了两个新的browser bapabilities:SupportsXmlHttp 与SupportsCallback以便开发人员检查方案的可行性。一条让页面刷新更快的告诫尽管脚本回调(script callback) 定义在ASP.NET 2.0中,要使其在ASP.NET 1.1里工作也并不很困难。在ASP.NET 2.0中,很多服务器控件(server control)借助脚本回调(script callback)提供了更迅速的页面刷新。最突出的例子也许是GridView控件(GridView control),作为DataGrid的接班人,选择性地运用脚本回调(script callback)实现分页显示记录。正如前面所说,脚本回调(script callback)依赖于文档对象模型(DOM)的XmlHttpRequest对象。在Internet Explorer中,此文档对象模型对象(DOM object)通过ActiveX控件(ActiveX control)实现——Microsoft.XmlHttp。在IE中浏览这样的页面时,你必须适当降低安全设置以允许ActiveX控件(ActiveX control)能被脚本调用。在其他以同样方式实现XmlHttpRequest文档对象模型对象(DOM object)的浏览器中,这是不必要的。事实上,基于Mozilla的浏览内置支持了HTTP请求功能器,而没用使用ActiveX控件(ActiveX control)——这也是在Internet Explorer 7.0中被寄予厚望的功能。 下面简单例子可作参考:服务器端 public partial class _Default : System.Web.UI.Page , ICallbackEventHandler

2009-11-02 0comments 151hotness 0likes mikebai Read all
DotNET

深度解析ASP.NET2.0中的Callback机制

callback的一般使用方法还算简单,直接参照msdn的帮助和范例就足够了。但是想要真正用好、用精,或者想开发一些基于callback机制的WEB组件,那么,就要先深入了解callback的实现机制了。在本文中,Teddy将和您一起解析callback的整个调用、反馈机制,相信对于帮助您更好的使用callback,将能有一定的益处。   Callback vs Atlas    首先,谈谈Atlas。很多朋友可能会觉得奇怪,已经有了Callback,为什么又要出Atlas呢?关于这个问题,Atlas的作者怎么解释,我倒 没有去调查。只不过从我个人对callback和atlas的使用感受来讲,觉得,callback作为一个接口和postback非常类似的实现,肯定 是为了让用户类似使用postback来使用它。但是,它的这个类似postback的机制,应该说使用上还不是特别方便,也不易扩展,当然这是相比于其 他的AJAX框架实现来说的。因此,微软方面借鉴了许多的已有的AJAX实现,如Prototype,Backbase以及AJAX.NET,并结合ASP.NET2.0 的部分特有功能,发明了这样一个博采众长的AJAX框架。基于Atlas来开发AJAX应用有多好,很难量化的来说,但至少不比其他的这些AJAX框架来 的差是肯定的,加上微软这个后台,以及像live.com这样的重量级站点的应用推广,其影响当然是值得期待的。   不过,这也不是说callback实现没一无是处了,作为程序员,我们需要有正确的态度,在正确的使用情形,使用最正确的技术。没有哪一个框架是万能的,是适合任何使用环境的;就像大家都在争论那个软件开发方法最好,CMMi,RUP,XP,AGILE~~,其实,没有最好,最合适的才是最好的。我们最应该做的,是了解各种方案的原理和优缺点,从而,合理的使用正确的工具来解决实际问题。   Begin from Client Script    我们都知道,凡是AJAX,从底层来讲,无外乎两种实现机制:XMLHTTP以及IFRAME。在AJAX这个词获得广泛关注之前,其实,基于这两种底 层实现的功能框架,或者基于这两种技术的无刷新效果实现就已经被广泛的使用了。当然,发展到今天,在使用接口方面,这些底层机制的细节往往被框架给隐藏 了,使用接口变得越来越简单,用户只要调用这些简单接口,没有必要知道具体是怎么实现效果的了。   不过,这里我们既然是要解析callback的实现机制,那还是让我们从一个callback调用的客户端脚本调用开始,看看,微软是怎么实现这个callback机制的。   1、ClientScript.GetCallbackEventReference(...)   要激发一个callback,首先,当然需要在客户端本中发出一个调用。一个典型的调用语法如下: <script language="javascript" type="text/javascript"> function any_script_function(arg, context) {  <%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>; } </script>   ClientScript.GetCallbackEventReference(...)将根据传入的参数返回实际的回调脚本。这个函数有多个重载版本,因此,这些参数的含义,大家可以参考MSDN。以具体的上面这段示例代码中的参数来说:    - this表示执行回调的的服务端控件是当前这个Page,当前的Page必须实现ICallbackEventHandler接口,包括必须实现 string GetCallbackResult()和void RaiseCallbackEvent(eventArgument)这两个接口函数,这个参数也可以是指向某个WEB控件的引用,当然,这个空间也必须 实现ICallbackEventHandler接口;   - "arg"是将被传给RaiseCallbackEvent的参数eventArgument的值,可以使人以自定义格式的字符串;   - "ReceiveServerData"是当回调成功之后,处理返回内容的客户端脚本函数的名称,这个函数必须存在于执行回调的页面,并且这个函数可以包含两个参数,例如: <script type="text/javascript"> function ReceiveServerData(result, context) {} </script>   这两个参数,分别是回调的返回数据result,和原封不动被返回的我们激发回调时的这个context参数,当然,这两个参数都是字符串类型的。    - "context"就不用多解释了,记得这个参数会被原封不动的传给指定的返回数据处理函数就行了。MSDN的官方文档说,context一般可用来传递 需要在客户端的返回数据处理函数中用来调用的脚本代码,不过实际上,你传什么都可以,把它看成一种从客户端回调的的激发端,到处理返回数据的接收段之间的 参数传递通道就行了。2、WebForm_DoCallback(...)  Ok,明白了以上代码的含义,下面我们来看看,前面的这条“<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;”在运行时会被解析成什么样子呢?我们只要在页面运行时察看页面源码就可以看到,实际上服务器帮我们生成了下面这段 script代码: <script language="javascript" type="text/javascript"> function any_script_function() {  WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false); } </script>    这段代码是什么意思呢?很显然的他调用了一个系统与定义的script函数:WebForm_DoCallback。我们要把这个函数找出来看看它具体 为我们干了什么。在运行时的页面源码中,我们很容易可以找到这段脚本的出处。我们注意到有一个script,src= "/TestCallbackWeb/WebResource.axd?d=HEcYmh-7_szSIu1D_mHSEw2&amp;t=632661779991718750", 这里就定义了WebForm_DoCallback。让我们把它用flashget下载下来,将扩展名改为.js。看看源码吧,没有被混淆的,所以很容易 看明白。我这里就只把和callback相关的部分贴出来解释一下,见代码中的注释:

2009-11-02 0comments 160hotness 0likes mikebai Read all
DotNET

ASP.NET实现回调服务器的简单方法

在开发ASP.NET应用程序的过程中, 我们经常需要在不刷新页面的情况下回调服务器的一些信息.人们喜欢用一些集成的的类库来处理,其实,ASP.NET本身已以内置了服务器回调的信息.下面是一个简单的例子:要实现回调,服务器必须实现 ICallbackEventHandler  接口.如下:public partial class _Default : System.Web.UI.Page ,ICallbackEventHandler{    protected void Page_Load(object sender, EventArgs e)    {        Page.ClientScript.GetCallbackEventReference(this, "","", "");    }    protected void Button1_Click(object sender, EventArgs e)    {        Response.Write("");    }     void ICallbackEventHandler.RaiseCallbackEvent(String eventArgument)    {    }     string ICallbackEventHandler.GetCallbackResult()    {        return "Data from server...";    }}方法:Page.ClientScript.GetCallbackEventReference(this, "","", "");是为了能够在页面中导入回调时要使用的JS脚本.这里只使用了最简单的方法.目的只是为了在页面中导入JS脚本,没有执行其它任何操作.在导入的JS脚本里有一个WebForm_DoCallback()方法,我们实现回调主要就是依靠这个方法来实现的.下面是WebForm_DoCallback()方法的原形: function WebForm_DoCallback(eventTarget,eventArgument, eventCallback, context, errorCallback, useAsync); eventTarget:指回调事件所指向的对象,一般使用:"__Page"来代替. eventArgument:指回调事件使用的参数,这个参数一定要是字符串类型的.如果要传递对象的话,可以把对象转换成  字符串或其它可以还原为对象的字符串.这个参数会发送到服务器上,由上面的类中的方法:  RaiseCallbackEvent(String eventArgument)所接收,即在服务器上,我们使用  RaiseCallbackEvent(String eventArgument)的参数就是客户端上传的参数. eventCallback:指当服务器事件执行完成后,会调用eventCallback参数所指向的方法.这个方法由两个参数.一般  是这样:function callbackEvent(arg,context){......}.这里,第一个参数是由服务器上的方法GetCallbackResult()所返回的字符串.也必须是字符串类型的数据.第二个参数是我们回调  服务器时WebForm_DoCallback()方法中的context参数,它没有上传到服务器,而是在客户端传送的,虽然它是字符串类型,但实际上它可以是任何javascript支持的数据类型.  如数组,对象等等. 下面是一段客户端代码:实现简单的回调.<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    <title></title>     <script type="text/javascript">        function DoCallBack(arg, evt, context) {            WebForm_DoCallback("__Page", arg, evt, context, null, false);        }         function btnCallback(arg, context) {            DoCallBack(arg, this.callbackEvent, context);        }         function callbackEvent(arg, context) {            alert(arg + context);        }    </script> </head><body>    <form id="form1" runat="server">    <div>        <input type="button" value="Callback" onclick="btnCallback(1, 'Message')" />    </div>    </form></body></html> 在这里我对WebForm_DoCallback进行了一下简单的封装,方面直接调用回调的方法.需要注意的是:我们要实现回调的话,在aspx页面中必须有一个运行在服务器上的form否则的话,服务器是不会在客户端的页面上导出实现回调功能的脚本的.

2009-11-02 0comments 140hotness 0likes mikebai Read all
1…1011121314…16

Recent Posts

  • c# winform适配高dpi
  • com.microsoft.sqlserver.jdbc.SQLServerException “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server建立安全连接
  • java -cp 用法介绍
  • HTML 容器元素
  • MVC的cshtml的介绍

Recent Comments

No comments to show.

COPYRIGHT © 2025 mikebai.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang