我会使用类似于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中的所有字段,即使这样我也需要在格式字符串本身中加上引号。
有没有办法编写/扩展格式函数来执行此操作?
编辑:投入'在格式字符串本身不是我之后的答案。
答案 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");