基于.NET技术实现SQL Server数据库的通用维护

2014-02-25 04:31张捍卫余升
电脑知识与技术 2014年1期
关键词:数据库

张捍卫 余升

摘要:在开发Web应用程序时,经常要对数据库进行访问,实现对数据的增加、删除、修改等操作。这一系列操作代码是烦琐的,而且每次对数据库操作都要重复编写这些代码。该文介绍了运用.NET技术和数据库技术编写通用代码,用较短的程序代替通常需要重复书写的大量程序段,减少了数据库维护的工作量,提高了项目开发的效率。

关键词:.NET技术;数据库;通用维护

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2014)01-0014-02

在SQL Server数据库系统开发中,经常要处理多个数据表,对于这些数据表一般都需要编写程序,实现数据的添加、修改和删除等维护操作。这些操作方法步骤相同,不同的只是表的名称、字段名称和数据类型等,但每次需要重复的编写这些代码,导致程序不能适应用户需求的变化,缺乏灵活性,对数据库结构调整的适应能力不强,进而影响到项目开发的效率、进度和开发质量。该文介绍的数据库通用维护操作模块在Visual Studio .NET环境下实现,为解决多数据表的通用维护操作提供了一个较好的解决方案,并通过一系列的测试与应用,证明这种方案具有一定的实用价值。

1 实现思想

在SQL Server数据库中,对数据库的维护操作是通过结构化查询语言SQL进行的。添加记录是由Insert语句完成的,其基本的形式为:Insert Into 表名 (字段名列表) Values (值列表);修改记录语句是:Update 表名 set 修正式列表 where 条件;删除记录的语句是:Delete from 表名 where 条件。可以看出,把表名、字段名或字段的值传递给维护记录的方法,就能实现数据的通用维护操作。

维护记录的方法就是利用传递过来的参数,自动获取字段信息,生成SQL语句,完成相应的操作。字段信息的获取可以通过SQL Server提供的系统视图来实现,INFORMATION_SCHEMA.COLUMNS系统视图,就存有当前数据库中用户可以访问的所有数据表的字段信息,其中的部分信息如表1所示。在设计时,只要知道要访问的数据表名称,就能获得该表的结构信息。

表1 系统视图information_schema.columns部分字段信息

[字段名\&字段类型\&说明\&TABLE_NAME\&nvarchar(128)\&表的名称\&COLUMN_NAME\&nvarchar(128)\&表中字段名称\&DATA_TYPE\&nvarchar(128)\&表中字段数据类型\&CHARACTER_MAXIMUM_LENGTH\∫\&字符型字段最大字符数\&COLUMN_DEFAULT\&nvarchar(4000)\&字段缺省值\&]

2 实现方法

2.1 传递字段

传递字段主要是字段名及字段值的传递,可以采用二维字符串数组,也可以使用Hash表来实现。Hash表,也叫散列表,表示键/值对的集合,是根据关键词/值(Key,value)直接进行访问的数据结构。使用Hash表的一个优点是关键词不允许重复,这样可以避免书写失误造成字段名重复的问题。在数据增加页面中,将要操作的数据表的字段名以及相对应的字段值,添加到Hash表中,然后在调用增加记录的方法时作为实参传递过去。

定义Hash表对象:Hashtable hash = new Hashtable();

向Hash表中添加元素的方法:hash.Add("字段名", "字段值");

调用增加记录的方法:由于dbAdd(string, Hashtable)被定义成类的静态方法,所以调用语句的形式为:

类名.dbAdd("表名", hash);

2.2 连接数据库

从Web.Config配置文件中获取数据库连接字符串,创建SqlConnection对象,并返回该对象。

Public static SqlConnection conn()

{ string strConn =ConfigurationManager.ConnectionStrings["SQLConnectionString"].ToString();

SqlConnection con = new SqlConnection(strConn); return con; }

2.3 获取字段信息

下述代码是获取字段的信息,方法中有两个参数,tablename是数据表名,columnName是字段名。执行时,从information_schema.columns视图中获取数据表指定字段的信息,并将获取的结果保存在SqlDataReader对象dr中,并返回dr。

private static SqlDataReader getColummTypeAndLength(string tablename, string columnName)

