拼吾爱程序人生数据库编程SQL 利用Sql脚本生成C#类

1  /  1  页   1 跳转 查看:900

利用Sql脚本生成C#类

利用Sql脚本生成C#类

文/daonidedie  出处/CSDN

/*
* 作者:  evlon(阿牛) MSN:niukl@msn.com  QQ:273352165
* 功能:  得用Sql生成的脚本生成C#类
*/

对于Sql Server数据库,有查询分析器的帮助.我们可以省下不少的工夫.

如果,在查询分析器的
选项.脚本中,勾选"将扩展属性脚本作为对象脚本的一部分"
我们可以生成如下的Create 脚本:
CREATE TABLE [AdminUsers] (
    [userid] [int] IDENTITY (1, 1) NOT NULL ,
    [loginID] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [loginPwd] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [UserName] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_AdminUsers_UserName] DEFAULT (''),
    [IsSuperMan] [bit] NOT NULL CONSTRAINT [DF_AdminUsers_IsSuperMan] DEFAULT (0),
    CONSTRAINT [PK_AdminUsers] PRIMARY KEY  CLUSTERED
    (
        [userid]
    )  ON [PRIMARY]
) ON [PRIMARY]
GO


exec sp_addextendedproperty N'MS_Description', N'是否超级用户', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'IsSuperMan'
GO
exec sp_addextendedproperty N'MS_Description', N'登陆名', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'loginID'
GO
exec sp_addextendedproperty N'MS_Description', N'登陆密码', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'loginPwd'
GO
exec sp_addextendedproperty N'MS_Description', N'用户系统标识', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'userid'
GO
exec sp_addextendedproperty N'MS_Description', N'真实姓名', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'UserName'


GO

我们要生成下面的C#类:
/**//// <summary>
/// AdminUsers的摘要说明。
/// </summary>
public class AdminUsers
{
    /**//// <summary>
    /// 用户系统标识/// </summary>
    private int userid;
    public int Userid
    {
        get{ return userid; }
        set{ userid = value; }
    }
    /**//// <summary>
    /// 登陆名/// </summary>
    private string loginID;
    public string LoginID
    {
        get{ return loginID; }
        set{ loginID = value; }
    }
    /**//// <summary>
    /// 登陆密码/// </summary>
    private string loginPwd;
    public string LoginPwd
    {
        get{ return loginPwd; }
        set{ loginPwd = value; }
    }
    /**//// <summary>
    /// 真实姓名/// </summary>
    private string userName;
    public string UserName
    {
        get{ return userName; }
        set{ userName = value; }
    }
    /**//// <summary>
    /// 是否超级用户/// </summary>
    private bool isSuperMan;
    public bool IsSuperMan
    {
        get{ return isSuperMan; }
        set{ isSuperMan = value; }
    }
}

      由于Sql脚本中有我们需要的所有的东西.我们就有了生成类的必要条件.我已经把它用Javascript脚本实现了:

<html>
<head>
    <title>Untitled</title>
