淘宝女人街祝您购物愉快: 淘宝商城  淘宝女装  淘宝男装  美容护肤  数码频道  食品/特产
分类: .NET开发 |
预览模式: 普通 | 列表

C#2008 水晶报表

C#2008 水晶报表怎么动态修改 TextObject 文本对象的值

this.CrystalReportSource1.ReportDocument.SetParameterValue("AreaName", "");

给水晶报表添加一个参数AreaName
画面中一个textbox 一个 button

button的click中加

this.CrystalReportSource1.ReportDocument.SetParameterValue("AreaName", textbox.text);
分类:.NET开发 | 固定链接 | 查看次数: 434

ASP.net工作线程池

当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程。

一个普通的(或同步的)页在该请求 期间保留线程,从而防止该线程用于处理其他请求。如果一个同步请求成为 I/O bound(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求的线程在调用返回之前处于挂起状态。 这影响了可伸缩性,原因是线程池的可用线程是有限的。

这个数字的设置是在 machine.config 的 下述节点的 maxWorkerThreads 属性

<system.web>
<processModel requestQueueLimit="num|Infinite" maxWorkerThreads="num" />
system.web>

maxWorkerThreads
按 CPU 配置用于进程的辅助线程的最大数目。例如,如果单处理器服务器上的该值为 25,ASP.NET 使用运行时 API 将进程限制设置为 25。在双处理器服务器上,该限制设置为 50。该属性的值必须等于或大于 httpRuntime 配置节中的 minFreeThread 属性设置。
该属性的范围是从 5 到 100。

ASP.net请求队列

查看更多...

分类:.NET开发 | 固定链接 | 查看次数: 343

优化ASP.NET应用性能

如果你有在IE中查看当前浏览页面HTML源代码的习惯,你也许常会看到类似以下的代码片断:
  <input type="hidden" name="__VIEWSTATE" value="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
  ……

   聪明的你一定会问,这是什么?有什么作用?它与本篇文章有何转折亲关系?各位看官,且听我慢慢道来。

查看更多...

分类:.NET开发 | 固定链接 | 查看次数: 422

.net 3.5版本上的Socket开发

在之前的文章中,我们讲了如何在.NET 2.0下面开发Socket项目。其中的异步Socket让我们得以很轻松的在.NET中开发高性能服务端应用。

但是,在实际应用中我们还是发现了一些问题的存在,如:我们在每一次操作的过程中都要创建一个IAsyncResult上下文对象,如果数据通讯很频繁的话,会导致大量的IAsyncResult对象被创建,大大的增加了垃圾回收器的工作量,从而降低了整个应用的效率。

在.NET 3.5中,这个麻烦已经被解决了,在3.5 版本中,Socket定义了一些新的方法。这些方法不要求每一次操作都创建一个新的上下文对象。

如,在2.0中我们采用下面的方式在Socket上启动一次接收操作。3.5中我们可以用新的方法完成一次接收操作。

Code
void ReceiveCallBack(IAsyncResult ar){}
IAsyncResult result=socket.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, ReceiveCallBack, info);//在这里有一个IAsyncResult对象被创建。


Code
void OnReceiveCompleted(object sender,SocketAsyncEventArgs e){}
SocketAsyncEventArgs receive=new SocketAnyncEventArgs();
receive.Completed+= OnReceiveCompleted;
receive.SetBuffer(buffer,0,buffer.Length);
socket.ReceiveAsync(receive);


在这里我们可以看出3.5 和 2.0 的一个明显区别,那就是不是使用IAsyncResult而是用SocketAsyncEventArgs作为上下文对象。应用程序创建并管理(并且可以重复使用)SocketAsyncEventArgs 对象。套接字操作的所有参数都由 SocketAsyncEventArgs 对象的属性和方法指定。完成状态也由 SocketAsyncEventArgs 对象的属性提供。最后,需要使用事件处理程序回调完成方法。

让我们来看看代码:

首先我们创建一个用户类,用来存储和客户端有关的数据:

