返回首页

{S0的}
{S}介绍
本教程的目的是提供一种手段,为每个开发人员根据预定义一个表的架构和预定的规则生成的屏幕。
这个代码生成的结果是使开发人员能够专注于创造,而不是代码的数据库结构。虽然网上有很多的接口或代码生成,他们每个人提供DLL和大多使用XML模式生成这些意见。
使用这个简单的教程,任何开发人员可以改变和更新/插入/删除代码中使用任何控制。一个可以改变任何可用的控制,如Telerik控制,甚至控制ASP.NET开发的内置在线控制。
,因此,本文将1 3个部分组成的教程的一部分,建立一个完整的CS类文件产生常见的INSERT / UPDATE / DELETE程序为每个表的意见。随后,我会添加这些教程提高类文件的功能。背景(事情要考虑/先决条件)
我使用Visual Studio 2010专业版。
我的开发环境和语言是C#。NET 4.0中。
我创建一个自定义的用户控件(希望扩展到一个全功能的DLL)。
我还利用我的数据库的SQL Server 2008 R2标准版。
注:一些TSQLs其他DBMLs支持,所以你可能想给Google不同的数据库正确的语法。
另一个先决条件是在web.config文件中的连接字符串

  <connectionStrings>

    <add name="DBASE" connectionString="Data Source=ARESHSAHARKHIZ;

     Initial Catalog=TABLENAME;Integrated Security=True"

     providerName="System.Data.SqlClient" />

  </connectionStrings>

记的名称quot; DBASEquot(不改变)。但是你可以改变初始目录到数据库中,你将要使用。使用代码
我通过代码之前,让我们的数据库中创建一个表:
右击数据库表的文件夹上创建一个表。
添加列和数据类型。哎呀,你需要遵循一些规则,使我们的管理员发电机代码可以按照这个:
{S2的}
,你必须遵循以下约定:尽可能确保所有的表正常化。确保你的表有关系。你会看到在数据库关系图"文件夹中,如果外键的定义和连接到主键。应包括表名前缀quot; tbl_quot;其次是他们的名字。例如:tbl_user主键应该始终是一个整数,与特定身份选项设置为true(删除和网格更新)主键应该包括1 quot; pk_quot;前缀表的名称和quot; _idquot;范例:pk_user_id(来自tbl_user),pk_inventory_id(从tbl_inventory)外键应该包括quot; fk_quot;前缀外国的表名和quot; _idquot;范例:fk_role_id(链接到tbl_role),fk_stock_id(链接到tbl_stock)如果列不须在管理视图显示,由quot; _non_quot添加列名;例如:userHash_non_,userSalt_non_对于一个datetime数据类型的所有列,添加一个quot; date_quot的;(可选的审计目的)的所有表应包括以下的列名
user_created为nvarchar(50)DATE_CREATED的datetime状态为nvarchar(50)命名为nvarchar(250)。用于外键引用的名称
{S3的}
创建您的表格后,你会发现在每列的属性,有属性称为quot; DESCRIPTIONquot。使用这个属性来为每一列添加有意义的描述。你可以看到从上面的图片,我已经放在描述为quot; namequot;列。现在的编码
首先,我需要一些TSQL语句,将得到我的数据库架构。
给我一个数据库的完整架构:{C}
让我在一个特定的模式或数据库的所有表:
private String Tables 

    { get { return "SELECT distinct TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS"; } }

返回所有的列名和表名称列中的数据类型:{体C3}
返回的列的说明,并给出列的名称和它的表:{的C4}
所以我们看到里面有什么数据库的。因为我们有关系,我们想一个外键是一个下拉列表,并使用主键的值项目属性和[名称]列作为文本项属性。{C5的}
这是它。我们有我们所需要的所有SQL语句。
注意:您会注意到,我使用字符串格式化建造这些语句,就容易注射。然而,有许多方法来克服这些。然而,为INSERT / UPDATE / DELETE的数据库,我构造SQL参数,以避免任何关于这部分的注射。连接
我们使用以下的私人静态方法获取和打开的每一笔交易的连接:{5233}
要动态创建控件,我们需要将这些控件中的一个占位符,在这里我们可以参考以后。我们总是知道这些控件将生成的列排序的基础上。因此,如果我们之前定义的用户名列名的密码,输出将文本框中的密码,然后文本框中的用户名。因此,你需要到数据库中的结构安排这个顺序。所以我将使用这个变量来保存这些控件。{C7-}控件
我们创建一些私有方法,将创建控件,将它们添加到控制人,并返回被添加到页的占位符,控制。
我们需要创建一个具体的一些控制每个数据类型。我将在这里使用Telerik控制。
注:Telerik控制,有一个数字的文本框。因此,对于任何十进制或int数据类型,程序生成一个数字的文本框。如果你正在使用其他控件。你可以改变一个TextBox或特殊控制。
所以我们需要一些控制:文本框的数据类型为nvarchar / VARCHARNumericTextbox为INT /双/浮充的DateTimePicker的日期/日期时间组合框的诠释外键Radbutton位为复选框
在ASP.NET控件的情况下,您将使用:文本框的数据类型为nvarchar / VARCHAR / INT /双/浮法/日期时间DropDownList的外键的诠释复选框为位{C8的}
按钮,创建一个保存按钮的处理程序。
(我将在本教程的下一组讨论SQL建设和参数。)
protected void SaveButton_Click(object sender, EventArgs e)

    {

        //SqlCommand com = new SqlCommand(constructSql());

        //com = AddParameters(com);

        //addRow(com);

        RadAjaxManager.GetCurrent(Page).Alert("The Information is Saved.");

    }

