自定义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中的所有字段,即使这样我也需要在格式字符串本身中加引号。
有没有一种方法可以编写/扩展格式化函数来做到这一点?
编辑:把'放在格式字符串本身并不是我想要的答案。
我想到了这个,希望它能有所帮助。
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");