65.9K
CodeProject 正在变化。 阅读更多。
Home

自动生成INSERT和UPDATE语句

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.45/5 (5投票s)

2010年2月1日

CPOL

2分钟阅读

viewsIcon

41309

downloadIcon

474

用于为 Microsoft SQL、OleDb 和 ODBC 数据提供程序构建插入和更新语句的类

引言

在使用数据库时,您需要多次创建 insertupdate 语句。但这项工作很枯燥。此外,如果代码不被 SQL 语句打断,代码会更清晰。使用像 NHibernate 这样的 OR-Mapper,您可以摆脱这个问题。但有时,您无法使用 OR-Mapper,或者您不想使用它。这就是我编写这个小 SqlStatementBuilder 的原因。我决定在 DbCommand 中使用参数以防止 SQL 注入。由于每个 dataprovider 处理参数的方式不同,我必须为每个 dataprovider 编写一个 Statementbuilder。由于我尚未安装 Oracle 数据库,因此尚未添加 Oracle 的 StatementBuilder。基础工作在基类 StatementBuilderBase 中完成。只有参数处理和数据库数据类型由子类覆盖。

代码工作原理

StatementBuilder 有两种方法;一种用于 insert,一种用于 update。这些方法使用要更改的字段和值列表以及表名调用。此外,StatementBuilder 需要将执行语句的 DBCommandStatementBuilder 设置给定 DbCommandCommandText 属性并填充命令的 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 日:初始发布
© . All rights reserved.