自定义String.Format以在某些字段周围添加引号

本文关键字:字段 周围添 加引号 String Format 自定义 | 更新日期: 2023-09-27 18:24:08

我想要一个类似String.Format的函数,它会自动为提供的值插入单引号,这些值不是double或int类型(从开始)。

String.Format("INSERT INTO Foo (id, name) VALUES ({0}, {1})",
    42, "Bar");

我希望这个输出:

INSERT INTO Foo (id, name) VALUES (42, 'Bar')

我知道你可以引用SQL中的所有字段,即使这样我也需要在格式字符串本身中加引号。

有没有一种方法可以编写/扩展格式化函数来做到这一点?

编辑:把'放在格式字符串本身并不是我想要的答案。

自定义String.Format以在某些字段周围添加引号

我想到了这个,希望它能有所帮助。

    public static string MyFormat(string str, params object[] args)
    {
        int count = args.Length;
        for (int i = 1; i < count; i++)
        {
            if (args[i].GetType() == typeof(string))
                args[i] = "'" + args[i] + "'";
        }
        return string.Format(str, args);
    }

用法:

    string foo = MyFormat("INSERT INTO Foo (id, name) VALUES ({0}, {1})", 42, "Bar");
    //foo = "INSERT INTO Foo (id, name) VALUES (42, 'Bar')"

您不能扩展String.Format。以下内容将起作用:

String.Format("INSERT INTO Foo (id, name) VALUES ({0}, '{1}')", 42, "Bar");

您可以使用以下参数让ADO.NET自动为您执行此操作:

using (var dbCommand = new SqlCommand("INSERT INTO Foo (id, name) VALUES (@id, @name)", dbConn))
{
    dbCommand.Parameters.Add("id", SqlType.Integer).Value = 42;
    dbCommand.Parameters.Add("name", SqlType.VarChar).Value = "Bar";
    dbCommand.ExecuteNonQuery();
}

您可以轻松地构建命令文本,使其更具动态性

    public virtual void Insert(params object[] colValues)
    {
        if (colValues == null || colValues.Length % 2 != 0)
            throw new ArgumentException("Invalid column values passed in. Expects pairs (ColumnName, ColumnValue).");
        SqlCommand cmd = new SqlCommand("INSERT INTO " + TableName + " ( {0} ) VALUES ( {1} )");
        string insertCols = string.Empty;
        string insertParams = string.Empty;
        for (int i = 0; i < colValues.Length; i += 2)
        {
            string separator = ", ";
            if (i == colValues.Length - 2)
                separator = "";
            string param = "@P" + i;
            insertCols += colValues[i] + separator;
            insertParams += param + separator;
            cmd.Parameters.AddWithValue(param, colValues[i + 1]);
        }
        cmd.CommandText = string.Format(cmd.CommandText, insertCols, insertParams);
        DA.SqlManager.ExecuteNonQuery(cmd);
    }

您需要为插入提供ColumnName1、ColumnName1值。该方法应该位于BO层中。您需要表示BO的表名称的属性TableName。例如,如果您有class car。

new BO.Car().Insert("Tires", 4, "EngineModel", "VW");

如果你感兴趣,你可以检查这个答案来查看DataAccess层:检查用户名或用户电子邮件是否已经存在

如果需要,可以将该方法设置为静态。

您可以使用:转义引号

String.Format("INSERT INTO Foo (id, name) VALUES ({0}, ''{1}'')",
42, "Bar");