{ SqlConnection con = conn();//創建连接

string cmdText = "Select * from information_schema.columns where TABLE_NAME=@Table_Name and COLUMN_NAME=@Column_Name";

SqlCommand cmd = new SqlCommand(cmdText, con); //创建SqlCommand

//创建参数并赋值

cmd.Parameters.Add("@Table_Name", SqlDbType.NVarChar, 128);

cmd.Parameters.Add("@Column_Name", SqlDbType.NVarChar, 128);

cmd.Parameters[0].Value = tablename; cmd.Parameters[1].Value = columnName;

SqlDataReader dr; //定义SqlDataReader

con.Open(); //打开连接

dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); //执行并关闭对象

return dr; }

2.4 添加记录

添加记录方法dbAdd(string tablename, Hashtable hashTable)是将记录添加到数据库中,该方法有两个参数,tablename是数据表名, hashTable是Hash表对象,即保存有字段名及值的集合。方法中还定义了两个字符串变量:sql1, sql2 分别存放字段名列表和字段值参数列表。运行时从Hash表中依次循环,每次取出一个元素后,调用getColummTypeAndLength(string tablename, string columnName)方法,获取字段的类型及长度等,形成字段列表、字段值参数列表,以及参数类型的定义和参数值的设置,最终形成插入记录的SQL语句后,打开数据库连接,执行添加操作。如果操作成功,返回大于0的值,否则返回-1。

public static int dbAdd(string tablename, Hashtable hashTable)

{ SqlConnection con = conn();//创建连接

SqlCommand cmd = new SqlCommand();

string sql1 = "", sql2 = "";

foreach (DictionaryEntry entry in hashTable)

{ SqlDataReader dr = getColummTypeAndLength(tablename, entry.Key.ToString());

if (dr != null) {

string colName = entry.Key.ToString();

string colParaName = "@" + entry.Key.ToString();

sql1 += colName + ","; sql2 += colParaName + ","; //生成字段名和值列表

if (dr.Read()) { //设置参数类型及参数值

switch (dr["DATA_TYPE"].ToString()){

case "varchar":

int col_len=int.Parse(dr["CHARACTER_MAXIMUM_LENGTH"].ToString());

cmd.Parameters.Add(new SqlParameter(colParaName, SqlDbType.VarChar,col_len ));

cmd.Parameters[colParaName].Value = entry.Value.ToString(); break;

case "int":

cmd.Parameters.Add(new SqlParameter(colParaName, SqlDbType.Int)); (下轉第19页)

(上接第15页)

cmd.Parameters[colParaName].Value = int.Parse(entry.Value.ToString()); break;

//由于篇幅所限,添加其它字段类型参数这里省略 }}

dr.Close(); }}

sql1 = sql1.Substring(0, sql1.Length - 1); //去掉字段名最后的逗号

sql2 = sql2.Substring(0, sql2.Length - 1); //去掉参数最后的逗号

cmd.CommandText = "Insert Into "+tablename+ " ("+sql1 + ") Values (" + sql2+")";

cmd.Connection = con; int result = -1; con.Open();

result = cmd.ExecuteNonQuery(); con.Close(); return result;}

2.5 添加引用

在编写代码过程中,由于使用了数据库、Hash表和Web配置文件,所以除系统默认的命名空间外,还要引入System.Data.SqlClient、System.Collections和System.Configuration命名空间。

3 结束语

上述介绍的是数据添加的实现过程,修改记录的方法与此类似,删除记录则相对简单,只要理解了该方法的实现过程,一定能完成修改和删除记录的操作。实践证明,该数据库通用维护代码的使用,实现了在各种表上进行插入、删除和更新数据操作,对于项目开发效率,程序代码复用性、开发质量等都会得到极大的提高。

参考文献:

[1] 张彦.利用ASP技术实现数据库的通用维护[J].福建电脑,2003(3):37.

[2] 王缓缓,李虎.使用设计模式构建基于.NET的通用数据库访问层[J].计算机与现代化,2005,113(1):29-32.

[3] 李万宝.ASP.NET企业级开发案例精解(C#)[M].北京:中国林业出版社,2005.

猜你喜欢
数据库
本刊加入数据库的声明
数据库
数据库
数据库
两种新的非确定数据库上的Top-K查询
数据库
数据库
数据库
数据库
数据库