mathsword

统计

常用链接

留言簿

.net

ajax

阅读排行榜

评论排行榜

2005年12月4日 #

zt在C#中使用COM+实现事务控制

<>

在C#中使用COM+实现事务控制

文章出处:开发者俱乐部   发布时间:2005-02-26

 
.NET技术是微软大力推广的下一代平台技术,自从.NET技术架构Beta2版本的正式发布, 此项技术也逐渐走向成熟和稳定。按照微软的平台系统占有率,我们不难想象得到, 在未来的一两年内.NET技术必定会势如破竹一般的登上主流的技术平台,而一个新的 技术平台得以快速发展的最重要的前提是:他不会彻底的摒弃以前的技术,这一点对 于.NET技术来说指的就是COM/COM+技术了。

一般来说,在IT技术界以及硬件产业,技术的更新换代速度非常得惊人,而惯例是所 有的新技术都会遵循向下兼容的原则,但是.NET技术不仅仅做到了这一点,.NET甚至 实现了相互之间的各自调用,这一点是非常难能可贵的。也就是说,不但我们可以在 .NET组件中调用COM组件,同时也可以在COM组件中正常的调用.NET组件。这点带 来的好处是显而易见的,一方面我们可以保持现有的技术资源,另一方面,在现有资 源中可以利用.NET所带来的各种新技术。

一般的数据库事务控制要求事务里所做的操作必须在同一个数据库内,这样在出现错 误的时候才能回滚(RllBack)到初始状态。这就存在一个问题,在分布式应用程序中, 我们往往需要同时操作多个数据库,使用数据库本身的事务处理,很难满足程序对事 务控制的要求。在COM+中,提供了完整的事务服务,我们可以利用它来完成在分布 式应用程序中的事务控制。

具体过程如下

一:用VS.NET生成一个类库 。

二:添加对System.EnterpristServices的引用,具体步骤

菜单:(项目-添加引用-在.NET选项卡选择System.EnterpristServices-确定)

三:构建类

1:源程序

using System;

using System.EnterpriseServices;

using System.Data.SqlClient;

using System.Reflection;

namespace COMPlusSamples

{

//表明需要事务支持

[ Transaction(TransactionOption.Required) ]

//声明为服务器应用程序,还可以选择Library,表示为库应用程序

[assembly: ApplicationActivation(ActivationOption.Server)]

//描述信息

[assembly: Description("sample")]

public class TxCfgClass : ServicedComponent

{

private static string init1 = "user id=sa;password=;initial catalog=pubs;data source=(local)";

private static string init2 = "user id=sa;password=;initial catalog=NorthWind;data source=(local)";

private static string add1 = "insert into authors('au_lname','au_fname') values('test1', 'test2')";

private static string add2 = "insert into sample values('test1',22)";

//the error sql statement

//there is not table “sample”


public TxCfgClass() {}

private void ExecSQL(string init, string sql)

{

SqlConnection conn = new SqlConnection(init);

SqlCommand cmd = conn.CreateCommand();

cmd.CommandText = sql;

conn.Open();

cmd.ExecuteNonQuery();

conn.Close();

}

//添加一条记录到数据库

public void Add()

{

try

{

//在一数据库中插入一条记录

ExecSQL(init1, add1);

Console.WriteLine("the operation in the same database completely");

//在另外一个数据库中插入两条记录

//这次执行的是一个错误的SQL语句

ExecSQL(init2, add2);

Console.WriteLine("the operation in the other database

completely");

Console.WriteLine("Record(s) added, press enter...");

Console.Read();

}

catch(Exception e)

{

//事务回滚

ContextUtil.SetAbort();

Console.WriteLine("Because there are some errors in the operation ,so transcation abort");

Console.WriteLine("The error is " + e.Message);

Console.WriteLine("abort successfully");

Console.Read();

}

}

}

}

2:程序说明:

添加命名空间 using System.EnterpriseServices;因为本程序使用了其中的ContextUtil类

[ Transaction(TransactionOption.Required) ] 说明DLL需要事务支持

本程序的TxCfgClass 类从ServicedComponent类中继承,这样并不会影响该类,而只是 在该类中添加了两个额外的方法,这两个方法可以使代码共享变得更加容易

程序使用的sql server数据库在本机运行,init1 和 init2是两个连接数据库的连接字符串, init连接pubs数据库,inin2连接northwind数据库,这是sql2000中自带的示例数据库。 add1和add2是两条sql语句,作用是分别向两个数据库的表里添加一条记录。注意:add2 是一条错误的语句,因为根本没有sample表,这样,会在执行时引起异常。(这正是我
们所期望的)

在执行到add2语句时,由于它是错误的,所以会引发异常,转到错误处理语句里来执行。

ContextUtil.SetAbort();该语句使所有的数据库操作回滚,这样add1语句所插入的记录也 将不存在。(达到预期目标)

四:给程序添加强名(strong name)

1:创建一对密钥

用来创建密钥的工具是称为sn.exe的共享工具。通常通过命令提示运行它,该工具可执 行各种任务以生成并提取密钥。我们需要用以下方式来运行sn.exe。

sn –k key.snk

其中key.snk 代表将保存密钥的文件的名称。它的名称可以是任意的,不过习惯上带有 .snk后缀名。

2:签名

签名通常是在编译时进行的。签名时,用户可利用C#属性通知编译器应该使用正确的 密钥文件对DLL进行签名。要做到这一点用户需要打开工程中的AssemblyInfo.cs文件 并进行修改。

[assembly:AssemblyKeyFile(“..\\..\\key.snk”)]

注:key.snk文件和项目文件在同一个文件夹

五:编译成DLL (具体步骤)

菜单:(生成-生成)

如果一切正常,就会生成DLL文件

六:使用regsvcs.exe将Dll注册到COM+ Services里面

我们需要用以下方式运行regsvcs.exe

regsvcs dll文件名

如果一切正常的话,regsvcs.exe就会把dll输入到COM+ Services中。

至此,我们已经生成并注册了这个可以由其它程序使用的类,现在,我们来写一个控制 台程序来检验这个类是否正常运行

七:构建客户机

1:新建控制台应用程序项目

菜单(文件-新建-项目)

选择控制台应用程序 ,并选择 添入解决方案 ,确定

2:同上面的第二步一样,添加对System.EnterpriseServices的引用。

3:添加对自己刚才做好的类的引用。

菜单(项目-添加引用-浏览),选择刚才生成的DLL,确定

4:输入以下程序

using System;

using COMPlusSamples;

using System.EnterpriseServices;

public class Client

{

public static void Main()

{

TxCfgClass cfg = new TxCfgClass();

cfg.Add();

}

}

5:将控制台程序设置为启动项,然后编译运行,就会看到结果。

正如我们希望的,第一条记录没有插入数据库

posted @ 2005-12-04 20:21 DONET之路 阅读(165) | 评论 (0)编辑

2005年7月4日 #

为解决在datagrid中的onMouseOver效果查找的javascript资料及最终结果

