{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日)