工具的核心是
select name from master..sysdatabases order by name
--查出所有数据库
--然后根据数据库查询出对应的表
use DataBase;
--查出当前数据库下所有用户表
SELECT name FROM sysobjects where type = 'u' ;
--查询表结构
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableName'
最终效果图
前端代码
这里前端框架使用的是EasyUI
--引用JS/CSS
<link href="EasyUI/themes/default/easyui.css" rel="stylesheet" />
<link href="EasyUI/themes/icon.css" rel="stylesheet" />
<script src="EasyUI/jquery.min.js"></script>
<script src="EasyUI/jquery.easyui.min.js"></script>
<script>
$(function () {
//连接事件
$("#btnConnect").click(function () {
var USERID = $("#USERID").val();
var PASSWORD = $("#PASSWORD").val();
var Server = $("#Server").val();
if (USERID != "" && PASSWORD != "" && Server != "") {
//清空树
$("#list").tree('loadData', []);
$("#list").tree({
url: 'Index.aspx?Type=LoadTree&USERID=' + USERID + '&PASSWORD=' + PASSWORD + '&Server=' + Server,
dataType: "json",
onLoadSuccess: function () { //加载完成事件
$("#list").tree("collapseAll"); //收起树节点
},
onClick: function (node) {//点击树事件
//0是数据库1是表
var ids = node.id == 0 ? node.id : node.id.split(',');
if (ids != 0) {
//存储表名
$("#hidName").val(node.text);
//加载Table
$("#tab").datagrid({
url: 'Index.aspx?Type=LoadTable&TableName=' + ids[1] + "," + node.text,
dataType: "json",
striped: true,
toolbar: '#tb',
rownumbers: true,
checkOnSelect: true,
selectOnCheck: true,
sortName: 'Name',
sortOrder: "desc"
})
}
}
});
}
});
})
//导出前先存储勾选字段
function Export() {
if ($("#hidName").val() != "") {
var strJson = [];
//没勾选就获取所有数据
var rows = $("#tab").datagrid("getSelections").length <= 0 ? $("#tab").datagrid("getRows") : $("#tab").datagrid("getSelections");
for (var i = 0; i < rows.length; i++) {
var _json = {
"Name": rows[i].Name,
"Type": rows[i].Type,
"Length": rows[i].Length,
"ToType": rows[i].ToType
};
strJson.push(_json);
}
$("#hidData").val(JSON.stringify(strJson));
return true;
} else
alert("请选择需要导出的表!");
return false;
}
</script>
<body class="easyui-layout">
<form id="form1" runat="server">
<input type="hidden" id="hidName" runat="server" />
<input type="hidden" id="hidData" runat="server" />
<div data-options="region:'north',title:'North Title',split:true" style="height:180px;">
<div style="margin-top: 5px; margin-bottom: 5px;">
<div style="display: inline-block;width: 45%;text-align: right;"><span>服务器名称:</span></div>
<div style="display: inline-block;"><input class="easyui-textbox" data-options="" style="width:300px" id="Server" /></div>
</div>
<div style="margin-top: 5px; margin-bottom: 5px;">
<div style="display: inline-block;width: 45%;text-align: right;"><span>用户名:</span></div>
<div style="display: inline-block;"><input class="easyui-textbox" data-options="" style="width:300px" id="USERID" /></div>
</div>
<div style="margin-top: 5px; margin-bottom: 5px;">
<div style="display: inline-block;width: 45%;text-align: right;"><span>密码:</span></div>
<div style="display: inline-block;"><input class="easyui-textbox" data-options="" style="width:300px" id="PASSWORD" /></div>
</div>
<div style="margin-top: 5px; margin-bottom: 5px;text-align:center;">
<button type="button" class="easyui-linkbutton" data-options="iconCls:'icon-ok'" style="width: 200px;" id="btnConnect">连接</button>
</div>
</div>
<div data-options="region:'west',title:'West',split:true" style="width:150px;">
<div>
<ul id="list" class="easyui-tree"></ul>
</div>
</div>
<div data-options="region:'center',title:'center title'" style="padding:5px;background:#eee;">
<div style="text-align:center;">
<table class="easyui-datagrid" id="tab">
<thead>
<tr>
<th field="ck" checkbox="true"></th>
<th data-options="field:'Name'">Name</th>
<th data-options="field:'Type'">Type</th>
<th data-options="field:'Length'">Length</th>
<th data-options="field:'ToType'">To Type</th>
</tr>
</thead>
</table>
<div id="tb">
<asp:Button ID="btnDown" runat="server" Text="生成实体类" OnClick="btnDown_Click" class="easyui-linkbutton textbox-button" data-options="iconCls:'icon-pen',plain:true" OnClientClick=" return Export();" />
<asp:Button ID="btnDownService" runat="server" Text="生成Service" class="easyui-linkbutton textbox-button" data-options="iconCls:'icon-pen',plain:true" OnClientClick=" return Export();" OnClick="btnDownService_Click" />
</div>
</div>
</div>
</form>
</body>
后台代码:
using Code_generation.DAL;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Code_generation
{
public partial class Index1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
HttpContext context = System.Web.HttpContext.Current;
if (context.Request.QueryString["Type"] != null)
{
if (context.Request.QueryString["Type"].ToString() == "LoadTree")//加载树
GetDataBaseList(context);
else if (context.Request.QueryString["Type"].ToString() == "LoadTable")//加载表
GetTableInfromation(context);
}
}
}
/// <summary>
/// 获取表结构
/// </summary>
/// <param name="context"></param>
private void GetTableInfromation(HttpContext context)
{
//获取数据库名和表名
string[] strName = context.Request.QueryString["TableName"].ToString().Split(',');
string strDB = strName[0];
string strTableName = strName[1];
DataTable dt = TableInfromation.GetTableInfromation(strDB, strTableName);
string strJson = JsonConvert.SerializeObject(dt);
context.Response.Clear();
context.Response.ContentEncoding = Encoding.UTF8;
context.Response.ContentType = "application/json";
context.Response.Write(strJson);
context.Response.Flush();
context.Response.End();
}
/// <summary>
/// 获取数据库列表
/// </summary>
/// <param name="context"></param>
public void GetDataBaseList(HttpContext context)
{
//链接信息
string strUSERID = context.Request.QueryString["USERID"];
string strPASSWORD = context.Request.QueryString["PASSWORD"];
string strServer = context.Request.QueryString["Server"];
DBHelper.conntion = "USER ID=" + strUSERID + ";PASSWORD=" + strPASSWORD + ";INITIAL CATALOG=master; server=" + strServer;
//所有数据库
DataTable dt = TableInfromation.GetAllDataBase();
StringBuilder sb = new StringBuilder();
//查询指定数据库下所有的用户表
foreach (DataRow dr in dt.Rows)
{
sb.Append("use [" + dr[0].ToString() + "];");
sb.Append("select '" + dr[0].ToString() + "' name union all SELECT name FROM sysobjects where type = 'u' ; ");
}
DataSet ds = DBHelper.Query(sb.ToString());
List<DataBases> list = new List<DataBases>();
foreach (DataTable dataTable in ds.Tables)
{
List<DataBase_children> listChildren = new List<DataBase_children>();
DataBases db = new DataBases();
db.id = 0;
for (int i = 0; i < dataTable.Rows.Count; i++)
{
//获取数据库名
if (i == 0)
db.text = dataTable.Rows[0][0].ToString();
else//获取该数据库下表数据
listChildren.Add(new DataBase_children()
{
id = "1," + db.text,
text = dataTable.Rows[i]["name"].ToString()
});
}
db.children = listChildren;
list.Add(db);
}
string strJson = JsonConvert.SerializeObject(list);
context.Response.Clear();
context.Response.ContentEncoding = Encoding.UTF8;
context.Response.ContentType = "application/json";
context.Response.Write(strJson);
context.Response.Flush();
context.Response.End();
}
/// <summary>
/// 写入文件内容
/// </summary>
/// <param name="strContent">文件内容</param>
/// <param name="strSrc">文件路径</param>
public static void TxtWrite(string strContent,string strSrc)
{
//判断文件是否存在
if (System.IO.File.Exists(strSrc))
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(strSrc, false))
{
//内容写入
sw.WriteLine(strContent);
//关闭连接
sw.Close();
}
}
else
{
//创建文件后关闭
System.IO.File.Create(strSrc).Close();
//打开文件
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(strSrc, false))
{
sw.WriteLine(strContent);
sw.Close();
}
}
}
protected void btnDown_Click(object sender, EventArgs e)
{
//需要生成的字段
DataTable dt = JsonConvert.DeserializeObject<DataTable>(hidData.Value);
StringBuilder sb = new StringBuilder();
sb.Append("using System;\n");
sb.Append("using System.Collections.Generic;\n");
sb.Append("using System.Linq;\n");
sb.Append("using System.Web;\n");
sb.Append("namespace Your namespace\n{\n");
sb.Append(" public class "+ hidName.Value + "\n {\n");
foreach (DataRow dataRow in dt.Rows)
{
sb.Append(" public " + dataRow["ToType"] + " " + dataRow["Name"] + " { get; set; }\n");
}
sb.Append(" }\n}\n");
string filename = HttpUtility.UrlEncode(hidName.Value + ".cs", System.Text.Encoding.UTF8);
string filePath = Server.MapPath("/Down/" + filename);//路径
TxtWrite(sb.ToString(), filePath);
//string fullPathUrl = Server.MapPath(filePath);//获取下载文件的路劲
System.IO.FileInfo file = new System.IO.FileInfo(filePath);
if (file.Exists)//判断文件是否存在
{
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.AddHeader("content-disposition", "attachment;filename=" + file.Name);
Response.AddHeader("cintent_length", "attachment;filename=" + HttpUtility.UrlDecode(file.Name));
Response.AddHeader("cintent_length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(file.FullName);//通过response对象,执行下载操作
Response.Flush();
Response.End();
}
}
protected void btnDownService_Click(object sender, EventArgs e)
{
//获取生成字段
DataTable dt = JsonConvert.DeserializeObject<DataTable>(hidData.Value);
StringBuilder sb = new StringBuilder();
sb.Append("using System;\n");
sb.Append("using System.Collections.Generic;\n");
sb.Append("using System.Linq;\n");
sb.Append("using System.Data;\n");
sb.Append("using System.Data.SqlClient;\n");
sb.Append("using System.Text;\n\n");
sb.Append("namespace Your namespace\n{\n");
sb.Append(" public class " + hidName.Value + "Service\n {\n");
#region 新增方法
sb.Append(" public static int Add" + hidName.Value + "(" + hidName.Value + " " + hidName.Value + ", SqlConnection conn, SqlTransaction tran)\n");
sb.Append(" {\n");
sb.Append(" try\n");
sb.Append(" {\n");
sb.Append(" string sql = @\"INSERT INTO[dbo]." + hidName.Value + "(");
string strField = "";
foreach (DataRow dataRow in dt.Rows)
{
strField+=dataRow["Name"] + ",";
}
sb.Append((strField.Length > 1 ? strField.Substring(0, strField.Length - 1) : strField)+")");
sb.Append("VALUES(");
string strValue = "";
foreach (DataRow dataRow in dt.Rows)
{
strValue += "@"+dataRow["Name"] + ",";
}
sb.Append((strValue.Length > 1 ? strValue.Substring(0, strValue.Length - 1) : strValue) + ")\";\n");
sb.Append(" SqlParameter[] ps ={\n");
string strParas = "";
foreach (DataRow dataRow in dt.Rows)
{
strParas+=" new SqlParameter(\"@" + dataRow["Name"] + "\"," + hidName.Value + "." + dataRow["Name"] + "),\n";
}
strParas = strParas.Length > 1 ? strParas.Substring(0, strParas.Length - 2) : strParas;
sb.Append(strParas+"\n");
sb.Append(" };\n");
sb.Append(" int ID= DBHelper.ExecuteScalar(sql + \"; SELECT @@identity AS 'ID'; \", conn, tran, ps);\n");
sb.Append(" return ID;\n");
sb.Append(" }\n");
sb.Append(" catch\n");
sb.Append(" {\n");
sb.Append(" throw;\n");
sb.Append(" }\n");
sb.Append(" }\n");
#endregion
#region 修改方法
sb.Append(" public static int Update"+ hidName.Value + "("+ hidName.Value + " "+ hidName.Value + ", SqlConnection conn, SqlTransaction tran)\n");
sb.Append(" {\n");
sb.Append(" try\n");
sb.Append(" {\n");
sb.Append(" string sql = @\"UPDATE[dbo].[" + hidName.Value + "]\n");
sb.Append(" SET ");
strField = "";
foreach (DataRow dataRow in dt.Rows)
{
strField += dataRow["Name"] + "=@" + dataRow["Name"] + ",";
}
strField = strField.Length > 1 ? strField.Substring(0, strField.Length - 1) : strField;
strField+= " WHERE id = @id \"; \n";
sb.Append(strField);
sb.Append(" SqlParameter[] ps ={\n");
strParas = "";
foreach (DataRow dataRow in dt.Rows)
{
strParas += " new SqlParameter(\"@" + dataRow["Name"] + "\"," + hidName.Value + "." + dataRow["Name"] + "),\n";
}
strParas = strParas.Length > 1 ? strParas.Substring(0, strParas.Length - 2) : strParas;
sb.Append(strParas+"\n");
sb.Append(" };\n");
sb.Append(" return DBHelper.ExecuteCommand(sql, conn, tran, ps);\n");
sb.Append(" }\n");
sb.Append(" catch\n");
sb.Append(" {\n");
sb.Append(" throw;\n");
sb.Append(" }\n");
sb.Append(" }\n");
#endregion
#region 删除方法
sb.Append(" public static int Delete"+ hidName.Value + "("+ hidName.Value + " "+ hidName.Value + ", SqlConnection conn, SqlTransaction tran)\n");
sb.Append(" {\n");
sb.Append(" try\n");
sb.Append(" {\n");
sb.Append(" string sql = \"Delete From "+ hidName.Value + " Where ID = @ID \";\n");
sb.Append(" SqlParameter[] ps ={\n");
sb.Append(" new SqlParameter(\"@ID\","+ hidName.Value + ".ID)};\n");
sb.Append(" return DBHelper.ExecuteCommand(sql, conn, tran, ps);\n");
sb.Append(" }\n");
sb.Append(" catch\n");
sb.Append(" {\n");
sb.Append(" throw;\n");
sb.Append(" }\n");
sb.Append(" }\n");
#endregion
#region 查询方法
sb.Append(" public static List<ProductSampling> GetProductSampling()\n");
sb.Append(" {\n");
sb.Append(" return GetProductSampling(\"select * from " + hidName.Value + "\", new SqlParameter[] { });\n");
sb.Append(" }\n");
sb.Append(" public static List<" + hidName.Value + "> Get" + hidName.Value + "(string sql, SqlParameter[] ps)\n");
sb.Append(" {\n");
sb.Append(" SqlConnection conn = DBHelper.GetConnection();\n");
sb.Append(" SqlDataReader dr = DBHelper.GetReader(sql, conn, ps);\n");
sb.Append(" List<" + hidName.Value + "> list = new List<" + hidName.Value + ">();\n");
sb.Append(" while (dr.Read())\n");
sb.Append(" {\n");
sb.Append(" " + hidName.Value + " " + hidName.Value + " = new " + hidName.Value + "();\n");
foreach (DataRow dr in dt.Rows)
{
string strName = dr["Name"].ToString();
switch (dr["ToType"].ToString())
{
case "String":
sb.Append(" " + hidName.Value + "." + strName + " = dr[\"" + strName + "\"] == DBNull.Value ? \"\" : dr[\"" + strName + "\"].ToString();\n");
break;
case "Int?":
sb.Append(" " + hidName.Value + "." + strName + " = dr[\"" + strName + "\"] == DBNull.Value ? (int?)null : (int?)dr[\"" + strName + "\"];\n");
break;
case "DateTime?":
sb.Append(" " + hidName.Value + "." + strName + " = dr[\"" + strName + "\"] == DBNull.Value ? (DateTime?)null : (DateTime?)dr[\"" + strName + "\"];\n");
break;
}
}
sb.Append(" list.Add(" + hidName.Value + ");\n");
sb.Append(" }\n");
sb.Append(" if (conn.State == ConnectionState.Open)\n");
sb.Append(" conn.Close();\n");
sb.Append(" return list;\n");
sb.Append(" }\n");
#endregion
sb.Append(" }\n}\n");
string filename = HttpUtility.UrlEncode(hidName.Value + "Service.cs", System.Text.Encoding.UTF8);
string filePath = Server.MapPath("/Down/" + filename);//路径
TxtWrite(sb.ToString(), filePath);
//string fullPathUrl = Server.MapPath(filePath);//获取下载文件的路劲
System.IO.FileInfo file = new System.IO.FileInfo(filePath);
if (file.Exists)//判断文件是否存在
{
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.AddHeader("content-disposition", "attachment;filename=" + file.Name);
Response.AddHeader("cintent_length", "attachment;filename=" + HttpUtility.UrlDecode(file.Name));
Response.AddHeader("cintent_length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(file.FullName);//通过response对象,执行下载操作
Response.Flush();
Response.End();
}
}
}
}
class DataBases
{
public int id { get; set; }
public string text { get; set; }
public List<DataBase_children> children { get; set; }
}
class DataBase_children
{
public string id { get; set; }
public string text { get; set; }
}
DAL代码
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace Code_generation.DAL
{
public class TableInfromation
{
/// <summary>
/// 获取指定IP地址的数据库所有数据库实例名。
/// </summary>
/// <returns>返回包含数据实例名的列表。</returns>
public static DataTable GetAllDataBase()
{
SqlConnection Connection = DBHelper.GetConnection();
DataTable DBNameTable = new DataTable();
SqlDataAdapter Adapter = new SqlDataAdapter("select name from master..sysdatabases order by name", Connection);
lock (Adapter)
{
Adapter.Fill(DBNameTable);
}
Connection.Close();
return DBNameTable;
}
public static DataTable GetTableInfromation(string strDB,string strTableName)
{
SqlConnection Connection = DBHelper.GetConnection();
DataTable DBNameTable = new DataTable();
SqlDataAdapter Adapter = new SqlDataAdapter("use "+ strDB + "; SELECT COLUMN_NAME Name,DATA_TYPE Type,CHARACTER_MAXIMUM_LENGTH Length,case "
+@"when charindex('char', DATA_TYPE) > 0 then 'String'
when charindex('date', DATA_TYPE) > 0 then 'DateTime?'
when charindex('int', DATA_TYPE) > 0 then 'Int?'
end ToType FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '"+ strTableName + "'", Connection);
lock (Adapter)
{
Adapter.Fill(DBNameTable);
}
Connection.Close();
return DBNameTable;
}
}
}
部署至IIS就可以一直使用了。
以上。
此外转成类型可以考虑做成下拉列表提供任意类型。