张捍卫 余升
摘要:在开发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.