zoukankan      html  css  js  c++  java
  • 表扩展字段设计

    扩展字段主要是针对那些有不固定列的表,而且这些列不是系统运行所必须的。当一个系统或产品已经上线后,不需要修改原来的代码就可以满足客户增加字段的需求。
    例如产品表在用户A里需要用到产地这个字段,在用户B里需要条形码这个字段,而这两个或更多的字段在原来的系统设计时并没考虑进去,这时就需要扩展字段。

    首先需要建一张扩展字段映射表

    View Code
    CREATE TABLE [dbo].[ExColumnMapping](
    [RowID] [int] IDENTITY(1,1) NOT NULL,
    [TableName] [nvarchar](50) NULL,
    [ColumnName] [nvarchar](50) NULL,
    [MappingName] [nvarchar](50) NULL,
    [InputType] [nvarchar](50) NULL,
    [Remark] [nvarchar](200) NULL,
    [EnableStatus] [int] NULL
    CONSTRAINT [PK_ExColumnMapping] PRIMARY KEY CLUSTERED
    (
    [RowID] ASC
    )
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    )
    ON [PRIMARY]

    2条存储过程

    View Code
    create PROCEDURE [dbo].[GetNewMappingName]
    @TableName nvarchar(50)
    AS
    BEGIN
    SELECT top 1 name
    FROM syscolumns
    WHERE substring(name,1,3)='Col' and
    id
    = (SELECT top 1 id
    FROM sysobjects
    WHERE name = @TableName order by id)
    and name not in
    (
    select MappingName from ExColumnMapping where TableName = @TableName)
    END
    Create PROCEDURE [dbo].[IsExColExist]
     @TableName nvarchar(50),
     @ColumnName nvarchar(50)
    AS
    BEGIN
     select * from ExColumnMapping
              where TableName = @TableName
              and ColumnName = @ColumnName
    END

    同时在产品表增加一些备用列 Col1,Col2,Col3.。。。。。。。。

    建一个管理扩展字段表的页面:

    View Code
    <table class="innerform">
    <tr>
    <th width="20%">
    数据表:
    </th>
    <td>
    <select id="sltTableName" runat="server" >
    <option value="Customer">客户表</option>
    </select>
    <asp:Label ID="txtTableName" runat="server" ReadOnly="true" MaxLength="20"></asp:Label>
    <asp:Label ID="Label1" runat="server" Text="*" ForeColor="Red"></asp:Label>
    </td>
    </tr>
    <tr>
    <th>
    字段名:
    </th>
    <td>
    <input id="txtColName" type="text" runat="Server" maxlength="20" />
    <asp:Label ID="lbCustName" runat="server" Text="*" ForeColor="Red"></asp:Label>
    </td>
    </tr>
    <tr>
    <th>
    输入类型:
    </th>
    <td>
    <select id="sltInputType" name="D3" runat="Server">
    <option value="文本框">文本框</option>
    <option value="下拉框">下拉框</option>
    <option value="日历">日历</option>
    </select>
    </td>
    <td>
    <input type="button" id="btnAddSourceData" onclick="SetSourceData()" value="源数据" />
    </td>
    <td>
    <input type="hidden" runat="server" id="hdSourceData" value="" />
    </td>
    </tr>
    <tr>
    <th>
    可见状态:
    </th>
    <td>
    <select id="sltEnable" name="D3" runat="Server">
    <option value="1">可见</option>
    <option value="2">不可见</option>
    </select>
    </td>
    </tr>
    <tr>
    <th>
    备注:
    </th>
    <td colspan="3">
    <textarea id="taRemark" name="S1" rows="5" runat="Server" maxlength="200" ></textarea>
    </td>
    </tr>
    </table>

    在产品管理页面加上<div id="divExCol" style="100%"  runat = "server"></div>


     

    View Code
    /// <summary>
    /// 动态生成扩展字段相关控件
    /// </summary>
    public static void AddExControl(HtmlGenericControl divExCol,List<ExColumnMappingItem> exCols)
    {
    foreach (ExColumnMappingItem exColItem in exCols)
    {
    Label lblExCol
    = new Label();
    lblExCol.Width
    = 130;
    lblExCol.Style.Add(HtmlTextWriterStyle.TextAlign,
    "right");
    lblExCol.Text
    = exColItem.ColumnName + "";
    divExCol.Controls.Add(lblExCol);
    switch (exColItem.InputType)
    {
    case "下拉框":
    DropDownList ddlExCol
    = new DropDownList();
    ddlExCol.ID
    = exColItem.MappingName;
    ddlExCol.Width
    = 300;
    ddlExCol.Items.Add(
    "");
    foreach (string data in exColItem.SourceData.Split(','))
    {
    ddlExCol.Items.Add(data);
    }
    divExCol.Controls.Add(ddlExCol);
    break;
    case "日历":
    TextBox txtDateExCol
    = new TextBox();
    txtDateExCol.ID
    = exColItem.MappingName;
    txtDateExCol.Width
    = 260;
    divExCol.Controls.Add(txtDateExCol);
    Button btnExCol
    = new Button();
    btnExCol.Text
    ="...";
    btnExCol.Height
    = 21;
    btnExCol.Width
    = 40;
    btnExCol.OnClientClick
    = "popUpCalendar(this, " + txtDateExCol.ClientID + ", 'mm/dd/yyyy',-1,-1,true);return false;";
    divExCol.Controls.Add(btnExCol);
    break;
    default:
    TextBox txtExCol
    = new TextBox();
    txtExCol.ID
    = exColItem.MappingName;
    txtExCol.Width
    = 300;
    divExCol.Controls.Add(txtExCol);
    break;
    }

    //换行
    divExCol.Controls.Add(new LiteralControl("<br>"));
    }
    divExCol.DataBind();
    }
    View Code
    /// <summary>
    /// 将原有数据绑定到扩展字段控件
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <param name="exCols"></param>
    /// <param name="divExCol"></param>
    public static void BindExColData<T>(T t, List<ExColumnMappingItem> exCols, HtmlGenericControl divExCol)
    {
    foreach (ExColumnMappingItem exColItem in exCols)
    {
    object exColValue = t.GetType().GetProperty(exColItem.MappingName).GetValue(t, null);
    string oldValue = exColValue == null ? "" : exColValue.ToString();
    switch (exColItem.InputType)
    {
    case "下拉框":
    DropDownList ddlExCol
    = (DropDownList)divExCol.FindControl(exColItem.MappingName);
    ddlExCol.Text
    = oldValue;
    break;
    default:
    TextBox txtExCol
    = (TextBox)divExCol.FindControl(exColItem.MappingName);
    txtExCol.Text
    = oldValue;
    break;
    }
    }
    }
    View Code
    /// <summary>
    /// 从文本框获取扩展字段值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <param name="exCols"></param>
    /// <param name="divExCol"></param>
    public static void GetExColData<T>(T t, List<ExColumnMappingItem> exCols, HtmlGenericControl divExCol)
    {
    foreach (ExColumnMappingItem exColItem in exCols)
    {
    switch (exColItem.InputType)
    {
    case "下拉框":
    DropDownList ddlExCol
    = (DropDownList)divExCol.FindControl(exColItem.MappingName);
    t.GetType().GetProperty(exColItem.MappingName).SetValue(t, ddlExCol.Text,
    null);
    break;
    default:
    TextBox txtExCol
    = (TextBox)divExCol.FindControl(exColItem.MappingName);
    t.GetType().GetProperty(exColItem.MappingName).SetValue(t, txtExCol.Text,
    null);
    break;
    }
    }
    }

  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/geass/p/2139232.html
Copyright © 2011-2022 走看看