SQL Server 管理工具的简单示例。






4.90/5 (41投票s)
SQL Server 管理工具的简单示例。
目录
- 1. 简介
- 2. ASP.NET SQL Server 管理器
- 3. 特性
- 4. 理解和使用代码
- 4.1 登录到 SQL Server
- 4.2 生成对象树
- 4.3 生成 Transact-SQL
- 4.4 显示数据
- 5. SQL 查询编辑器
- 6. 应用程序架构
- 7. 参考
- 8. 总结
- 9. 历史
ASP.NET SQL Server 管理器
1. 简介
处理数据时,我认为 Microsoft SQL Server 是管理大量数据/信息的最佳选择。对于任何数据库相关应用程序的开发,所有开发人员都非常熟悉 Microsoft SQL Server 数据库管理系统及其服务器工具、客户端工具以及常见的开发环境。
思考片刻;如果有一个基于网络的 SQL Server 管理工具,开发人员可以在其中执行数据库相关应用程序的所有基本常见任务,我认为这可能对我们所有人都有益。本文的目的是与您分享如何创建一个 ASP.NET SQL Server 管理工具。本文旨在为您提供一个整体概念,说明如何直接访问 SQL Server 数据库对象,以及如何处理表、视图、存储过程等对象。
2. ASP.NET SQL Server 管理器
此应用程序是一个基于网络的 SQL Server 管理工具。它将为您提供一些灵活性来处理各种数据库对象。它允许您快速显示特定数据库的任何表/视图数据。您将享受使用视图、存储过程和函数的乐趣。
总之,ASP.NET SQL Server 管理器将为您提供一个基于网络的 SQL Server 管理工具的整体概念。
3. 特性
正如我们之前简要讨论过的,它是一个管理工具,所以我尝试包含通用应用程序开发所需的所有基本特性。下面列出了一些特性:
- 本地和远程环境
- 处理对象
- 表格
- 视图
- 存储过程
- 用户定义函数
它将方便您自动生成 SQL 脚本,例如视图、存储过程、函数等。您还可以创建、更改或删除任何数据库对象以及更多功能......
3.1 本地和远程环境
当您使用 Microsoft SQL Server 客户端工具时,您必须注册数据库服务器才能工作。环境可以是局域网 (LAN),也可以是远程/互联网。Microsoft SQL Server 内部管理本地或远程环境中的注册过程和连接。
在本文中,我展示了如何同时在局域网 (LAN) 和远程/互联网环境中连接到数据库服务器。
图 - (1). 登录到 Microsoft SQL Server (本地/远程) 环境。
3.2 处理对象
正如我们之前讨论过的,您可以像在 Microsoft SQL Server 客户端工具中一样处理任何数据库对象。在这里,我尝试向您演示如何轻松获取 SQL Server 数据库对象,以及如何处理对象,例如执行基本的数据库操作活动、执行自定义 Transact-SQL 语句等。
让我们考虑这个场景。出于任何目的,您从特定数据库中选择一个对象,例如视图、存储过程等...此应用程序将自动生成 Transact-SQL 语句,并允许您执行基本操作,例如创建/更改/删除对象等。您将在“理解和使用代码”部分获得更多详细信息。
3.2.1 表
每个关系数据库管理系统 (RDBMS) 的基础是一个名为表的数据库对象。每个数据库由一个或多个表组成,这些表存储数据库的数据或信息或记录。每个表都有其唯一的名称,并由列和行组成。
表的基本任务包括创建、更改和删除。此应用程序允许您执行所有这些任务。下面给出了创建、更改和删除表的 Transact-SQL 语法:
图 - (2). 处理 TABLE 对象。
创建表语法
CREATE TABLE
[ database_name.[ owner ] . | owner. ] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > } [ ,...n ]
)
[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
更多信息请访问此链接。
更改表语法
ALTER TABLE table_name
ALTER COLUMN column_name
{
type_name[({precision[.scale]})][NULL|NOT NULL]
{DROP DEFAULT
| SET DEFAULT constant_expression
| IDENTITY [ ( seed , increment ) ]
}
| ADD
{ < column_definition > | < table_constraint > } [ ,...n ]
| DROP
{ [ CONSTRAINT ] constraint_name
| COLUMN column }
] }
更多信息请访问此链接。
删除表语法
DROP TABLE [ database_name . [ schema_name ] . | schema_name . ]
table_name [ ,...n ] [ ; ]
更多信息请访问此链接。
3.2.2 视图
在 SQL Server 中,视图是存储在数据库中的预写查询。视图由 SELECT 语句组成,当您运行视图时,您会看到它的结果,就像打开表一样。有些人喜欢将视图视为虚拟表。这是因为视图可以将来自多个表的数据以及聚合数据汇集在一起,并将其呈现为单个表。
此应用程序允许您执行 SQL Server 视图对象的所有基本任务,例如创建、更改和删除。下面给出了创建、更改和删除视图的 Transact-SQL 语法。
图 - (3). 处理 VIEW 对象。
创建视图
创建一个虚拟表,以另一种方式表示一个或多个表中的数据。CREATE VIEW 必须是查询批处理中的第一个语句。
语法
CREATE VIEW [< owner > . ] view_name [ ( column [ ,...n ] ) ]
[ WITH < view_attribute > [ ,...n ] ]
AS
select_statement
[ WITH CHECK OPTION ]
更多信息请访问此链接。
更改视图
ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ] [ ; ]
更多信息请访问此链接。
删除视图
DROP VIEW [ schema_name . ] view_name [ ...,n ] [ ; ]
更多信息请访问此链接。
3.2.3 存储过程
几个月前,我在 codeproject.com 上写了一篇关于 SQL Server 存储过程基本概述的文章。我建议您阅读此链接的文章。
3.2.4 用户定义函数
Microsoft SQL Server 将函数分为两种类型:
- 标量值函数
- 表值函数
标量值函数
标量用户定义函数返回标量数据类型之一。不支持 text、ntext、image 和 timestamp 数据类型。这些是大多数开发人员在其他编程语言中习惯使用的用户定义函数类型。
表值函数
内联表值用户定义函数返回表数据类型,是视图的绝佳替代方案,因为用户定义函数可以将参数传递到 T-SQL select 命令中,本质上为我们提供了底层表的参数化、不可更新视图。
图 - (5). 处理函数对象。
更多信息请访问此链接。
4. 理解和使用代码
这不是一项复杂的任务,因为它具有出色的功能和 Microsoft 产品的灵活性,所以实现起来非常容易。Microsoft SQL Server 允许我们集成/使用它来创建自定义应用程序。我认为对于对 Microsoft SQL Server 和 Microsoft C#.Net 语言有基本了解的开发人员来说,这应该不是问题。
那么让我们开始了解它是如何实际工作的。
4.1 登录到 SQL Server
Microsoft .NET 框架为我们提供了大量的命名空间和各种类,以简单的方式完成复杂的任务。每个人都必须同意 .NET 框架的灵活性和全面的特性。
在此应用程序中,我使用 sqlclient 打开新连接。让我们回到登录过程。在这里,我尝试展示本地和远程环境。当您在本地环境中工作时,您无需提供端口地址。您只需提供服务器 IP、登录 ID 和密码。应用程序将执行自动检查操作,通过用 32 位数据 ping 服务器来检查提供的数据库服务器地址是否有效。下面给出了一个简单的代码示例。
示例 - 1 (Ping 数据库服务器)
public bool IsSqlSeverExist(string strServerIP)
{
bool Result = false;
try
{
if (strServerIP != "")
{
Ping ObjRequestFrom = new Ping();
PingOptions ObjPingOptions = new PingOptions();
PingReply ObjPingReply;
string strBuffer = "Test";
byte[] bytBuffer = Encoding.ASCII.GetBytes(strBuffer);
int intTimeOut = 60;
ObjPingOptions.DontFragment = true;
ObjPingReply = ObjRequestFrom.Send(strServerIP, intTimeOut, bytBuffer, ObjPingOptions);
if (ObjPingReply.Status.Equals(IPStatus.Success))
Result = true;
else Result = false;
}
}
catch (Exception ex)
{
Result = false;
throw ex;
}
return Result;
}
示例 - 2 (登录到数据库服务器)
protected void ButtonLogin_Click(object sender, EventArgs e)
{
DAL.Interface.IFacade ObjFacade;
ObjFacade = new DAL.ClsSQLHelper();
Tools.IFacade ObjTools;
ObjTools = new Tools.ClsTools();
this.ImageLoading.Visible = true;
if (this.GetEnvironment() == "local")
{
if (ObjTools.IsSqlSeverExist(this.TextBoxServerIP.Text.ToString()))
{
if (ObjFacade.ExamineConnection(
ObjTools.DefaultConnectionString(this.TextBoxServerIP.Text
, this.TextBoxRemotePort.Text
, this.TextBoxUserName.Text
, this.TextBoxPassword.Text)))
{
this.setLoginInfo();
this.LabelStatus.Text = "Connecting to the local server.";
Server.Transfer("~/Default.aspx", true);
}
else
{
this.LabelStatus.Text = "SQL server ["
+ this.TextBoxServerIP.Text.ToString()
+ "] deny the request of the user [" + this.TextBoxUserName.Text + "].";
}
}
else
{
this.LabelStatus.Text = "SQL server ["
+ this.TextBoxServerIP.Text.ToString()
+ "] does not exist.";
}
}
else
{
if (ObjFacade.ExamineConnection(
ObjTools.DefaultConnectionString(this.TextBoxServerIP.Text
, this.TextBoxRemotePort.Text
, this.TextBoxUserName.Text
, this.TextBoxPassword.Text)))
{
this.setLoginInfo();
this.LabelStatus.Text = "Connecting to the remote server.";
Server.Transfer("~/Default.aspx", true);
}
else
{
this.LabelStatus.Text = "SQL server ["
+ this.TextBoxServerIP.Text.ToString()
+ "] deny the request of the user [" + this.TextBoxUserName.Text + "].";
}
}
}
4.2 生成对象树
在此应用程序中,我考虑了 Microsoft SQL Server 的主要四个数据库对象。它们如下:
- 表
- 视图
- 存储过程
- 函数

