自动生成INSERT和UPDATE语句






3.45/5 (5投票s)
用于为 Microsoft SQL、OleDb 和 ODBC 数据提供程序构建插入和更新语句的类
引言
在使用数据库时,您需要多次创建 insert
和 update
语句。但这项工作很枯燥。此外,如果代码不被 SQL 语句打断,代码会更清晰。使用像 NHibernate 这样的 OR-Mapper,您可以摆脱这个问题。但有时,您无法使用 OR-Mapper,或者您不想使用它。这就是我编写这个小 SqlStatementBuilder
的原因。我决定在 DbCommand
中使用参数以防止 SQL 注入。由于每个 dataprovider
处理参数的方式不同,我必须为每个 dataprovider
编写一个 Statementbuilder
。由于我尚未安装 Oracle 数据库,因此尚未添加 Oracle 的 StatementBuilder
。基础工作在基类 StatementBuilderBase
中完成。只有参数处理和数据库数据类型由子类覆盖。
代码工作原理
StatementBuilder
有两种方法;一种用于 insert
,一种用于 update
。这些方法使用要更改的字段和值列表以及表名调用。此外,StatementBuilder
需要将执行语句的 DBCommand
。StatementBuilder
设置给定 DbCommand
的 CommandText
属性并填充命令的 parameterlist
。这是 insert
的方法
public IDbCommand CompleteInsertCommand
(IDbCommand command, string tablename, List<keyvaluepair><string> columnList)
{
StringBuilder sb = new StringBuilder();
GetInsertTextForFields(tablename, columnList, sb);
GetInsertTextForValues(columnList, sb);
command.CommandText = sb.ToString();
AddParameters(columnList, command);
return command;
}
首先,调用方法 GetInsertTextForFields
来构建 insert
语句的第一部分,例如 INSERT INTO table (field1, field2, field3, fieldn)
private static void GetInsertTextForFields
(string tablename, List<keyvaluepair><string> columnList, StringBuilder sb)
{
sb.Append("INSERT INTO ");
sb.Append(tablename);
sb.Append(" (");
KeyValuePair<string> lastCol = columnList.Last();
foreach (KeyValuePair<string> col in columnList)
{
sb.Append(col.Key);
if (columnList.Last().Key != col.Key)
{
sb.Append(", ");
}
}
sb.AppendLine(")");
}
此后是语句的值(例如 VALUES (@field1,@field2,@field3,@fieldn)
或 VALUES (?,?,?,?))
private void GetInsertTextForValues (List> ColumnList, StringBuilder sb)
(
sb.Append ( "VALUES (");
SetInsertParameter(columnList, sb);
sb.Append (")");
)
SetInsertParameters
在子类中实现。例如,Microsoft SQL 的 SqlStatementBuilder
这样实现此函数
foreach (KeyValuePair<string> col in columnList)
{
sb.Append(parameterChar);
sb.Append(col.Key);
if (columnList.Last().Key != col.Key)
{
{
sb.Append(", ");
}
}
}
最后,添加参数。对于 Microsoft SQL,它看起来像这样
protected override void AddParameters
(List<keyvaluepair><string> columnList, IDbCommand command)
{
if (!(command is SqlCommand))
{
throw new System.ArgumentException();
}
SqlCommand sqlCommand = (SqlCommand)command;
foreach (KeyValuePair<string> col in columnList)
{
sqlCommand.Parameters.Add(col.Key, GetDataType(col.Value)).Value = col.Value;
}
}
要添加参数,我们需要知道参数的数据库数据类型。这项工作由子类中的方法 getDataType
完成。数据库数据类型是通过使用给定值的数据类型来确定的。这具有优势,即用户不需要读取数据库模式的权限。为了避免忘记 where
子句而更新表中的所有行,还必须使用 where
子句调用方法 CompleteUpdateCommand
。
历史
- 2010 年 2 月 1 日:初始发布