在我们写程序的时候,特别是数据库应用程序的时候,经常会遇到这样的情况:对于一个给定的表,写出这个表对应的类(用一句时髦的话说是实现业务实体类),类的数据成员是所有的字段,并且类含有该表的添加修改删除等操作。还有,对于一个给定的存储过程,要完成根据存储过程存取数据或别的数据库操作。如下代码就是我们通常要完成的:
1.表的业务实体化
private int iId;
public int Id
{
get
{
return iId;
}
set
{
iId = value;
}
}
private string strName;
public string Name
{
get
{
return strName;
}
set
{
strName = value;
}
}
private string strCode;
public string Code
{
get
{
return strCode;
}
set
{
strCode = value;
}
}
private string strDescription;
public string Description
{
get
{
return strDescription;
}
set
{
strDescription = value;
}
}
private int iFatherid;
public int Fatherid
{
get
{
return iFatherid;
}
set
{
iFatherid = value;
}
}
private int iType;
public int Type
{
get
{
return iType;
}
set
{
iType = value;
}
}
private int iUserId;
public int UserId
{
get
{
return iUserId;
}
set
{
iUserId = value;
}
}
对表的增加、修改操作
public bool Add()
{
SqlConnection conn = SqlConn.Instance().Connection;
string strSql = "insert into book(id, Name, Code, Description, Fatherid, Type, UserId)"
+ "values(@id, @Name, @Code, @Description, @Fatherid, @Type, @UserId)";
SqlCommand command = new SqlCommand(strSql, conn);
command.Parameters.Add("@id", SqlDbType.Int);
command.Parameters["@id"].value = iId;
command.Parameters.Add("@Name", SqlDbType.NVarChar, 50);
if (strName != null)
command.Parameters["@Name"].value = strName;
else
command.Parameters["@Name"].value = DBNull.value;
command.Parameters.Add("@Code", SqlDbType.NVarChar, 255);
if (strCode != null)
command.Parameters["@Code"].value = strCode;
else
command.Parameters["@Code"].value = DBNull.value;
command.Parameters.Add("@Description", SqlDbType.NVarChar, 255);
if (strDescription != null)
command.Parameters["@Description"].value = strDescription;
else
command.Parameters["@Description"].value = DBNull.value;
command.Parameters.Add("@Fatherid", SqlDbType.Int);
command.Parameters["@Fatherid"].value = iFatherid;
command.Parameters.Add("@Type", SqlDbType.Int);
command.Parameters["@Type"].value = iType;
command.Parameters.Add("@UserId", SqlDbType.Int);
command.Parameters["@UserId"].value = iUserId;
try
{
conn.Open();
command.ExecuteNonQuery();
return true;
}
catch (Exception e)
{
throw (new Exception("Error in the Database" + e.Message));
}
finally
{
conn.Close();
}
}
public bool Modify()
{
SqlConnection conn = SqlConn.Instance().Connection;
string strSql = "update book set id = @id, Name = @Name, Code = @Code, Description = @Description, Fatherid = @Fatherid, Type = @Type, UserId = @UserId "
+ " where id =@id ";
SqlCommand command = new SqlCommand(strSql, conn);
command.Parameters.Add("@id", SqlDbType.Int);
command.Parameters["@id"].value = iId;
command.Parameters.Add("@Name", SqlDbType.NVarChar, 50);
command.Parameters["@Name"].value = strName;
command.Parameters.Add("@Code", SqlDbType.NVarChar, 255);
command.Parameters["@Code"].value = strCode;
command.Parameters.Add("@Description", SqlDbType.NVarChar, 255);
command.Parameters["@Description"].value = strDescription;
command.Parameters.Add("@Fatherid", SqlDbType.Int);
command.Parameters["@Fatherid"].value = iFatherid;
command.Parameters.Add("@Type", SqlDbType.Int);
command.Parameters["@Type"].value = iType;
command.Parameters.Add("@UserId", SqlDbType.Int);
command.Parameters["@UserId"].value = iUserId;
try
{
conn.Open();
command.ExecuteNonQuery();
return true;
}
catch (Exception e)
{
throw (new Exception("Error in the Database" + e.Message));
}
finally
{
conn.Close();
}
}
存储过程
public bool ExeSP_ddms_Modify_Trx(
int aiPrsn_trx_no,
int aiUlt_incid_no,
int aiPrsn_trx_status_cd,
DateTime adtTrx_cmpl_dt,
string astrEmail_addr)
{
SqlConnection conn = SqlConn.Instance().Connection;
string strSPName = "ddms_Modify_Trx";
SqlCommand command = new SqlCommand(strSPName, conn);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@prsn_trx_no", SqlDbType.SmallInt);
command.Parameters["@prsn_trx_no"].value = aiPrsn_trx_no;
command.Parameters.Add("@ult_incid_no", SqlDbType.Int);
command.Parameters["@ult_incid_no"].value = aiUlt_incid_no;
command.Parameters.Add("@prsn_trx_status_cd", SqlDbType.Int);
command.Parameters["@prsn_trx_status_cd"].value = aiPrsn_trx_status_cd;
command.Parameters.Add("@trx_cmpl_dt", SqlDbType.DateTime);
if (adtTrx_cmpl_dt != DateTime.Minvalue)
command.Parameters["@trx_cmpl_dt"].value = adtTrx_cmpl_dt;
else
command.Parameters["@trx_cmpl_dt"].value = DBNull.value;
command.Parameters.Add("@email_addr", SqlDbType.VarChar, 70);
if (astrEmail_addr != null)
command.Parameters["@email_addr"].value = astrEmail_addr;
else
command.Parameters["@email_addr"].value = DBNull.value;
try
{
conn.Open();
command.ExecuteNonQuery();
return true;
}
catch (Exception e)
{
throw (new Exception("Error in the Database" + e.Message));
}
finally
{
conn.Close();
}
}
上面处理表的代码也挺长的,但那只是7个字段,如果一个表含有二三十个字段的话,恐怕代码更长,同样,检查你写好的代码是否有错误也是一个痛苦的过程。
但是,写这些代码本身并没有多少难度,而且很多工作都是重复的,这就不能不启发我们通过一个程序来完成这些繁琐易出错的工作。
假如让我们来设计一个程序完成上面的代码,我们应该怎么做哪?
要完成上面的工作,我们首先应该找到我们要处理的表或存储过程。
我们也可以通过编程实现:
1.列出所有的数据库服务器
public static ArrayList GetServerList()
{
ArrayList alServers = new ArrayList();
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
try
{
SQLDMO.NameList serverList = sqlApp.ListAvailableSQLServers();
for (int i = 1; i <= serverList.Count; i++)
{
alServers.Add(serverList.Item(i));
}
}
catch (Exception e)
{
throw (new Exception("取数据库服务器列表出错:" + e.Message));
}
finally
{
sqlApp.Quit();
}
return alServers;
}
这样,所有的数据库服务器迷宫凝成都存在了ArrayList里,我们可以用一个下拉列表来列出所有的服务器,让用户选择他需要的一个。
2。得到选定服务器所有的数据库列表
要完成这个工作,我们需要用户输入这个数据库服务器的用户名和密码,代码如下:
public static ArrayList GetDbList(string strServerName, string strUserName, string strPwd)
{
ArrayList alDbs = new ArrayList();
SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass();
try
{
svr.Connect(strServerName, strUserName, strPwd);
foreach (SQLDMO.Database db in svr.Databases)
{
if (db.Name != null)
alDbs.Add(db.Name);
}
}
catch (Exception e)
{
throw (new Exception("连接数据库出错:" + e.Message));
}
finally
{
svr.DisConnect();
sqlApp.Quit();
}
return alDbs;
}
这样就得到了数据库的列表,你同样可以让用户选择一个数据库。
3。列出选定数据库所有的用户表和存储过程
在这一步我们不用SQLDMO了,我们通过读取选定数据库的sysobjects表中的记录实现,当然,完成这个工作需要如下信息:你选择的数据库服务器名,用户名,密码,数据库名等信息:
public static ArrayList GetTableList(string strServerName, string strDBName, string strUserName, string strPwd)
{
string strConStr = " data source=" + strServerName + ";initial catalog=" + strDBName +
";password=" + strPwd + ";persist security info=True;user id=" + strUserName;
SqlConnection conn = new SqlConnection(strConStr);
ArrayList alTbs = new ArrayList();
string strSql = "select * from sysobjects where (xtype='u' or xtype='p') and category<>2 order by name";
SqlCommand comm = new SqlCommand(strSql, conn);
SqlDataReader sr = null;
try
{
conn.Open();
sr = comm.ExecuteReader();
while (sr.Read())
{
string strName = sr["name"].ToString();
bool blTable = sr["xtype"].ToString().Trim().ToUpper() == "U" ? true : false;
TableInfo tb = new TableInfo(strName, blTable);
alTbs.Add(tb);
}
}
catch (Exception err)
{
throw (new Exception("取表明列表出错:" + err.Message));
}
finally
{
if (sr != null)
{
sr.Close();
sr = null;
}
conn.Close();
}
return alTbs;
}
这样我们就得到了所有的用户表和存储过程,注意这一句:
select * from sysobjects where (xtype='u' or xtype='p') and category<>2 order by name,这是关键的sql语句,其中xtype='u' 表示用户表,xtype='p'表示存储过程,category<>2表示不是系统存储过程。
下一步是取得选定表的所有字段或存储过程的所有参数
我们从表syscolumns取得我们想要到的东西:
strTableName = tbInfo.Name ;
string strSql = "select * from syscolumns where id=( " +
" select id from sysobjects where name='"+ strTableName + "')" ;
SqlDataAdapter sa = new SqlDataAdapter(strSql,conn) ;
DataSet ds = new DataSet() ;
sa.Fill(ds) ;
这样我们就把某个表(或存储过程)的所有字段信息放到了结果集ds里。