Code
public class UserObject
{
/**//// <summary>
/// 接收数据的缓冲区
/// </summary>
public byte[] ReceiveBuffer { get; private set; }
/**//// <summary>
/// 发送数据的缓冲区
/// </summary>
public byte[] SendBuffer { get; private set; }
/**//// <summary>
/// 客户端Socket对象
/// </summary>
public Socket Socket { get; private set; }
/**//// <summary>
/// 发送数据上下文对象
/// </summary>
public SocketAsyncEventArgs SendEventArgs { get; private set; }
/**//// <summary>
/// 接收数据上下文对象
/// </summary>
public SocketAsyncEventArgs ReceiveEventArgs { get; private set; }

public UserObject(Socket socket)
{
ReceiveBuffer = new byte[1024];//定义接收缓冲区
SendBuffer = new byte[1024];//定义发送缓冲区
this.Socket = socket;
SendEventArgs = new SocketAsyncEventArgs();
SendEventArgs.UserToken = this;
ReceiveEventArgs = new SocketAsyncEventArgs();
ReceiveEventArgs.UserToken = this;
ReceiveEventArgs.SetBuffer(ReceiveBuffer, 0, ReceiveBuffer.Length);//设置接收缓冲区
SendEventArgs.SetBuffer(SendBuffer, 0, SendBuffer.Length);//设置发送缓冲区
}
}
接下来我们开始接入客户端连接:

Code
1socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2socket.Bind(localEP);
3socket.Listen(100);
4Console.WriteLine("Server is bind on {0}",socket.LocalEndPoint);
5acceptEventArgs = new SocketAsyncEventArgs();//创建接入Socket上下文对象
6acceptEventArgs.Completed += acceptCompleted;//注册接入完成事件处理程序
7socket.AcceptAsync(acceptEventArgs);//投递接入操作
8Console.WriteLine("Server is started");
9
10//接入事件处理程序
11void acceptCompleted(object sender, SocketAsyncEventArgs e)
12{
13 var client = new UserObject( e.AcceptSocket);//创建用户对象实例
14 client.ReceiveEventArgs.Completed += Receives_Completed;//注册接收数据完成事件处理程序
15 client.SendEventArgs.Completed += Send_Completed;//注册发送数据完成事件处理程序
16 client.Socket.ReceiveAsync(client.ReceiveEventArgs);//投递接收数据操作
17}
好了,我们开始接收数据:

Code
1//接收数据完成事件处理程序
2void Receives_Completed(object sender, SocketAsyncEventArgs e)
3{
4 var client = e.UserToken as UserObject;
5 if (e.BytesTransferred == 0)//如果传输的数据量为0,则表示链接已经断开
6 {
7 Console.WriteLine("Socket:{0} is closed",client.Socket.Handle);
8 client.Socket.Close();
9 }
10 else
11 {
12 string message = Encoding.Unicode.GetString(e.Buffer, 0, e.BytesTransferred);//获取接收到的数据
13 Console.WriteLine("Socket:{0} send message:{1}",client.Socket.Handle,message);
14 string sent=string.Format("{0} bytes has been received",e.BytesTransferred);
15 int length = Encoding.Unicode.GetBytes(sent,0,sent.Length,client.SendBuffer,0);//将数据写入发送缓冲区
16 client.SendEventArgs.SetBuffer(0, length);//设置缓冲区中有效数据的偏移量和长度
17 client.Socket.SendAsync(client.SendEventArgs);//投递发送数据操作
18 client.Socket.ReceiveAsync(client.ReceiveEventArgs);//投递接收数据操作
19 }
20}
21
22//发送数据完成事件处理程序
23void Send_Completed(object sender, SocketAsyncEventArgs e)

24{
25 var client = e.UserToken as UserObject;
26 if (e.BytesTransferred==0)//如果传输的数据量为0,则表示链接已经断开
27 {
28 Console.WriteLine("Socket:{0} is closed", client.Socket.Handle);
29 client.Socket.Close();
30 }
31 else
32 {
33 Console.WriteLine("Sent {0} bytes data to socket:{1}",e.BytesTransferred, client.Socket.Handle);
34 }
35}

分类:.NET开发 | 固定链接 | 查看次数: 473

C#正则表达式(RegEx)高级应用

对于复杂的、符合一定规则的字符串替换来说,正则表达式无疑是强悍和高效的选择

对于正则表达式的使用,我也写过几篇帖子了,具体可以见下面的地址

http://zu14.cn/tag/regex/

今天,说一下 .NET 里面 正则 使用的稍微高级一些的技巧:分组替换 ,下面我们举两个实例来说明这个问题:

