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

时间:2015-11-25 02:31:32

标签: c# sql string format

我会使用类似于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中的所有字段,即使这样我也需要在格式字符串本身中加上引号。

有没有办法编写/扩展格式函数来执行此操作?

编辑:投入'在格式字符串本身不是我之后的答案。

4 个答案:

答案 0 :(得分:1)

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

    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')"

答案 1 :(得分:0)

您无法扩展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();
}

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

答案 2 :(得分:0)

    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,ColumnName1Value提供插入。该方法应位于您的BO图层中。您需要属性TableName,它将表示BO的表名。举个例子,如果你有班车。

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

如果您有兴趣,可以查看此答案以查看DataAccess图层:checking user name or user email already exists

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

答案 3 :(得分:-1)

您可以使用以下命令转义引号:

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