Visual Studio 2008初试
2007-09-25 15:20 莫耶 阅读(971) 评论(2) 编辑 收藏 举报
早先就听说微软推出了visual Studio 2008的测试版,但一直没有碍于下载速度和出于对2005的习惯,未得一试,只到前两天布署上Sql server 2005,才将这个庞然大物拉下来。
安装一如从前的便捷,界面上有了改进,更炫,付出的代价是速度更慢。
前端页面的编辑视图栏里,增加了“拆分”视图,有如Dreamweaver,从此不必假其他工具而“立改立见”
内置Ajax Extensions工具集,正好一试,以前用Anthem和prototype比较多
内置对dot net Framework 3.5的支持,轻松创建WPF程序
内置代码测试和性能分析工具
新功能方面有待摸索,目前最感兴趣的是与数据库的集成开发,做一个小用例测试一下Sql CLR存储过程重复插入数据性能:
在DB中,存在表 TB_COUNTRY,结构如:
创建一Sql Server CLR项目,并为其添加存储过程AddCountryMillons,实现重复插入百W记录,结束时返回统计用时长度:
创建Web项目,添加对SQL CLR项目的引用,制作页面并最终显示执行的时长
由于存储过程插入数据量大,为不出现阻塞现象,在此使用“委托异步回调+Ajax客户端”方式呈现结果
页面结构如下
后端代码:
经过几次测试,平均值总在520-540秒之间, 不乐观~虽然不清楚这个SQL CLR是怎么一个运行原理,但
用代码或者O/R Mapping框架取代DB内置的存储过程在短期内是没什么指望了,虽然我很喜欢那么干
安装一如从前的便捷,界面上有了改进,更炫,付出的代价是速度更慢。
前端页面的编辑视图栏里,增加了“拆分”视图,有如Dreamweaver,从此不必假其他工具而“立改立见”
内置Ajax Extensions工具集,正好一试,以前用Anthem和prototype比较多
内置对dot net Framework 3.5的支持,轻松创建WPF程序
内置代码测试和性能分析工具
新功能方面有待摸索,目前最感兴趣的是与数据库的集成开发,做一个小用例测试一下Sql CLR存储过程重复插入数据性能:
在DB中,存在表 TB_COUNTRY,结构如:
创建一Sql Server CLR项目,并为其添加存储过程AddCountryMillons,实现重复插入百W记录,结束时返回统计用时长度:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class CountryProc
{
/// <summary>
/// 连接串
/// </summary>
public const string CONN_MOYE2005_STRING = @"Data Source=ZHANGCHI\MOYE2005;Initial Catalog=Indie;User Id=sa;Password=system;";
/// <summary>
/// 插入百万条记录,返回用时(秒数)
/// </summary>
[Microsoft.SqlServer.Server.SqlProcedure]
public static int AddCountryMillons(string EName, string CName)
{
if (EName.Trim() == string.Empty || CName.Trim() == string.Empty)
{
return 0;
}
using (SqlConnection conn = new SqlConnection(CONN_MOYE2005_STRING))
{
try
{
conn.Open();
// insert a record
SqlCommand cmd = new SqlCommand(
string.Format("INSERT INTO TB_COUNTRY(CountryEName,CountryName) VALUES('{0}','{1}')",
EName, CName),
conn);
// excute millons
TimeSpan span = TimeSpan.Zero;
DateTime begin = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
cmd.ExecuteNonQuery();
}
DateTime done = DateTime.Now;
span = done - begin;
return Convert.ToInt32(span.TotalSeconds);
}
catch (Exception err)
{
return -1;
}
finally
{
conn.Close();
}
}
}
};
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class CountryProc
{
/// <summary>
/// 连接串
/// </summary>
public const string CONN_MOYE2005_STRING = @"Data Source=ZHANGCHI\MOYE2005;Initial Catalog=Indie;User Id=sa;Password=system;";
/// <summary>
/// 插入百万条记录,返回用时(秒数)
/// </summary>
[Microsoft.SqlServer.Server.SqlProcedure]
public static int AddCountryMillons(string EName, string CName)
{
if (EName.Trim() == string.Empty || CName.Trim() == string.Empty)
{
return 0;
}
using (SqlConnection conn = new SqlConnection(CONN_MOYE2005_STRING))
{
try
{
conn.Open();
// insert a record
SqlCommand cmd = new SqlCommand(
string.Format("INSERT INTO TB_COUNTRY(CountryEName,CountryName) VALUES('{0}','{1}')",
EName, CName),
conn);
// excute millons
TimeSpan span = TimeSpan.Zero;
DateTime begin = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
cmd.ExecuteNonQuery();
}
DateTime done = DateTime.Now;
span = done - begin;
return Convert.ToInt32(span.TotalSeconds);
}
catch (Exception err)
{
return -1;
}
finally
{
conn.Close();
}
}
}
};
创建Web项目,添加对SQL CLR项目的引用,制作页面并最终显示执行的时长
由于存储过程插入数据量大,为不出现阻塞现象,在此使用“委托异步回调+Ajax客户端”方式呈现结果
页面结构如下
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Vs2008_Project._Default" StylesheetTheme="Home" %>
<!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>visual Studio 2008 Demo</title>
</head>
<body>
<form id="form1" runat="server">
<div>
国家中文名称:<asp:TextBox ID="txtCName" runat="server"></asp:TextBox>
<br />
国家英文名称:<asp:TextBox ID="txtEName" runat="server"></asp:TextBox>
<br />
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
</div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" RenderMode="Block">
<ContentTemplate>
<ul>
<li>
<asp:Label ID="lblRes" runat="server" Text="Label"></asp:Label>
</li>
<li>
<asp:Button ID="btAdd" runat="server" Text="执行插入" onclick="btAdd_Click" />
</li>
</ul>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
<!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>visual Studio 2008 Demo</title>
</head>
<body>
<form id="form1" runat="server">
<div>
国家中文名称:<asp:TextBox ID="txtCName" runat="server"></asp:TextBox>
<br />
国家英文名称:<asp:TextBox ID="txtEName" runat="server"></asp:TextBox>
<br />
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
</div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" RenderMode="Block">
<ContentTemplate>
<ul>
<li>
<asp:Label ID="lblRes" runat="server" Text="Label"></asp:Label>
</li>
<li>
<asp:Button ID="btAdd" runat="server" Text="执行插入" onclick="btAdd_Click" />
</li>
</ul>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
后端代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;
namespace Vs2008_Project
{
public partial class _Default : System.Web.UI.Page
{
/// <summary>
/// 异步委托插入数据
/// </summary>
public delegate int AsynInsertMillonData();
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 开始调用
/// </summary>
protected void btAdd_Click(object sender, EventArgs e)
{
// 异步回调方法
AsyncCallback callback = new AsyncCallback(AsynDone);
// 委托实例
AsynInsertMillonData aimd = new AsynInsertMillonData(InsertMillion);
// 开始调用
IAsyncResult ar = aimd.BeginInvoke(callback, aimd);
}
/// <summary>
/// 异步执行完成
/// </summary>
public void AsynDone(IAsyncResult ar)
{
AsynInsertMillonData aimd = (AsynInsertMillonData)ar.AsyncState;
int result = aimd.EndInvoke(ar);
ShowResult(result);
}
/// <summary>
/// 插入百万条数据
/// </summary>
/// <returns>状态值OR插入时间</returns>
public int InsertMillion()
{
// CALL STORE PROCEDURE
return CountryProc.AddCountryMillons(this.txtEName.Text, this.txtCName.Text);
}
/// <summary>
/// 显示执行结果
/// </summary>
private void ShowResult(int res)
{
if (res > 0)
{
SetPannelText(string.Format("添加成功!耗时{0}秒", res));
}
else if (res == 0)
{
SetPannelText("输入空值不执行!");
}
else
{
SetPannelText("添加失败!");
}
}
/// <summary>
/// 更新PANNEL内的文本
/// </summary>
private void SetPannelText(string text)
{
lblRes.Text = text;
}
}
}
using System.Data;
using System.Configuration;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;
namespace Vs2008_Project
{
public partial class _Default : System.Web.UI.Page
{
/// <summary>
/// 异步委托插入数据
/// </summary>
public delegate int AsynInsertMillonData();
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 开始调用
/// </summary>
protected void btAdd_Click(object sender, EventArgs e)
{
// 异步回调方法
AsyncCallback callback = new AsyncCallback(AsynDone);
// 委托实例
AsynInsertMillonData aimd = new AsynInsertMillonData(InsertMillion);
// 开始调用
IAsyncResult ar = aimd.BeginInvoke(callback, aimd);
}
/// <summary>
/// 异步执行完成
/// </summary>
public void AsynDone(IAsyncResult ar)
{
AsynInsertMillonData aimd = (AsynInsertMillonData)ar.AsyncState;
int result = aimd.EndInvoke(ar);
ShowResult(result);
}
/// <summary>
/// 插入百万条数据
/// </summary>
/// <returns>状态值OR插入时间</returns>
public int InsertMillion()
{
// CALL STORE PROCEDURE
return CountryProc.AddCountryMillons(this.txtEName.Text, this.txtCName.Text);
}
/// <summary>
/// 显示执行结果
/// </summary>
private void ShowResult(int res)
{
if (res > 0)
{
SetPannelText(string.Format("添加成功!耗时{0}秒", res));
}
else if (res == 0)
{
SetPannelText("输入空值不执行!");
}
else
{
SetPannelText("添加失败!");
}
}
/// <summary>
/// 更新PANNEL内的文本
/// </summary>
private void SetPannelText(string text)
{
lblRes.Text = text;
}
}
}
经过几次测试,平均值总在520-540秒之间, 不乐观~虽然不清楚这个SQL CLR是怎么一个运行原理,但
用代码或者O/R Mapping框架取代DB内置的存储过程在短期内是没什么指望了,虽然我很喜欢那么干
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议
欢迎转载,但必须保留文章的署名老莫的帐本子
并保留此链接:http://moye.cnblogs.com/
如有疑问请发邮件:moyerock@gmail.com
欢迎转载,但必须保留文章的署名老莫的帐本子
并保留此链接:http://moye.cnblogs.com/
如有疑问请发邮件:moyerock@gmail.com