     摘要: 为解决在datagrid中的onMouseOver效果查找的javascript资料及最终结果特殊情况:datagrid的每列class不一样,为实现鼠标划过行变色,由于每个td的样式掩盖了鼠标样式故需要特殊处理查找到的相关资料包含表格的文档的DOM结构分析http://www.yesky.com/20011102/203270.shtmlJS应用DOM入门:简单文档DOM结构分析http://w... 阅读全文

posted @ 2005-07-04 14:25 DONET之路 阅读(1252) | 评论 (0)编辑

2005年6月14日 #

ajax

http://www.ajaxpatterns.org
http://www.amowa.net/buffalo/download.html

什么是AJAX
http://edad.com.cn/datou/2005/02/ajax.htm

AjaxHelper使用范例

.Net环境下基于Ajax的MVC方案
1、问题背景

现在,越来越多人开始尝试基于Ajax进行无刷新的Web开发,不过,在.Net环境下,应用Ajax并不是非常方便,这主要可能是由以下一些原因造成的:

·由于Ajax基于javascript的本质,使得开发者必须对javascript非常了解,起码,其javascript能力足以实现对callback返回内容对页面的更新,所以开发的门槛就有一定程度的上升

·当基于Ajax机制进行开发时,原有的基于postback方式下时,asp.net由后台逻辑代码(Model),aspx页面(View)、aspx.cs(Controller)构成的MVC构架其实失效了,当callback返回数据时,要么在client端用javascript解析返回内容以实现更新,要么则必须在server端构造好比较完整的html代码,再直接由javascript将该构造好的html设置给某个页面对象,很显然,这样一来,要实现一个最简单的callback功能,都要不少代码,并且是相对比较乱的代码,即使在即将到来的asp.net2.0该问题依然不会得到有效解决

2、本文目的

本文旨在充分利于现有的asp.net本身的特点和ajax的特性,提出一个用于在asp.net环境下进行基于ajax的web开发的MVC方案,以实现以下主要目的:

·Asp.Net环境下用于Ajax的清晰的MVC构架

·降低编程人员对过多javascript编码的依赖以降低编程门槛

·灵活的支持ajax模式下的常用开发方式

3、问题分析

如何实现以上几个主要目的呢?

 1)要对xmlhttprequest对更良好的封装,以使调用方式更简单;

 2)尽量在server端进行更新数据的构造,但是也要避免每次返回数据都手工构造,因此,就想到可以充分使用UserControl,由UserControl作为"View",对应的由ascx.cs文件作为"Controller",这样构成的MVC也是比较清晰的;
 