现在的最后一部分,我们需要扩大我们的类,使用UserControl类...{C10的}
...之后,我们需要重写CreateChildControls方法:{C11的}
以查询字符串的注意。我们正在寻找2个值,quot; tblquot确定表名和quot; modquot;决定操作的类型。这就是它。我们所有的设置。我们只需要构建的架构中使用的SQL语句,我们可以添加到任何页面,并运行它。{C12的}
该代码的最后一部分是生成基于列的数据类型或名称的看法。
/// <summary>

/// Generates specific output controls based on the column name 

/// </summary>

/// <param name="sc"></param>

/// <param name="ColumnName"></param>

/// <param name="TableName"></param>

/// <param name="lbl"></param>

private void ProduceOutput

    (ControlCollection sc, String ColumnName, String TableName, String lbl)

{

    String datatype = getDataType(TableName, ColumnName);

    

    if ((ColumnName.Contains("user_created") == true) ||

        (ColumnName.Contains("date_created") == true) ||

        (ColumnName.Contains("status") == true) ||

        (ColumnName.Contains("_non_") == true) ||

        (ColumnName.Contains("pk_") == true)

        )

    {}

    else

    {

        if (ColumnName.Contains("fk_"))

        {

            sc.Add(ComboBox(ColumnName, ColumnName, lbl));

            return;

        }

        if (ColumnName.Contains("date_"))

        {

            sc.Add(new LiteralControl(lbl));

            sc.Add(DatePick(ColumnName));

            return;

        }

        switch (datatype)

        {

            case "int":

            case "double":



            case "float":

            case "decimal":

                RadNumericTextBox i = intBox(ColumnName, lbl);

                sc.Add(i);

                break;

            case "bit":

                RadButton btn = Checkbox(ColumnName, lbl);

                sc.Add(btn);

                break;

            default:

                RadTextBox d = Textbox(ColumnName, ColumnName, lbl);

                sc.Add(d);

                break;

        }

        return;

    }

}

这是它。您可以更改数据类型的情况下,代表自己的控件或ASP.NET控制。创建一个动态的插入语句(使用字符串格式化)
,所以这是我如何使用字符串创建SQL INSERT语句。
private String constructSql()

    {

        String TableName = Request.QueryString["tbl"].ToString();

        String sql = "INSERT INTO " + TableName + " (";

        DataSet Columns = getColumns(TableName.ToString());

        int i = 0;

        foreach (DataRow c in Columns.Tables[0].Rows)

        {

            if (i > 0)

            {

                sql += c["COLUMN_NAME"].ToString() + ",";

            }

            i++;

        }

        sql += "ats) VALUES(";

        foreach (var textboxes in TextboxNames)

        {

            if (textboxes is RadTextBox)

            {

                RadTextBox txt = textboxes as RadTextBox;

                sql += "@" + txt.ID + ",";

                i--;

            }

            if (textboxes is RadNumericTextBox)

            {

                RadNumericTextBox txt = textboxes as RadNumericTextBox;

                sql += "@" + txt.ID + ",";

                i--;

            }

            if (textboxes is RadComboBox)

            {

                RadComboBox txt = textboxes as RadComboBox;

                sql += "@" + txt.ID + ",";

                i--;

            }

            if (textboxes is RadDateTimePicker)

            {

                RadDateTimePicker txt = textboxes as RadDateTimePicker;

                sql += "@" + txt.ID + ",";

                i--;

            }

            if (textboxes is RadButton)

            {

                RadButton txt = textboxes as RadButton;

                sql += "@" + txt.ID + ",";

                i--;

            }

        }

        sql += "'User','" + DateTime.Now.ToString("s") +"','NEW')";

        i = i - 3;

        for (int j = i; j > 1; j--)

        {

            sql += "null,";

        }

        sql = sql.Replace(",ats)", ")");

        return sql;

    } 