<script language=javascript>
    String.prototype.upperFirstChar = function()
    {
        return this.replace(/^(\w)/,function($1){return $1.toUpperCase();});
    }
   
    String.prototype.lowerFirstChar = function()
    {
        return this.replace(/^(\w)/,function($1){return $1.toLowerCase();});
    }

    var ConvertDbTypeToCSType = {
                    "bigint":"long",
                    "binary":"byte[]",
                    "bit":"bool",
                    "char":"char",
                    "datetime":"DateTime",
                    "decimal":"decimal",
                    "float":"float",
                    "image":"byte[]",
                    "int":"int",
                    "money":"string",
                    "nchar":"char",
                    "ntext":"string",
                    "numeric":"int",
                    "nvarchar":"string",
                    "real":"string",
                    "smalldatetime":"DateTime",
                    "smallint":"int",
                    "smallmoney":"string",
                    "sql_variant":"string",
                    "sysname":"string",
                    "text":"string",
                    "timestamp":"DateTime",
                    "tinyint":"int",
                    "uniqueidentifier":"string",
                    "varbinary":"byte[]",
                    "varchar":"string"
                    };
    function CsFileStream()
    {
        this.ms = new Array();
        this.tabNum = 0;
       
        this.getTabs = function()
        {
            var arr = new Array();
            arr.length = this.tabNum + 1;
            return arr.join("\t");
        }
    }
   
    CsFileStream.prototype.append = function()
    {
        var str =  arguments[0];
        if(str instanceof Array)
        {
            str = str.join("");
        }
        if(this.tabNum > 0)
        {
            var tabs = this.getTabs();
            var tmpStr = str.replace(/\n/g,"\n" + tabs);
            this.ms[this.ms.length] = tmpStr;
        }
        else
        {
            this.ms[this.ms.length] = str;
        }
    }
   
    CsFileStream.prototype.addTab = function()
    {
        this.tabNum ++;
        if(this.ms.length > 0)
        {
            this.ms[this.ms.length - 1] = this.ms[this.ms.length - 1].replace(/\n\t*$/gm,'\n' +  this.getTabs());
        }
    }   
   
    CsFileStream.prototype.delTab = function()
    {
        this.tabNum --;
        if(this.ms.length > 0)
        {
            this.ms[this.ms.length - 1] = this.ms[this.ms.length - 1].replace(/\n\t*$/gm, '\n' +  this.getTabs());
        }
    }   

    CsFileStream.prototype.toString = function()
    {
        return this.ms.join("");
    }   
   
    function buildCsFromSql(strSql)
    {
        var tableName = strSql.match(/table\s+\[([^\]]+)\]/i)[1];
        var column = [];
        var rgx = /\[([^\]]+)\]\s+\[([^\]]+)\]/gi;
        var arr;
        while((arr = rgx.exec(strSql)) != null)
        {
            column[arr[1]] = {};
            column[arr[1]].name=arr[1];
            column[arr[1]].dbtype=arr[2];
            column[arr[1]].cstype=ConvertDbTypeToCSType[arr[2]];
        }
       
        rgx = /N'MS_Description',\s+N'([^']+)'.+N'([^']+)'$/gim;
        while((arr = rgx.exec(strSql)) != null)
        {
            column[arr[2]].dbdesc=arr[1];
        }
       
        var cs = new CsFileStream();
        cs.append("/// <summary>\n");
        cs.append(["/// ",tableName.upperFirstChar(),"的摘要说明。\n"]);
        cs.append("/// </summary>\n");
        cs.append(["public class ",tableName.upperFirstChar(),"\n"]);
        cs.append("{\n");
        cs.addTab();
        for(var i in column)
        {
            //私有成员
            cs.append("/// <summary>\n");
            cs.append(["/// ",column.dbdesc]);
            cs.append("/// </summary>\n");
            cs.append(["private ",column.cstype," ", column.name.lowerFirstChar(),";\n"]);
            cs.append(["public ",column.cstype," ", column.name.upperFirstChar(),"\n"]);
            cs.append("{\n");
            cs.addTab();
            cs.append(["get{ return ",column.name.lowerFirstChar(),"; }\n"]);
            cs.append(["set{ ",column.name.lowerFirstChar()," = value; }\n"]);
            cs.delTab();
            cs.append("}\n");
        }
        cs.delTab();
        cs.append("}\n");
       
        return cs.toString();

    }
   
    function go_buildCsFromSql()
    {
        txtCs.value = buildCsFromSql(txtSql.value);
    }
   
</script>

</head>

<body>
<textarea id=txtSql style="width:100%;height:400px;">
CREATE TABLE [AdminUsers] (
    [userid] [int] IDENTITY (1, 1) NOT NULL ,
    [loginID] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [loginPwd] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [UserName] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_AdminUsers_UserName] DEFAULT (''),
    [IsSuperMan] [bit] NOT NULL CONSTRAINT [DF_AdminUsers_IsSuperMan] DEFAULT (0),
    CONSTRAINT [PK_AdminUsers] PRIMARY KEY  CLUSTERED
    (
        [userid]
    )  ON [PRIMARY]
) ON [PRIMARY]
GO


exec sp_addextendedproperty N'MS_Description', N'是否超级用户', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'IsSuperMan'
GO
exec sp_addextendedproperty N'MS_Description', N'登陆名', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'loginID'
GO
exec sp_addextendedproperty N'MS_Description', N'登陆密码', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'loginPwd'
GO
exec sp_addextendedproperty N'MS_Description', N'用户系统标识', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'userid'
GO
exec sp_addextendedproperty N'MS_Description', N'真实姓名', N'user', N'dbo', N'table', N'AdminUsers', N'column', N'UserName'


GO
</textarea>
<input type="button" value="生成" id="doit" >
<textarea id=txtCs style="width:100%;height:400px;">
</textarea>

</body>
</html>
运行效果如下:

 附件: 您所在的用户组无法下载或查看附件

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [SQL] 的这些文章也感兴趣:

SQL开发中容易忽视的一些小地方( 三)
NHibernate之旅(14):探索NHibernate中使用视图
SQL循序渐进(2)表的基础知识
SQL数据库攻击详解
Windows 服务器系统通用引擎路线图
保持多台服务器数据的一致性
iBATIS In Action:执行非查询语句(一)
为 Web 开发支持 XML 的数据解决方案
ASA:如何根据系统表查数据库中的表和列的信息
使用ODC文档在IE中直接连接SQL数据库
 

回复:利用Sql脚本生成C#类