图 - (6). 数据库对象浏览器。
下面给出了一个对象树生成代码示例:
#region "Generate SQL Server Object Hierarchy"
private void PopulateRootTree()
{
DAL.Interface.IFacade ObjFacade;
ObjFacade = new DAL.ClsSQLHelper();
Tools.IFacade ObjTools;
ObjTools = new Tools.ClsTools();
string strSQL = "exec sp_databases";
string strDBNodeCaption = null;
string strTables = null;
string strViews = null;
string strStoredProcedure = null;
string strFunctions = null;
string strOwner = null;
string strObjuri = null;
string strConnectionString = null;
DataSet ObjNode;
DataSet ObjTables;
DataSet ObjViews;
DataSet ObjStoredProcedure;
DataSet ObjFunctions;
try
{
ObjNode = (ObjFacade.GetRecordSet(
ObjTools.DefaultConnectionString(ObjGlobal.ServerIP
, ObjGlobal.Port
, ObjGlobal.LoginID
, ObjGlobal.Password)
, strSQL));
TreeNode treeNodeRoot = new TreeNode(ObjGlobal.ServerIP + " " + ObjGlobal.Port, "S", "~/App_Themes/SQL/Images/DBServer.png", "Default.aspx", "");
this.tvSQLServer.Nodes.Add(treeNodeRoot);
TreeNode treeNodeBranches = new TreeNode("Database", "C", "~/App_Themes/SQL/Images/Folder.png", "Default.aspx", "");
treeNodeRoot.ChildNodes.Add(treeNodeBranches);
int intCounter = 0;
foreach (DataRow ObjDBDataRow in ObjNode.Tables[0].Rows)
{
strDBNodeCaption = Convert.ToString(ObjNode.Tables[0].Rows[intCounter][0]);
TreeNode treeNodeBranchesLeaf_01 = new TreeNode(strDBNodeCaption, "D", "~/App_Themes/SQL/Images/dbObj.png", "", "");
treeNodeBranches.ChildNodes.Add(treeNodeBranchesLeaf_01);
#region "Common Sql nodes "
TreeNode treeNodeBranchesLeaf_02 = new TreeNode("Tables", "T", "~/App_Themes/SQL/Images/dbfiles.png", "", "");
treeNodeBranchesLeaf_01.ChildNodes.Add(treeNodeBranchesLeaf_02);
#region "Get tables"
strSQL = "SELECT * FROM "
+ strDBNodeCaption
+ ".INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE <> 'VIEW' ";
ObjTables = new DataSet();
strConnectionString = ObjTools.FormatConnectionString(ObjGlobal.ServerIP
, ObjGlobal.Port
, strDBNodeCaption
, ObjGlobal.LoginID
, ObjGlobal.Password);
ObjTables = (ObjFacade.GetRecordSet(strConnectionString, strSQL));
if (ObjTables.Tables[0].Rows.Count != 0)
{
int intTableCounter = 0;
foreach (DataRow ObjTableDataRow in ObjTables.Tables[0].Rows)
{
strOwner = Convert.ToString(ObjTables.Tables[0].Rows[intTableCounter][1]);
strTables = Convert.ToString(ObjTables.Tables[0].Rows[intTableCounter][2]);
strObjuri = "~/Pages/SqlEditor.aspx?ObjType=0&db=" + strDBNodeCaption + "&dbObj=" + strTables ;
TreeNode treeNodeBranchesLeaf_020 = new TreeNode(strOwner + "." + strTables, "T", "~/App_Themes/SQL/Images/Tables.png", strObjuri, "");
treeNodeBranchesLeaf_02.ChildNodes.Add(treeNodeBranchesLeaf_020);
intTableCounter++;
}
ObjTables.Dispose();
ObjTables = null;
strOwner = null;
strTables = null;
strConnectionString = null;
}
#endregion
#region "Get views"
TreeNode treeNodeBranchesLeaf_03 = new TreeNode("Views", "V", "~/App_Themes/SQL/Images/dbfiles.png", "", "");
treeNodeBranchesLeaf_01.ChildNodes.Add(treeNodeBranchesLeaf_03);
strSQL = "SELECT * FROM "
+ strDBNodeCaption
+ ".INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE <> 'BASE TABLE'";
ObjViews = new DataSet();
strConnectionString = ObjTools.FormatConnectionString(ObjGlobal.ServerIP
, ObjGlobal.Port
, strDBNodeCaption
, ObjGlobal.LoginID
, ObjGlobal.Password);
ObjViews = (ObjFacade.GetRecordSet(strConnectionString, strSQL));
if (ObjViews.Tables[0].Rows.Count != 0)
{
int intViewsCounter = 0;
foreach (DataRow ObjViewsDataRow in ObjViews.Tables[0].Rows)
{
strOwner = Convert.ToString(ObjViews.Tables[0].Rows[intViewsCounter][1]);
strViews = Convert.ToString(ObjViews.Tables[0].Rows[intViewsCounter][2]);
strObjuri = "~/Pages/SqlEditor.aspx?ObjType=1&db=" + strDBNodeCaption + "&dbObj=" + strViews;
TreeNode treeNodeBranchesLeaf_020 = new TreeNode(strOwner + "." + strViews, "T", "~/App_Themes/SQL/Images/vw.png", strObjuri, "");
treeNodeBranchesLeaf_03.ChildNodes.Add(treeNodeBranchesLeaf_020);
intViewsCounter++;
}
ObjViews.Dispose();
ObjViews = null;
strOwner = null;
strViews = null;
strConnectionString = null;
}
#endregion
TreeNode treeNodeBranchesLeaf_04 = new TreeNode("Programmability", "P", "~/App_Themes/SQL/Images/dbfiles.png", "", "");
treeNodeBranchesLeaf_01.ChildNodes.Add(treeNodeBranchesLeaf_04);
#region "Get Stored Procedures"
TreeNode treeNodeBranchesLeaf_05 = new TreeNode("Stored Procedures", "S", "~/App_Themes/SQL/Images/dbfiles.png", "", "");
treeNodeBranchesLeaf_04.ChildNodes.Add(treeNodeBranchesLeaf_05);
strSQL = "SELECT * FROM "
+ strDBNodeCaption
+ ".INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE='PROCEDURE'";
ObjStoredProcedure = new DataSet();
strConnectionString = ObjTools.FormatConnectionString(ObjGlobal.ServerIP
, ObjGlobal.Port
, strDBNodeCaption
, ObjGlobal.LoginID
, ObjGlobal.Password);
ObjStoredProcedure = (ObjFacade.GetRecordSet(strConnectionString, strSQL));
if (ObjStoredProcedure.Tables[0].Rows.Count != 0)
{
int intStoredProcedureCounter = 0;
foreach (DataRow ObjStoredProcedureDataRow in ObjStoredProcedure.Tables[0].Rows)
{
strOwner = Convert.ToString(ObjStoredProcedure.Tables[0].Rows[intStoredProcedureCounter][1]);
strStoredProcedure = Convert.ToString(ObjStoredProcedure.Tables[0].Rows[intStoredProcedureCounter][2]);
strObjuri = "~/Pages/SqlEditor.aspx?ObjType=2&db=" + strDBNodeCaption + "&dbObj=" + strStoredProcedure;
TreeNode treeNodeBranchesLeaf_020 = new TreeNode(strOwner + "." + strStoredProcedure, "T", "~/App_Themes/SQL/Images/sp.png", strObjuri, "");
treeNodeBranchesLeaf_05.ChildNodes.Add(treeNodeBranchesLeaf_020);
intStoredProcedureCounter++;
}
ObjStoredProcedure.Dispose();
ObjStoredProcedure = null;
strOwner = null;
strStoredProcedure = null;
strConnectionString = null;
}
#endregion
#region "Get Functions"
TreeNode treeNodeBranchesLeaf_07 = new TreeNode("Functions", "S", "~/App_Themes/SQL/Images/dbfiles.png", "", "");
treeNodeBranchesLeaf_04.ChildNodes.Add(treeNodeBranchesLeaf_07);
strSQL = "SELECT * FROM "
+ strDBNodeCaption
+ ".INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE='FUNCTION'";
ObjFunctions = new DataSet();
strConnectionString = ObjTools.FormatConnectionString(ObjGlobal.ServerIP
, ObjGlobal.Port
, strDBNodeCaption
, ObjGlobal.LoginID
, ObjGlobal.Password);
ObjFunctions = (ObjFacade.GetRecordSet(strConnectionString, strSQL));
if (ObjFunctions.Tables[0].Rows.Count != 0)
{
int intFunctionsCounter = 0;
foreach (DataRow ObjFunctionsDataRow in ObjFunctions.Tables[0].Rows)
{
strOwner = Convert.ToString(ObjFunctions.Tables[0].Rows[intFunctionsCounter][1]);
strFunctions = Convert.ToString(ObjFunctions.Tables[0].Rows[intFunctionsCounter][2]);
strObjuri = "~/Pages/SqlEditor.aspx?ObjType=3&db=" + strDBNodeCaption + "&dbObj=" + strFunctions;
TreeNode treeNodeBranchesLeaf_020 = new TreeNode(strOwner + "." + strFunctions, "F", "~/App_Themes/SQL/Images/Function.png", strObjuri, "");
treeNodeBranchesLeaf_07.ChildNodes.Add(treeNodeBranchesLeaf_020);
intFunctionsCounter++;
}
ObjFunctions.Dispose();
ObjFunctions = null;
strOwner = null;
strFunctions = null;
strConnectionString = null;
}
#endregion
intCounter++;
}
#endregion
TreeNode treeNodeHelp = new TreeNode("Help", "H", "~/App_Themes/SQL/Images/Help.png", "Help.aspx", "");
treeNodeRoot.ChildNodes.Add(treeNodeHelp);
}
catch (Exception ex)
{
ObjNode = null;
MessageBox.Show(ex.Message.ToString());
}
}
private bool SetProperties()
{
HttpCookie ObjCookie = new HttpCookie("LastVisit");
bool Result = false;
try
{
if (Request.Cookies["LastVisit"] == null)
{
ObjCookie.Value = DateTime.Now.ToString();
ObjCookie.Expires = DateTime.Now.AddMonths(1);
Response.Cookies.Add(ObjCookie);
}
if (Request.Cookies["LastVisit"] != null)
{
UserNameLabel.Text = "Welcome, " + Session["LoginID"].ToString();
LabelLastVisit.Text = "Last Visit :" + Server.HtmlEncode(Request.Cookies["LastVisit"].Value);
Response.Cookies["LastVisit"].Value = DateTime.Now.ToString();
Response.Cookies["LastVisit"].Expires = DateTime.Now.AddMonths(1);
}
ObjGlobal.ServerIP = Convert.ToString(Session["ServerIP"]);
ObjGlobal.Port = Convert.ToString(Session["RemotePort"]);
ObjGlobal.NTSecurity = Convert.ToString(Session["NT"]);
ObjGlobal.LoginID = Convert.ToString(Session["LoginID"]);
ObjGlobal.Password = Convert.ToString(Session["Password"]);
Result = true;
}
catch (Exception ex)
{
Result = false;
MessageBox.Show(ex.Message);
}
return Result;
}
#endregion
4.3 生成 Transact-SQL
当您选择视图、存储过程甚至函数时,此应用程序会为您生成 SQL 脚本以进行进一步修改。下面是一个示例代码。
private void GetCurrentObjScript()
{
string strScript = null;
Tools.IFacade ObjTools;
ObjTools = new Tools.ClsTools();
DAL.Interface.IFacade ObjFacade;
ObjFacade = new DAL.ClsSQLHelper();
strConnectionString = ObjTools.FormatConnectionString(ObjGlobal.ServerIP
, ObjGlobal.Port
, ObjGlobal.Database
, ObjGlobal.LoginID
, ObjGlobal.Password);
strScript = ObjFacade.GetScript(strConnectionString, ObjGlobal.SqlObject, 1);
this.TextBoxScript.Text = strScript;
}
4.4 显示数据
我使用了一个简单的网格视图控件来显示您所选对象的数据。实际上,当您从特定数据库中选择表或视图时,它将显示数据。下面是一个示例代码。
private void LoadDataObjType01()
{
int intObjType = 0;
string strSQL = null;
intObjType = ObjGlobal.SqlObjectType;
DAL.Interface.IFacade ObjFacade;
ObjFacade = new DAL.ClsSQLHelper();
Tools.IFacade ObjTools;
ObjTools = new Tools.ClsTools();
DataSet ObjDataSet = new DataSet();
if (intObjType == 0 || intObjType == 1)
{
this.GetCurrentObjScript();
strSQL = "SELECT * FROM " + ObjGlobal.SqlObject;
strConnectionString = ObjTools.FormatConnectionString(ObjGlobal.ServerIP
, ObjGlobal.Port
, ObjGlobal.Database
, ObjGlobal.LoginID
, ObjGlobal.Password);
ObjDataSet = ObjFacade.GetRecordSet(strConnectionString, strSQL);
this.GridViewSqlObject.DataSource = ObjDataSet;
this.GridViewSqlObject.DataBind();
this.GridViewSqlObject.Dispose();
}
else if (intObjType == 2 || intObjType == 3)
{
this.GetCurrentObjScript();
}
}
5. SQL 查询编辑器
此功能尚未包含在此版本中……我希望尽快添加此功能。
6. 应用程序架构
我尝试为此应用程序遵循 n 层架构。在这里我创建了三层
- 数据访问层
- 接口
- 工具
下面给出了每一层的类图。
数据访问层
接口
工具
7. 参考
8. 总结
我希望本文对您有所帮助。 祝您愉快!
9. 历史
- 2009 年 9 月 14 日:初次发布。