4、问题解决

基于以上思想,本人实现了以下一个组类库以简化该过程:

源码及范例下载

代码简析:

1)首先在client端,AjaxHelper.js封装了xmlhttprequest,并提供一个将现有的<form>序列化为形如param1=v1&param2=v2&...形式用于post的参数;

Updater(ajaxTemplate, output, params, onComplete)函数,用于实现一次callback调用

ajaxTemplate(必选):指定执行需要功能的UserControl路径
output(可选):填充返回数据的指定标签的引用或ID值
params(可选):形如param1=v1&param2=v2&...的post参数
onComplete(可选):可用于对返回数据进行特殊处理的回调函数,函数格式function(str),str为返回的数据

SerializeForm(form)函数,用于序列化<form>

form:可以是对指定<form>的引用或ID值

2)在server端,Ajax.aspx文件封装了对由客户端ajaxTemplate指定的UserControl的调用,其余的具体逻辑功能则在特定的UserControl及其ascx.cs内实现;

3)这样,具体执行一次callback时,编程人员只需在页面引用AjaxHelper.js,并在指定的位置通过javascript:Updater(ajaxTemplate, output, params, onComplete)进行调用,如果需要对某一form进行提交,则可调用javascript:SerializeForm(form)序列化该form并传给params,当然也可以手动构造params,并指定将返回数据通过设置output应用的页面或通过onComplete自定义处理。

4)由于充分使用UserControl,意味着,可以充分利用asp.net原有的web服务器端控件和数据绑定机制,这样其实,已经很大程度上简化了返回数据的构造,在ascx.cs中,通过Request.Form[ParamName]就能访问到client端传入的params,再访问逻辑代码获取源数据。

5、范例

包含在源码中的范例实现了一个简单的无刷新获取博客园首页内容到一个textarea的功能,详见源码!

部分范例源码:

Default.aspx

<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="CN.Teddy.AjaxHelper.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    
<HEAD>
        
<title>WebForm1</title>
        
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        
<meta name="CODE_LANGUAGE" Content="C#">
        
<meta name="vs_defaultClientScript" content="JavaScript">
        
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
        
<script type="text/javascript" language="javascript" src="js/AjaxHelper.js"></script>
    
</HEAD>
    
<body>
        
<form id="Form1" method="post" runat="server">
            
<div id="view2">loading</div>
            
<script type="text/javascript">
                Updater('AjaxTemplate
/GetPageSrc', 'view2', 'url=http://www.cnblogs.com');
            
</script>

        
</form>
    
</body>
</HTML>

AjaxHelper.js摘要:

var AjaxHelperUrl = new String("Ajax.aspx");



var Updater = function(ajaxTemplate, output, params, onComplete)

{

    
if (typeof output == 'string')

    {

        output 
= $(output);

    }

    

    
new Ajax.Request( 'Ajax.aspx', { onComplete: function(transport) { if (output != null) { output.innerHTML = FormatContent(transport.responseText); } if (onComplete != null) { onComplete(FormatContent(transport.responseText)) } }, parameters: params + '&AjaxTemplate=+ ajaxTemplate });

}



var SerializeForm = function(form)

{

    
return Form.serialize(form);

}



var FormatContent = function(str)

{

    
var content = new String(str);

    
var prefix = new String("<!--AjaxContent-->");

    content 
= content.substring(content.indexOf(prefix, 0+ prefix.length, content.length - 9);

    
return content;

}

UserControl GetPageSrc.ascx.cs摘要:

        private void Page_Load(object sender, System.EventArgs e)
        
{
            lbUrl.Text 
= Request.Form["url"];

            System.Net.WebClient client 
= new System.Net.WebClient ();
            client.Headers.Add(
"User-Agent""Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)");
            
try
            
{
                txtPageSource.Text 
= new System.IO.StreamReader(client.OpenRead(lbUrl.Text), System.Text.Encoding.UTF8).ReadToEnd();
            }

            
catch(Exception ex)
            
{
                
throw ex;
            }

        }



Enjoy!

//文章结束

posted @ 2005-06-14 15:51 DONET之路 阅读(756) | 评论 (0)编辑

javascript 常用代码大全 zt

     摘要: javascript 常用代码大全 //打开模式对话框 function doSelectUser(txtId) { strFeatures="dialogWidth=500px;dialogHeight=360px;center=yes;middle=yes ;help=no;status=no;scroll=no"; var url,strReturn; url="selUser.aspx... 阅读全文

posted @ 2005-06-14 15:24 DONET之路 阅读(1083) | 评论 (0)编辑