我开发了一个系统,使用了UI(表示层)--WebService(业务逻辑层)--SqlServer(数据层)的架构,
我在WebService层做了很多个WebMethod,负责添加/删除数据以及获取记录集合,拿一个比较有代表性的WebMethod来说,函数定义是
boolean AddOrg(string Org_Name,string Org_Address,string Org_Tel)
{
/*.......................*/
}
由于系统刚刚开始实施,用户的需求也不是很明确,经常需要为某一个数据表增加新的字段,那么如果这样,我就需要在WebService层中增加一个输入参数,并且在表示层增加一个供用户输入的TextBox,然后修改调用的WebService方法,将这个TextBox中的值送过去,这样很麻烦,我想请问能不能有一种更能够适应用户需求的方法?有人能告诉我吗?
我的解决方法:
首先,在UI端我是这样写的:
private void button1_Click(object sender, System.EventArgs e)
{
System.Data.DataSet SiteSet=f_SiteManagement.Remote_Logical.GetSiteStru();
System.Data.DataRow SiteRow=SiteSet.Tables["u_Site_Info"].NewRow();
System.Data.DataTable SiteTable=SiteSet.Tables["u_Site_Info"];
SiteRow["SiteName"]=textBox1.Text.ToString();
SiteRow["SiteTypeID"]="3";
SiteRow["SiteAddress"]=textBox2.Text.ToString();
/*随表结构增多或者减少,不用更改其他代码*/
SiteRow["NewField"]="NewValue"
SiteRow["NewField"]="NewValue"
SiteRow["NewField"]="NewValue"
SiteRow["NewField"]="NewValue"
SiteRow["NewField"]="NewValue"
SiteRow["NewField"]="NewValue"
/*随表结构增多或者减少,不用更改其他代码*/
SiteTable.Rows.Add(SiteRow);
if(f_SiteManagement.Remote_Logical.AddSite(SiteSet.GetChanges())==1)
{
MessageBox.Show("添加成功!");
}
}
WebService端是这样写的:
public int AddSite(DataSet SiteSet)
{
SqlDataAdapter SiteAdap=new SqlDataAdapter();
SqlCommand SiteCommand=new SqlCommand("select * from u_Site_Info",c_Service_Scout.DBConn);
SiteAdap.SelectCommand=SiteCommand;
SqlCommandBuilder SiteBuilder=new SqlCommandBuilder(SiteAdap);
c_Service_Scout.DBConn.Open();
SiteAdap.Update(SiteSet,"u_Site_Info");
c_Service_Scout.DBConn.Close();
return 1;
}
public DataSet GetSiteStru()
{
c_Service_Scout.DBConn.Open();
DataSet sitelist =new DataSet("sitelist");
SqlCommand sitecomm=new SqlCommand("select top 1 * from u_site_info",c_Service_Scout.DBConn);
SqlDataAdapter siteadap=new SqlDataAdapter();
siteadap.SelectCommand=sitecomm;
siteadap.Fill(sitelist,"u_Site_Info");
c_Service_Scout.DBConn.Close();
sitecomm.Dispose();
siteadap.Dispose();
return sitelist;
}
原理是这样的,我在WebService端使用两个接口,一个为GetSiteStru,另一个为AddSite,
为了达到我尽量不更改其他代码的目的,我首先从WebService层获调用GetSiteStru取一个当前Site_Info表的表结构到本地的DataSet,然后在UI层为这个本地的DataSet声明一个结构相同的DataRow,所有的添加记录的操作在这里完成,之后统一将本地的DataSet送到WebService的AddSite结构使用Adapter进行更新
这样我每次添加新的字段的时候只需要直接在UI端的SiteRow直接为字段赋值就可以了,代码中已经写了一些NewField以及NewValue