在工作中,有很多项目已上线后,很多项目的数据库服务器都不会对外开放的,外网想直接访问客户数据库服务器时,可能会出现困难。

这时就需要一个可以查询,更新数据库操作的页面了;

本来用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>

作者:a497785609 发表于2014-5-2 16:55:08 原文链接
阅读:43 评论:0 查看评论

[原]ASP.NET 数据库访问通用工具的更多相关文章

  1. ASP.NET 数据库访问通用工具

    在工作中,有很多项目已上线后,很多项目的数据库服务器都不会对外开放的,外网想直接访问客户数据库服务器时,可能会出现困难. 这时就需要一个可以查询,更新数据库操作的页面了: 本来用sql语句直接操作数据 ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  3. 我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(1)数据库访问(0)

    一.数据库访问 概述 1. 数据库使用mysql,orm采用dapper框架.dapper框架应用简单,只是需要自己手写sql语句,但是对于像我这样写了多年sql语句的人来说,这应该不算问题,个人还是 ...

  4. [原]DbHelper-SQL数据库访问助手

    using System; using System.Data; using System.Data.SqlClient; namespace Whir.Software.Framework.Ulti ...

  5. [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)

    [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date  周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...

  6. C#与数据库访问技术总结(十八)

    ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...

  7. 26种提高ASP.NET网站访问性能的优化方法 .

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池 ...

  8. java提高数据库访问效率代码优化

    package com.jb.jubmis.comm; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQL ...

  9. 非常不错的ASP操作数据库类,支持多数据库MSSQL,ACCESS,ORACLE,MYSQL等

    可同时操作多个不同类型的数据库. 完全不用考虑数据类型的差别,再也不用想字符型字段加不加单引号. 调用非常简单,对数据库的主要操作一般只需要一行代码. 支持mssql事务回滚. 可自动生成和输出sql ...

随机推荐

  1. linux学习之系统管理、网络配置、软件安装

    一.ifconfig,命令查看linux系统IP 二.su切换到root下(已是root用户不用切换),使用setup命令启用界面操作         CentOS我安装的是Minimal版本,没有安 ...

  2. --Dirring love 音乐(01背包问题)

    解题思路: dp[i][j] 前 i 首歌放入 j 容量中的最大热情度. 前 i 首歌 放到 j 容量中 dp[i][j]= dp[i-1][j-m[i]]+r[i]   (注意:如果 j 容量 &l ...

  3. Pb (数据存储单位)

    PB (数据存储单位) 编辑 pb指petabyte,它是较高级的存储单位,其上还有EB,ZB,YB等单位. 它等于1,125,899,906,842,624(2的50次方)字节,“大约”是一千个te ...

  4. 通过cmd修改注册表并设置cmd窗口的大小

    设置cmd的窗口 mode: modem设置系统设备,主要是lpt1, com1/2, con: 启动时设置窗口大小: cmd /k "mode con: cols=120 lines=40 ...

  5. Sqlserver日期函数应用

    1.获取当前时间 SELECT  GETDATE() AS '当前日期' ,         DATENAME(year, GETDATE()) AS '年' ,         DATENAME(m ...

  6. DiscuzX程序升级教程_不知道关闭论坛的看过来

    DiscuzX程序升级教程,不知道关闭论坛的朋友看过来,适用于  1.0, 1.5 2.0 , 2.5Beta, 2.5RC,2.5, 3.0 1)关闭论坛:后台- 全局- 站点信息- 是否关闭 :是 ...

  7. A+B Again(在某个数中找大于m的最小约数)

    A+B Again Accepted : 15   Submit : 243 Time Limit : 1000 MS   Memory Limit : 65536 KB  题目描述 上次趣味赛小明的 ...

  8. Xcode 4.6.3 Bug - .m 文件不能正常打开,uitableveiwController

    当打开.m文件时尤其是自定义的继承uitableviewcontroler的m 文件.不能滑动,不能正常显示. 解决方法: 用文本编辑器打开这个文件,关闭xcode .然后在继承uitableview ...

  9. Java中的构造函数和重载

    一.Java中的构造函数 构造函数是对象被创建时初始化对象的成员方法,它具有和它所在的类完全一样的名字.构造函数只能有入口参数,没有返回类型,因为一个类的构造方法的返回类就是类本身.构造函数定义后,创 ...

  10. Tenth scrum meeting - 2015/11/4

    我们的项目开发已经渐渐进入了后期,每个模块都只剩下了一小块任务待做,同学们在做自己的模块的同时也开始对各个同学的模块进行合并. 其中最麻烦的就是视频播放模块与其他模块的合并了,由于该模块的实现需要添加 ...