[原]ASP.NET 数据库访问通用工具
在工作中,有很多项目已上线后,很多项目的数据库服务器都不会对外开放的,外网想直接访问客户数据库服务器时,可能会出现困难。
这时就需要一个可以查询,更新数据库操作的页面了;
本来用sql语句直接操作数据库数据是不好的,所以此页面工具只针对已经非常熟悉数据库结构的人来使用,因为可以执行更新/修改语句,请慎用。
目前没对这个页面做任何的访问限制,出于对数据的安全性考虑,强烈建议对本页面的访问做访问限制处理!
效果图:
在线体验:(个人站点域名审核还未通过,敬请关注)
打包下载:http://download.csdn.net/detail/a497785609/7283839
源代码:
为了方便使用,所有代码都写在了一个apsx页面,便于携带,另存为一个aspx,放到您的站点访问即可。
- <%@ Page Language="C#" %>
- <%@ Import Namespace="System" %>
- <%@ Import Namespace="System.Data" %>
- <%@ Import Namespace="System.Data.SqlClient" %>
- <%@ Import Namespace="System.Collections.Generic" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <script runat="server">
- /// <summary>
- /// 【数据库连接字符串】
- /// 注意:在这里需与webconfig里的数据库连接字符串配置节一致;
- /// </summary>
- protected string Connection = ConfigurationManager.ConnectionStrings["sqlserver"].ConnectionString;
- /// <summary>
- /// 所有数据表,前台js使用
- /// </summary>
- protected string DataTables { get; set; }
- /// <summary>
- /// 所有字段,前台js使用
- /// </summary>
- protected string Fields { get; set; }
- /// <summary>
- /// 判断连接是否成功!
- /// </summary>
- /// <param name="con"> 链接字符串</param>
- /// <returns>true 表示链接成功,false表示连接失败</returns>
- public static string CheckConnection(string con)
- {
- string status = "";
- var conn = new SqlConnection(con);
- try
- {
- conn.Open();
- status = "true|";
- }
- catch (Exception ex)
- {
- status = "false|" + ex.Message;
- }
- finally
- {
- conn.Close();
- }
- return status;
- }
- protected void Page_Load(object sender, EventArgs e)
- {
- if (CheckConnection(Connection).ToLower().StartsWith("false"))
- {
- Response.Clear();
- Response.Write("<span style='color:red'>对不起,数据库链接失败.<br/><br/>请检查数据库链接:\"" + Connection + "\" 是否正确!</span>");
- Response.End();
- }
- else
- {
- //所有表
- if (Cache.Get("tables") == null)
- {
- List<string> tables = GetTableNames(Connection);
- DataTables = "[";
- foreach (string table in tables)
- {
- DataTables += "'" + table + "',";
- }
- DataTables = DataTables.TrimEnd(',');
- DataTables += "]";
- Cache.Insert("tables", DataTables);
- }
- else
- {
- DataTables = Cache.Get("tables").ToString();
- }
- //所有字段
- if (Cache.Get("fields") == null)
- {
- DataTable fields = GetFileds(Connection);
- Fields = "[";
- foreach (DataRow row in fields.Rows)
- {
- Fields += "{tName:'" + row["表名"] + "',fName:'" + row["字段名"] + "'},";
- }
- Fields = Fields.TrimEnd(',');
- Fields += "]";
- Cache.Insert("fields", Fields);
- }
- else
- {
- Fields = Cache.Get("fields").ToString();
- }
- if (!IsPostBack)
- {
- }
- }
- }
- #region 查询
- /// <summary>
- /// 需过滤掉的关键字
- /// </summary>
- public static string[] ForbidSqlKeyword = { "ALTER", "UPDATE", "DELETE", "DROP", "CREATE", "COMMIT" };
- public static bool IsContainDangerWords(string sql)
- {
- bool haveForbidWord = false;
- sql = sql.ToLower().Replace("\r", " ").Replace("\n", " ");
- string[] sqlWordArr = sql.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
- foreach (string word in sqlWordArr)
- {
- foreach (string forbidWord in ForbidSqlKeyword)
- {
- if (String.Compare(forbidWord.Trim(), word.Trim(), StringComparison.OrdinalIgnoreCase) == 0)
- {
- haveForbidWord = true;
- break;
- }
- }
- }
- return haveForbidWord;
- }
- /// <summary>
- /// 查询
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void BtnQueryClick(object sender, EventArgs e)
- {
- string sql = txtSql.Text.Trim();
- if (!IsContainDangerWords(sql))
- {
- DataTable data = ExcuteDataTable(sql, Connection);
- string html = GetHtmlTable(data);
- ltrResult.Text = html;
- }
- else
- {
- var dt = new DataTable();
- dt.Columns.Add("执行结果");
- DataRow row = dt.NewRow();
- row["执行结果"] = "<span class='fail'>查询语句中含有修改数据相关的关键字,操作已忽略</span>";
- dt.Rows.Add(row);
- string html = GetHtmlTable(dt);
- ltrResult.Text = html;
- }
- }
- #endregion
- #region 执行
- /// <summary>
- /// 执行
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void BtnExcuteClick(object sender, EventArgs e)
- {
- var dt = new DataTable();
- string sql = txtSql.Text.Trim();
- try
- {
- if (Execute(sql, Connection))
- {
- dt.Columns.Add("执行结果");
- DataRow row = dt.NewRow();
- row["执行结果"] = "<span class='sucess'>执行成功</span>";
- dt.Rows.Add(row);
- }
- else
- {
- dt.Columns.Add("执行结果");
- DataRow row = dt.NewRow();
- row["执行结果"] = "<span class='fail'>执行失败</span>";
- dt.Rows.Add(row);
- }
- }
- catch (Exception ex)
- {
- dt.Columns.Add("异常信息");
- DataRow row = dt.NewRow();
- row["异常信息"] = ex.Message;
- dt.Rows.Add(row);
- }
- string html = GetHtmlTable(dt);
- ltrResult.Text = html;
- }
- #endregion
- #region 执行SQL语句返回DataTable
- /// <summary>
- /// 执行SQL语句返回DataTable
- /// </summary>
- /// <param name="sql"></param>
- /// <param name="con"></param>
- /// <returns></returns>
- public static DataTable ExcuteDataTable(string sql, string con)
- {
- var cmd = new SqlCommand();
- var connection = new SqlConnection(con);
- try
- {
- using (connection)
- {
- cmd.Connection = connection;
- cmd.CommandText = sql;
- connection.Open();
- var da = new SqlDataAdapter(cmd);
- var ds = new DataSet();
- da.Fill(ds);
- return ds.Tables[0];
- }
- }
- catch (Exception ex)
- {
- var dt = new DataTable();
- dt.Columns.Add("异常信息");
- DataRow row = dt.NewRow();
- row["异常信息"] = ex.Message;
- dt.Rows.Add(row);
- return dt;
- }
- }
- #endregion
- #region DataSet转换为Html表格
- /// <summary>
- /// 将DataSet转换为Html表格
- /// </summary>
- /// <param name="dt"></param>
- /// <returns></returns>
- public static string GetHtmlTable(DataTable dt)
- {
- var html = new StringBuilder();
- if (dt.Rows.Count == 0)
- {
- html.Append(
- @"<table class='data' cellspacing='1' cellpadding='0' border='1' style='width: 100%;'>
- <tbody>
- <tr class='tdbg' align='center' style='height: 100px;'>
- <td colspan='12'>
- 没有任何记录!
- </td>
- </tr>
- </tbody>
- </table>");
- }
- else
- {
- #region 表头行
- html.Append(@"<table class='data' cellspacing='1' cellpadding='0' border='1' style='width: 100%;'>");
- html.Append(@"<tr class='gridtitle'>");
- foreach (DataColumn columns in dt.Columns)
- {
- string title = columns.ColumnName;
- html.Append(string.Format(@"<th scope='col' class='data_th'>{0}</th>", title));
- }
- html.Append(@"</tr>");
- #endregion
- #region 表数据行
- foreach (DataRow row in dt.Rows)
- {
- html.Append(string.Format("<tr class='data_tr'>"));
- foreach (DataColumn columns in dt.Columns)
- {
- string cellValue = row[columns.ColumnName].ToString();
- html.Append(string.Format("<td class='data_td'>{0}</td>", cellValue));
- }
- html.Append(@"</tr>");
- }
- #endregion
- #region 表尾
- html.Append(string.Format("<tr class='data_tr'>"));
- html.Append(string.Format("<td class='data_td' colspan='{0}'>合计:{1}条记录</td>", dt.Columns.Count,
- dt.Rows.Count));
- html.Append(@"</tr>");
- html.Append(@"</table>");
- #endregion
- }
- return html.ToString();
- }
- #endregion
- #region 执行不带参数sql语句
- /// <summary>
- /// 执行不带参数sql语句
- /// </summary>
- /// <param name="sql">增,删,改sql语句</param>
- /// <param name="con"></param>
- /// <returns>返回所影响的行数</returns>
- public static bool Execute(string sql, string con)
- {
- var cmd = new SqlCommand();
- var connection = new SqlConnection(con);
- try
- {
- using (connection)
- {
- cmd.Connection = connection;
- cmd.CommandText = sql;
- connection.Open();
- cmd.ExecuteNonQuery();
- return true;
- }
- }
- catch (Exception)
- {
- return false;
- }
- }
- #endregion
- /// <summary>
- /// 获取指定数据库中所有表的名字;
- /// </summary>
- /// <param name="con">连接字符串</param>
- /// <returns>所有表名的集合</returns>
- public static List<string> GetTableNames(string con)
- {
- var tableNames = new List<string>();
- try
- {
- var regex = new Regex(
- "(?i)(Initial Catalog|database)=(?<database>[^;]*);",
- RegexOptions.CultureInvariant
- | RegexOptions.Compiled
- );
- Group database = regex.Match(con).Groups["database"];
- string sql =
- "SELECT SYSOBJECTS.NAME FROM SYSOBJECTS,MASTER..SYSDATABASES T WHERE TYPE='U'AND T.NAME='" +
- database + "' ORDER BY SYSOBJECTS.NAME ASC";
- var cmd = new SqlCommand();
- var sqlcon = new SqlConnection(con);
- using (sqlcon)
- {
- cmd.Connection = sqlcon;
- cmd.CommandText = sql;
- sqlcon.Open();
- SqlDataReader sdr = cmd.ExecuteReader();
- while (sdr.Read())
- {
- tableNames.Add(sdr[0].ToString());
- }
- }
- }
- catch (Exception ex)
- {
- tableNames.Add("异常:" + ex.Message);
- }
- return tableNames;
- }
- /// <summary>
- /// 取得所有字段
- /// </summary>
- /// <param name="connection"></param>
- /// <returns></returns>
- public DataTable GetFileds(string connection)
- {
- const string sql = @"
- SELECT 表名 = O.name,
- 字段名 = C.name
- FROM sys.columns C
- INNER JOIN sys.objects O
- ON C.[object_id] = O.[object_id]
- AND O.type = 'U'
- AND O.is_ms_shipped = 0
- INNER JOIN sys.types T
- ON C.user_type_id = T.user_type_id
- LEFT JOIN sys.default_constraints D
- ON C.[object_id] = D.parent_object_id
- AND C.column_id = D.parent_column_id
- AND C.default_object_id = D.[object_id]
- LEFT JOIN sys.extended_properties PFD
- ON PFD.class = 1
- AND C.[object_id] = PFD.major_id
- AND C.column_id = PFD.minor_id
- LEFT JOIN sys.extended_properties PTB
- ON PTB.class = 1
- AND PTB.minor_id = 0
- AND C.[object_id] = PTB.major_id
- LEFT JOIN -- 索引及主键信息
- (
- SELECT IDXC.[object_id],
- IDXC.column_id,
- Sort = CASE INDEXKEY_PROPERTY(
- IDXC.[object_id],
- IDXC.index_id,
- IDXC.index_column_id,
- 'IsDescending'
- )
- WHEN 1 THEN 'DESC'
- WHEN 0 THEN 'ASC'
- ELSE ''
- END,
- PrimaryKey = CASE
- WHEN IDX.is_primary_key = 1 THEN N'√'
- ELSE N''
- END,
- IndexName = IDX.Name
- FROM sys.indexes IDX
- INNER JOIN sys.index_columns IDXC
- ON IDX.[object_id] = IDXC.[object_id]
- AND IDX.index_id = IDXC.index_id
- LEFT JOIN sys.key_constraints KC
- ON IDX.[object_id] = KC.[parent_object_id]
- AND IDX.index_id = KC.unique_index_id
- INNER JOIN -- 对于一个列包含多个索引的情况,只显示第个索引信息
- (
- SELECT [object_id],
- Column_id,
- index_id = MIN(index_id)
- FROM sys.index_columns
- GROUP BY
- [object_id],
- Column_id
- ) IDXCUQ
- ON IDXC.[object_id] = IDXCUQ.[object_id]
- AND IDXC.Column_id = IDXCUQ.Column_id
- AND IDXC.index_id = IDXCUQ.index_id
- ) IDX
- ON C.[object_id] = IDX.[object_id]
- AND C.column_id = IDX.column_id
- ORDER BY
- O.name,
- C.column_id";
- return ExcuteDataTable(sql, Connection);
- }
- </script>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head id="Head1" runat="server">
- <title>数据库管理工具_V1.0</title>
- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"> </script>
- <style type="text/css">
- body { font-size: 12px; }
- td, th { border: 1px solid gray; border-collapse: collapse; display: table-cell; line-height: 22px; vertical-align: inherit; }
- table { border-bottom-width: 0px; border-collapse: collapse; border-color: gray; border-color: gray; border-left-width: 0px; border-right-width: 0px; border-spacing: 0px; border-spacing: 0px; border-spacing: 2px; border-top-width: 0px; display: table; }
- fieldset { border: 1px solid gray; margin-bottom: 10px; padding: 8px; }
- .demo_title { background-color: lightgray; }
- .result { max-height: 400px; max-width: 100%; overflow: auto; }
- .data_th { background-color: #D3D8E0; }
- .data_td { padding-left: 5px; }
- .fail { color: red; font-weight: bold; }
- .sucess { color: green; font-weight: bold; }
- .demo_main { }
- .demo_content { }
- .keyword { background-color: lavender; border: 1px dashed darkgray; border-radius: 4px; cursor: pointer; margin-right: 10px; padding: 5px; }
- textarea { -moz-box-shadow: 1px 1px 0 #E7E7E7; -moz-box-sizing: border-box; border-color: #CCCCCC #999999 #999999 #CCCCCC; border-style: solid; border-width: 1px; font-family: arial, sans-serif; font-size: 13px; height: 160px; margin: 10px auto; outline-color: -moz-use-text-color; outline-style: none; outline-width: medium; padding: 2px; width: 100%; }
- select { height: 25px; border: 1px solid lightgray; }
- </style>
- </head>
- <body>
- <form id="form1" runat="server">
- <asp:ScriptManager ID="ScriptManager1" runat="server">
- </asp:ScriptManager>
- <div class="demo_main">
- <fieldset class="demo_title">
- 数据库管理工具_V1.0
- </fieldset>
- <fieldset class="demo_content">
- <legend>查询语句: </legend>
- <asp:TextBox runat="server" ID="txtSql" Style="text-transform: uppercase" TextMode="MultiLine"
- Width="99%" Height="100"></asp:TextBox>
- <p style="margin: 0; padding: 8px 0 0 0;">
- 可用表名:
- <select id="selectTables" style="width: 200px;">
- </select>
- 可用字段:
- <select id="selectFields" style="width: 200px;">
- <option>请选择表名</option>
- </select>
- 可用变量: <span class="keyword">SELECT</span><span class="keyword">TOP</span><span class="keyword">100</span><span
- class="keyword">*</span><span class="keyword">FROM</span><span class="keyword">DELETE</span><span
- class="keyword">UPDATE </span><span class="keyword">CREATE</span>
- </p>
- </fieldset>
- <asp:UpdatePanel ID="UpdatePanel1" runat="server">
- <ContentTemplate>
- <fieldset class="demo_content">
- <legend>操作选项</legend>
- <asp:Button runat="server" ID="btnQuery" Text="查询" OnClick="BtnQueryClick" />
- <asp:Button runat="server" ID="btnExcute" Text="执行" OnClientClick=" return confirm('确定SQL语句正确并立即执行吗?') "
- OnClick="BtnExcuteClick" />
- <asp:UpdateProgress ID="UpdateProgress1" runat="server">
- <ProgressTemplate>
- <asp:Label ForeColor="green" runat="server" ID="lblStatus" Text="处理中,请稍候..." />
- </ProgressTemplate>
- </asp:UpdateProgress>
- </fieldset>
- <fieldset class="demo_content">
- <legend>查询结果:</legend>
- <div class="result">
- <asp:Literal runat="server" ID="ltrResult"></asp:Literal>
- </div>
- </fieldset>
- </ContentTemplate>
- </asp:UpdatePanel>
- </div>
- <script type="text/javascript">
- //====================================在文本框指定位置插入值=======================================
- (function ($) {
- $.fn.extend({
- insertAtCaret: function (myValue) {
- var $t = $(this)[0];
- if (document.selection) {
- this.focus();
- var sel = document.selection.createRange();
- sel.text = myValue;
- this.focus();
- } else if ($t.selectionStart || $t.selectionStart == '0') {
- var startPos = $t.selectionStart;
- var endPos = $t.selectionEnd;
- var scrollTop = $t.scrollTop;
- $t.value = $t.value.substring(0, startPos) + myValue + $t.value.substring(endPos, $t.value.length);
- this.focus();
- $t.selectionStart = startPos + myValue.length;
- $t.selectionEnd = startPos + myValue.length;
- $t.scrollTop = scrollTop;
- } else {
- this.value += myValue;
- this.focus();
- }
- }
- });
- })(jQuery);
- //==================================================================================
- var tables = "<%= DataTables %>";
- var fields = "<%= Fields %>";
- $(function () {
- tables = eval(tables);
- for (var i = 0; i < tables.length; i++) {
- $("#selectTables").append("<option>" + tables[i] + "</option>");
- }
- //选择表
- $("#selectTables").change(function () {
- var table = $(this).val();
- fields = eval(fields);
- $("#selectFields").empty();
- for (var i = 0; i < fields.length; i++) {
- if (fields[i].tName == table) {
- $("#selectFields").append("<option>" + fields[i].fName + "</option>");
- }
- }
- $("#<%= txtSql.ClientID %>").insertAtCaret(" " + table + " ");
- });
- //选择字段
- $("#selectFields").change(function () {
- var field = $(this).val();
- if (field != "请选择表名") {
- $("#<%= txtSql.ClientID %>").insertAtCaret(" " + field + " ");
- }
- });
- //选择关键字
- $(".keyword").click(function () {
- var keyword = $(this).text();
- $("#<%= txtSql.ClientID %>").insertAtCaret(" " + keyword + " ");
- });
- });
- </script>
- </form>
- </body>
- </html>
[原]ASP.NET 数据库访问通用工具的更多相关文章
- ASP.NET 数据库访问通用工具
在工作中,有很多项目已上线后,很多项目的数据库服务器都不会对外开放的,外网想直接访问客户数据库服务器时,可能会出现困难. 这时就需要一个可以查询,更新数据库操作的页面了: 本来用sql语句直接操作数据 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...
- 我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(1)数据库访问(0)
一.数据库访问 概述 1. 数据库使用mysql,orm采用dapper框架.dapper框架应用简单,只是需要自己手写sql语句,但是对于像我这样写了多年sql语句的人来说,这应该不算问题,个人还是 ...
- [原]DbHelper-SQL数据库访问助手
using System; using System.Data; using System.Data.SqlClient; namespace Whir.Software.Framework.Ulti ...
- [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)
[入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date 周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...
- C#与数据库访问技术总结(十八)
ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...
- 26种提高ASP.NET网站访问性能的优化方法 .
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池 ...
- java提高数据库访问效率代码优化
package com.jb.jubmis.comm; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQL ...
- 非常不错的ASP操作数据库类,支持多数据库MSSQL,ACCESS,ORACLE,MYSQL等
可同时操作多个不同类型的数据库. 完全不用考虑数据类型的差别,再也不用想字符型字段加不加单引号. 调用非常简单,对数据库的主要操作一般只需要一行代码. 支持mssql事务回滚. 可自动生成和输出sql ...
随机推荐
- express快速搭建web server
安装express4.x npm install -g express npm install -g express-generator //express命令行工具在4.x分离出来了 express ...
- SilverLight 条码 扫描枪 MVVM(转载)
目前做SL项目时,遇到条码的问题. 客户需要通过条码来加快工作效率以及减少错误.有条码,自然便引入扫描枪这个东西.不解释. 关键点是:扫描枪每次扫描完毕会触发回车 这是解决问题的关键! 现有两种情景: ...
- webservice原理
webservice的工作原理 WebService的主要目标是跨平台的可互操作性.为了达到这一目标,WebService完全基于XML(可扩展标记语言).XSD(XMLSchema)等独立于平台 ...
- oracle中Blob和Clob类型的区别
BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的的,或者可以直接用LOB字段代替这两个.但是为了更好的管理ORACLE数据库,通常像图 ...
- sprintf()函数的用法
sprintf(g_strAppName, "%s",pLast+1); ----------------------------------------------------- ...
- 《C++代码设计与重用》 书评
作者:唐风 主页:www.cnblogs.com/liyiwen 前几个星期买了,一直没有直接细翻,买的时候看了背面的两个推荐,一个是孟岩,一个是Scott Meyers(Effective C+ ...
- DiscuzX程序升级教程_不知道关闭论坛的看过来
DiscuzX程序升级教程,不知道关闭论坛的朋友看过来,适用于 1.0, 1.5 2.0 , 2.5Beta, 2.5RC,2.5, 3.0 1)关闭论坛:后台- 全局- 站点信息- 是否关闭 :是 ...
- Twelfth scrum meeting 2015/11/9
第一阶段的开发即将结束,工程代码已经集合完毕,计划在2015年11月10日发布第一阶段的成果,本次会议主要商量下一阶段需要完成的工作以及页面修改,还有测试人员的bug整理. 会议记录: 第一项:界面修 ...
- php面试题之二——数据结构和算法(高级部分)
二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class T ...
- 新鲜出炉的百度js面试题
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 最近两位同学入职百度,带回来的笔试题基本上毫无悬念,不过有一个小题看到让人忍不住笑出声来,真的很无聊 ...