2001年4月份,我在博客中发过一个小工具,它是一个用ASP.NET写的SQL SERVER的辅助小工具。 在这期间,有些人貌似对那个工具比较有兴趣,所以我常能收到索要源代码的邮件。 正好,我上月又发布了我的MVC框架,因此打算用【我的ASP.NET MVC框架】来重写这个工具, 并开源。

工具的特点:
1. 采用ASP.NET编写,并借助MyMVC框架
2. 为了更好地接近桌面程序的操作体验,网站采用纯AJAX的方式实现。
3. 界面使用了 JQuery Easy UI
4. 代码的语法着色使用了 syntaxhighlighter (JavaScript类库)

工具的定位:只是辅助工具,因此功能有限,但要将有限的功能做得尽量好。

下面将分别介绍工具所能完成的功能,以及关键的实现代码。
说明:工具的所有源代码可以在本文的结尾处下载。

项目介绍

整个工具的源代码结构如下:

项目由Visual Studio 2008创建,包含三个部分:

1. WebApp:一个ASP.NET网站,它是工具的可运行部分。
   网站只包含一些HTML, CSS, JavaScript,DLL文件。

2. MyMvcEx:一个类库项目,它提供了MyMVC框架的二个IActionResult接口的实现类,
   用于向浏览器客户端输出DataTable, DataSet

3. SqlServerSmallToolLib:运行网站所需的所有后台代码,
   包括:Controller,BLL类,等等。

MyMVC框架发挥的作用

从前面的项目介绍中,我们可以看到,整个网站没有一个ASPX文件,只有HTML文件,
所有对服务器的调用全由AJAX来实现,比如:下面的【比较数据库】的代码片段:

$.ajax({
    cache: false, dataType: "json", type: "GET",
    url: '/AjaxService/CompareDB.cspx',
    data:{  srcConnId: $("#hfSrcConnId").val(), 
            destConnId: $("#hfDestConnId").val(), 
            srcDB: $("#cboSrcDB").combobox("getValue"), 
            destDB: $("#cboDestDB").combobox("getValue") ,
            flag: flag
    },

在服务端,我只要实现这样一个C#方法就可以响应客户端的请求了:

[Action]
public object CompareDB(string srcConnId, string destConnId, string srcDB, string destDB, string flag)
{
    var result = CompareDBHelper.CompareDB(srcConnId, destConnId, srcDB, destDB, flag);
    return new JsonResult(result);
}

至于说:JS发起的请求是如何调用到这个C#方法的,以及这个C#方法在调用时的参数和返回值的处理,全由MyMVC框架来实现。
对于开发AJAX来说,可以不用关心这个问题,只要写出一个C#方法给JS调用就可以了。

引用MyMVC是件很简单的事情,只需要在web.config中做如下的配置即可:

<httpHandlers>
    <add path="*.cspx" verb="*" type="MyMVC.AjaxHandlerFactory, MyMVC" validate="true" />
</httpHandlers>

再补充一点:如果不喜欢看到Action方法包含较多的输入参数,也可以使用下面的方法:

public class CompareDbOption
{
    public string SrcConnId;
    public string DestConnId;
    public string SrcDb;
    public string DestDb;
    public string Flag;
}


[Action]
public object CompareDB(CompareDbOption option)
{
    var result = CompareDBHelper.CompareDB(option.SrcConnId, option.DestConnId, 
                                            option.SrcDb, option.DestDb, option.Flag);
    return new JsonResult(result);
}

如果您喜欢在浏览器的客户端中使用jquery以及jquery.form.js插件,
您会发现在服务端再借助MyMVC框架来实现AJAX实在是太方便了。
再来一个添加连接的代码片段:

Html表单代码:

JavaScript提交表单代码:

function SubmitConnectionForm(){
    if( ValidateForm() == false ) return false;
    $("#formConnection").ajaxSubmit({
        success: function(responseText, statusText) {            
            if (responseText == "update OK" ){
                $('#divConnectionDialog').dialog('close');
                // 省略后面的代码。

服务端C#代码:

[Action]
public string SubmitConnectionInfo(ConnectionInfo info)
{
    if( string.IsNullOrEmpty(info.ServerIP) )
        throw new MyMessageException("ServerIP is empty.");

    if( info.SSPI == false && string.IsNullOrEmpty(info.UserName) )
        throw new MyMessageException("UserName is empty.");

    bool isAdd = string.IsNullOrEmpty(info.ConnectionId);

    if( isAdd ) {
        info.ConnectionId = Guid.NewGuid().ToString();
        ConnectionManager.AddConnection(info);
        return info.ConnectionId;
    }
    else {
        ConnectionManager.UpdateConnection(info);
        return "update OK";
    }
}


public sealed class ConnectionInfo
{
    public string ConnectionId;
    public string ServerIP;
    public string UserName;
    public string Password;
    public bool SSPI;
    public int Priority;
}

在整个工具的开发过程中,由于使用了MyMVC框架以及JQuery,AJAX的实现简直是太容易了。

MyMVC框架的下载地址:http://www.cnblogs.com/fish-li/archive/2012/02/21/2361982.html

工具主界面

工具启动后,将能看到下面的主界面:

主界面的左边的【工具列表】中包含二个独立的功能模块。
右边的上方区域是所有的数据库连接的列表。
建议在初次使用时,将自己所需要访问的SQL SERVER连接参数配置好。

这个工具可以管理多个连接,而且会根据连接的使用频率来排序,以方便操作。
如果需要创建一个连接,可以点击工具栏中的【新增连接】按键,将出现以下对话框。

工具可以支持二种连接方式:1. Windows信任连接,2. 用户名/密码连接。

数据库连接列表的部分网页代码:

连接采用XML文件来保存,相关的操作代码:

服务端的Action实现代码:

Database 浏览器

在主界面的【数据库连接列表】中,选择一个连接,然后点击工具栏上的【打开连接】按键,即可进入【Database 浏览器】界面。

在这个工具中,如果需要查看某个数据库对象的定义,只需要点击相应的对象节点就可以了:

为了操作方便,工具提供多标签查看功能:

获取数据库对象列表的关键代码:

查看数据库对象的定义脚本的实现代码:

搜索数据库

您可以在上图所示界面的左边树控件中,选择一个节点,右击,然后选择“在数据库中搜索”,此时会出现如下对话框:

在上图的对话框中,点击确定按键后,可出现下面的查找结果:
说明:匹配行就会高亮显示。

搜索数据库对象的相关代码:

复制存储过程工具

为了演示这个功能,先需要创建一个数据库。我创建了一个数据库:TestMyTool,它没有任何数据库对象,如下图

然后,从主界面中启动【复制存储过程工具】,
接着选择:数据库连接,数据库对象
点击【刷新列表】按键,将看到以下结果:

我们可以选择要复制的(存储过程,视图,自定义函数)对象:

最后点击【开始复制】按键,即可完成复制过程。
此时数据库TestMyTool的显示结果为:

此功能的核心部分实现代码:

数据库比较工具

为了方便后面的介绍,我将复制全部的存储过程到TestMyTool,这个过程将省略贴图。
不仅如此,我还对其中的一个存储过程做了一点修改。

然后,在程序主界面中,启动【数据库比较工具】,
接着选择:数据库连接,数据库对象
点击【开始比较数据库】按钮后,将能看到以下比较结果。
每个数据库对象的定义中,第一个不匹配的行将以高亮行显示。

为了能让您知道不匹配行的出现位置,工具还会显示不匹配行的前后5行代码。

此功能的核心部分实现代码:

查看表结构定义

工具可以让您轻松地查看一个表结构的定义:

也可以一次查看多个表的定义:

还可一下子得到整个数据库的所有对象的创建脚本:

此功能的核心部分实现代码:

修改运行环境

到目前为止,这个工具还只能在Visual Studio中运行,显然它与我们经常见到的【工具】有较大的差别。

如果您希望可以方便地运行这个工具,那么可以安装我的另一个小工具来快速地启动当前这个工具, 那个工具的下载地址:【ASP.NET程序也能像WinForm程序一样运行】

然后,就可以在Windows资源管理器中启动这个小工具:

现在是不是很像一个桌面程序了?

您甚至也可以创建一个开始菜单项,或者一个快捷方式来启动这个小工具, 具体方法可参考博客:【ASP.NET程序也能像WinForm程序一样运行】

关于此工具的补充说明

这个小工具只实现了一些简单的功能,而且主要集中在查看数据库的定义这块。
这个工具的早期版本中,有些人提到了要求实现查看数据表的功能。
在今天的版本中,我并没有实现,但我提供了实现这个功能所必要的一些基础代码。
例如,我提供了二个ActionResult (注意:前面小节的Action代码中,就使用了下面的二个实现类):

为了方便地在客户端将表格显示地漂亮些,我还提供了一个JS函数:

function SetGridViewColor(){
    $("table.myGridVew").each(function(){
        $(this).removeClass("myGridVew").addClass("GridView")
            .find(">thead>tr").addClass("GridView_HeaderStyle").end()
            .find(">tbody>tr")
            .filter(':odd').addClass("GridView_AlternatingRowStyle").end()
            .filter(':even').addClass("GridView_RowStyle");
    });
}

如果您认为很有必要在这个工具中集成数据表的查看(或者查询数据)的功能,那么可以自行实现(工具是开源的)。
友情提示:使用上面的代码以及MyMVC框架,实现一个简单的查看数据是会比较容易的。

今天就写到这里,希望大家能喜欢这个小工具,以及 MyMVC框架

点击此处下载全部代码

posted on 2012-03-04 21:24  Fish Li  阅读(20449)  评论(71编辑  收藏  举报