一段字符串,把其中出现的 Ax,Ay 形式的内容,替换为 Ax 的形式(也就是 ,和Ay 都不要了),其中x 和y是数字,位长是 1~2,并且不会出现连排的形式

对于上面的需求,我们进行分析后,可以得出:上面的匹配规则,分为2组,(Ax) 一组,(,Ay) 一组 匹配后,直接返回第一组就OK了

对于.NET来说,分组替换的实现,有多种方式,我这里展示其中的2种,对于上面的例子,我使用 MatchEvaluator 方式

static string CustomReplace(System.Text.RegularExpressions.Match m)
{
return m.Groups[1].Value; //直接返回分组1
}

string sourceString = ".....";
string pattern = @"(A\d{1,2})(,A\d{1,2})";
System.Text.RegularExpressions.MatchEvaluator myEvaluator = new System.Text.RegularExpressions.MatchEvaluator(CustomReplace);
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase| System.Text.RegularExpressions.RegexOptions.Multiline);

string resultString = reg.Replace(sourceString, myEvaluator);
一段HTML代码,是用来插入FLASH的,形式如: <embed width=”1000” src=”…” …></embed>

需求是需要对这个FLASH的代码进行自定义,将 宽度 替换为自定义的值

对于这个例子,我们使用分组号 $# 的方式来实现,#代表数字,经过分析,可以得出,将上面的内容,分为3组

string sourceString = "......";
string toWidth = "300"; //自定义的宽度
string pattern = "(<embed .+? width\\s{0,}=\\s{0,}\"{0,1})(\\d+)(\"{0,1})";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
string resultString = reg.Replace(sourceString, "${1}" + toWidth + "${3}");
为了区分分组编号和普通字符,可以用{}标注分组号
分类:.NET开发 | 固定链接 | 查看次数: 479

学习C#中数据库循环插入问题

由于迎新系统的原始数据是高校招生系统中的数据,里面的数据库是vfp格式的,我做的迎新系统使用sqlserver2000的,再加上招生系统中的数据大部分数据字段是没有用的,所以只能从招生系统中的数据库筛选出一部分的数据字段插入到sqlserver2000中,但有一个问题,学校招生数据最少也有几千条数据,要从vfp中读取 一次性插入到sql2000中去,这样执行那么多条插入时肯定要用到事务使得但插入出错时前面的插入无效,查了许多资料,终于找到解决的方法。



TransactionScope 事务

在通过 new 语句实例化 TransactionScope 时,事务管理器将确定要参与哪个事务。一经确定,此范围将始终参与该事务。

  如果在事务范围中(即从初始化 TransactionScope 对象到调用其 Dispose方法之间)未发生异常,则允许该范围所参与的事务继续。如果事务范围中的确发生了异常,它所参与的事务将回滚。

当应用程序完成它要在一个事务中执行的所有工作以后,您应当只调用Complete方法一次,以通知事务管理器可以接受提交事务。未能调用此方法将中止该事务。

  对 Dispose 方法的调用标志着该事务范围的结束。在调用此方法之后发生的异常不会影响该事务。

如果在范围中修改 Current 的值,则会在调用 Dispose 时引发异常。但是,在该范围结束时,先前的值将被还原。此外,如果在创建事务的事务范围内对 Current 调用 Dispose,则该事务将在相应范围末尾处中止。

即不需要為每個connection指定一个transaction。

实例

using (TransactionScope ts = new TransactionScope())
{
string connstr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\ta.mdf;Integrated Security=True;User Instance=True";
using (SqlConnection conn = new SqlConnection(connstr))
{
conn.Open();
try
{
SqlCommand cmd = new SqlCommand("delete table1, conn);
cmd.ExecuteNonQuery();
using (SqlConnection conn1 = new SqlConnection(connstr))
{
conn1.Open();
SqlCommand cmd1 = new SqlCommand("insert into tableTXL(Name,Sex) values('ARC3','FeMale')", conn1);
cmd1.ExecuteNonQuery();
SqlCommand cmd2 = new SqlCommand("insert into tableTXL(Name,Sex) values('ARC4','FeMale')", conn1);
cmd2.ExecuteNonQuery();
ts.Complete();
MessageBox.Show("Transaction completed!");
conn1.Close();
}
}
catch (SqlException ex)
{
MessageBox.Show("Transaction RollBack!"+ex.Message);
}
conn.Close();
}
分类:.NET开发 | 固定链接 | 查看次数: 512