最后的SQL语句是另外3个额外的字段的数据库quot; user_createdquot;,quot; date_createdquot;"statusquot;因为我无法弄清楚如何处理多余的逗号,我决定添加和替换通配符quot值; atsquot;
该方法的最终结果是在运行时创建的控件的SQL语句。
private SqlCommand AddParameters(SqlCommand com)

    {

        foreach (var textboxes in TextboxNames)

        {

            if (textboxes is RadTextBox)

            {

                RadTextBox txt = textboxes as RadTextBox;

                com.Parameters.Add("@" + txt.ID, SqlDbType.NVarChar).Value = txt.Text;

            }

            if (textboxes is RadNumericTextBox)

            {

                RadNumericTextBox txt = textboxes as RadNumericTextBox;

                com.Parameters.Add("@" + txt.ID, SqlDbType.Decimal).Value = txt.Value;

            }

            if (textboxes is RadComboBox)

            {

                RadComboBox txt = textboxes as RadComboBox;

                com.Parameters.Add("@" + txt.ID, SqlDbType.NVarChar).Value = 

                            txt.SelectedValue;

            }

            if (textboxes is RadDateTimePicker)

            {

                RadDateTimePicker txt = textboxes as RadDateTimePicker;

                com.Parameters.Add("@" + txt.ID, SqlDbType.DateTime).Value = 

                            txt.SelectedDate;

            }

            if (textboxes is RadButton)

            {

                RadButton txt = textboxes as RadButton;

                com.Parameters.Add("@" + txt.ID, SqlDbType.Bit).Value = 

                        txt.SelectedToggleState.Selected;

            }

        }

        return com;

    } 

这种方法得到的SqlCommand,并在基础上的控制参数增加。因此,最后的INSERT语句为"保存"按钮将是:{C16的}
后,发送到SQL命令执行查询方法:{C17的}
我与"保存"按钮插入语句完成。
如果有一个更好的方式建设这条SQL语句和参数,我将很高兴听到你的专家。景点
就是这样。你已经注意到,我使用了很多的字符串格式化以及字符串操作,才能建立这个部落。我有一整套严格的规则,当涉及到数据库。然而,这最终的结果是更有趣。
这项工作试图延长其他区议会的共同功能。通过改变SQL语句,可以很容易使代码适应其他区议会的支持。历史初步草案 - 版1(Aresh Saharkhiz)添加INSERT语句和参数(2011年11月16日)

回答

评论会员:EngleA 时间:2012/02/06
。这是一个良好的开端,我经历了同样的过程在同一时间

1.nbsp"; 可以处理的DB脚本和"GetTables" "调用getColumns"的方法,与测绘例如,你需要的是一个连接字符串,服务器名称,表,模式等,和LINQ,一旦你得到的数据

2.nbsp; 前缀。 ? 与"tbl_"NBSP表为何的 ?NBSP你返回的是... tables.nbsp; NBSP随着测绘可以消除次数,如果你的DB(最佳实践)图式,你摆脱任何DBO对象
NBSP
3.nbsp; 列名。 NBSP许多_"在names.nbsp的; 如果列并不需要在控制,让DEV删除或显示列名的列表,检查mark.nbsp; NBSP是足够FK_xxxID,或PK_xxID其中xxx代表"的缩写"的table.nbsp; NBSP,例如,如果表是"名称","纳米"将是一个很好abbrev.nbsp; 为什么? 如果你有5参考(管理)都有一个"名称"列的表NBSP? nmName, ,stuName,empName或... 姓名,名称,Name.nbsp; NBSP,哪一个更暧昧

4.nbsp"; 使用说明列good.nbsp 但odd.nbsp; NBSP,它并不真正的"描述"一栏,你将在there.nbsp人造文本; NBSP如果另一个DBA或开发了后你想知道什么是"名"的意思,或用于,他们会不会有一个线索

5.nbsp; 文本框:? NBSP真的 NBSP空文本 NBSP,这需要删除现有的文字,用户键入文本in.nbsp; 穷人design.nbsp; 使用AJAX的水印或水印空文本转换成自己JScript或东西,或....不使用它。 NBSP

6.nbsp"; Save按钮点击: 你假设它的saved.nbsp; NBSP,没有检查和balances.nbsp; 更何况,在没有保存方法 all.nbsp;你是如何确认整数/小数/日期,然后输入正确解析它们

7.nbsp"; 我没有看到一个取消按钮的Click事件{。 BR}
总而言之,你已经有了一个良好的开端,它可能为你工作得很好,它只是海事组织,一个非常糟糕的design.nbsp; 我是一个讲究标准和命名约定,所以此袭击一个chord.nbsp; 我建了一个CODEGEN这里产生管理项目(参考表的CRUD)的控制,但我用SMO来做到这一点,并处理在一个独立的系统的描述,但不使用它任何longer.nbsp; NBSP,我们现在有模板和基础库,我们use.nbsp; 一样快
评论会员:saharkiz 时间:2012/02/06
谢谢你的评论。寻找到测绘现在。然而,这篇文章是一个修剪的一系列5个版本的第一个版本。但您的意见是非常有益的。谢谢
:EngleA
评论会员:游客 时间:2012/02/06
。我对2票,DBREQ,能够通过SMO和LINQ处理了很多......更多
|