还可以改成Emeditor宏:记得保存
    String.prototype.upperFirstChar = function()
    {
        return this.replace(/^(\w)/,function($1){return $1.toUpperCase();});
    }
   
    String.prototype.lowerFirstChar = function()
    {
        return this.replace(/^(\w)/,function($1){return $1.toLowerCase();});
    }

    var ConvertDbTypeToCSType = {
                    "bigint":"long",
                    "binary":"byte[]",
                    "bit":"bool",
                    "char":"char",
                    "datetime":"DateTime",
                    "decimal":"decimal",
                    "float":"float",
                    "image":"byte[]",
                    "int":"int",
                    "money":"string",
                    "nchar":"char",
                    "ntext":"string",
                    "numeric":"int",
                    "nvarchar":"string",
                    "real":"string",
                    "smalldatetime":"DateTime",
                    "smallint":"int",
                    "smallmoney":"string",
                    "sql_variant":"string",
                    "sysname":"string",
                    "text":"string",
                    "timestamp":"DateTime",
                    "tinyint":"int",
                    "uniqueidentifier":"string",
                    "varbinary":"byte[]",
                    "varchar":"string"
                    };
    function CsFileStream()
    {
        this.ms = new Array();
        this.tabNum = 0;
       
        this.getTabs = function()
        {
            var arr = new Array();
            arr.length = this.tabNum + 1;
            return arr.join("\t");
        }
    }
   
    CsFileStream.prototype.append = function()
    {
        var str =  arguments[0];
        if(str instanceof Array)
        {
            str = str.join("");
        }
        if(this.tabNum > 0)
        {
            var tabs = this.getTabs();
            var tmpStr = str.replace(/\n/g,"\n" + tabs);
            this.ms[this.ms.length] = tmpStr;
        }
        else
        {
            this.ms[this.ms.length] = str;
        }
    }
   
    CsFileStream.prototype.addTab = function()
    {
        this.tabNum ++;
        if(this.ms.length > 0)
        {
            this.ms[this.ms.length - 1] = this.ms[this.ms.length - 1].replace(/\n\t*$/gm,'\n' +  this.getTabs());
        }
    }   
   
    CsFileStream.prototype.delTab = function()
    {
        this.tabNum --;
        if(this.ms.length > 0)
        {
            this.ms[this.ms.length - 1] = this.ms[this.ms.length - 1].replace(/\n\t*$/gm, '\n' +  this.getTabs());
        }
    }   

    CsFileStream.prototype.toString = function()
    {
        return this.ms.join("");
    }   
   
    function buildCsFromSql(strSql)
    {
        var tableName = strSql.match(/table\s+\[([^\]]+)\]/i)[1];
        var column = [];
        var rgx = /\[([^\]]+)\]\s+\[([^\]]+)\]/gi;
        var arr;
        while((arr = rgx.exec(strSql)) != null)
        {
            column[arr[1]] = {};
            column[arr[1]].name=arr[1];
            column[arr[1]].dbtype=arr[2];
            column[arr[1]].cstype=ConvertDbTypeToCSType[arr[2]];
        }
       
        rgx = /N'MS_Description',\s+N'([^']+)'.+N'([^']+)'$/gim;
        while((arr = rgx.exec(strSql)) != null)
        {
            column[arr[2]].dbdesc=arr[1];
        }
       
        var cs = new CsFileStream();
        cs.append("/// <summary>\n");
        cs.append(["/// ",tableName.upperFirstChar(),"的摘要说明。\n"]);
        cs.append("/// </summary>\n");
        cs.append(["public class ",tableName.upperFirstChar(),"\n"]);
        cs.append("{\n");
        cs.addTab();
        for(var i in column)
        {
            //私有成员
            cs.append("/// <summary>\n");
            cs.append(["/// ",column.dbdesc]);
            cs.append("/// </summary>\n");
            cs.append(["private ",column.cstype," ", column.name.lowerFirstChar(),";\n"]);
            cs.append(["public ",column.cstype," ", column.name.upperFirstChar(),"\n"]);
            cs.append("{\n");
            cs.addTab();
            cs.append(["get{ return ",column.name.lowerFirstChar(),"; }\n"]);
            cs.append(["set{ ",column.name.lowerFirstChar()," = value; }\n"]);
            cs.delTab();
            cs.append("}\n");
        }
        cs.delTab();
        cs.append("}\n");
       
        return cs.toString();

    }
   
    function go_buildCsFromSql()
    {
        txtCs.value = buildCsFromSql(txtSql.value);
    }
    try
    {
        document.selection.SelectAll();
        document.selection.Text = buildCsFromSql(document.selection.Text);
        document.selection.Collapse();
       
        document.ConfigName = "C#";
    }
    catch(e)
    {
        alert("Sql的格式不正确");
    }
 
1  /  1  页   1 跳转

快速回复帖子

标题
禁用 URL 识别
禁用表情
禁用 Discuz!NT 代码
使用个人签名
  [完成后可按 Ctrl+Enter 无刷新发布]  

版权所有 拼吾爱程序人生    Total Unique Visitors:

web counter

Powered by Discuz!NT 2.1.202   Copyright © 2001-2008 Comsenz Inc. 鄂ICP备07500843号
返顶部