(转Csdn)开发了一个系统,使用了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

posted on 2005-07-15 18:09  肥仔鱼  阅读(1595)  评论(4编辑  收藏  举报