我想知道下面给出的查询中的{0}或{1}是什么意思
public static int EnsureObjectHasAliases(string type, int id, int programId, string[] aliasList)
{
var sb = new StringBuilder();
if(aliasList!=null)
for (int i = 0; i < aliasList.Length; i++)
{
string alias = aliasList[i];
if (NormalizeString(ref alias))
{
if (sb.Length > 0)
sb.Append(",");
sb.Append(FormatStringForSql(alias));
}
}
if (sb.Length > 0)
{
string aliases = sb.ToString();
var c = (int)GetValue("SELECT count(*) FROM {0}Alias WHERE ProgramId = {1} AND {0}Id = {2} and Alias in ({3})", type, programId, id, aliases);
if (c > 0)
return id;
if (aliasList != null)
if (aliasList.Any(alias => AddObjectAlias(type, programId, alias, id) < 0))
return -1;
}
return id;
}
我不知道这个查询意味着什么:
SELECT count(*) FROM {0}Alias WHERE ProgramId = {1} AND {0}Id = {2} and Alias in ({3})
我想知道查询中{0} or {1} or {2} and {3}
和ALIAS
是什么。我知道它代表了一些表但是如何?
是否与String.Format()
相关?
修改: -
我的GetValue()函数是这样的:
public static object GetValue(string sql, params object[] args)
{
return GetValue(GlobalFactories.GetLogger().GetDefaultTransaction(), sql, args);
}
public static object GetValue(SqlConnection db, string sql, params object[] args)
{
return GetValue(GlobalFactories.GetLogger().GetDefaultTransaction(), db, sql, args);
}
public static object GetValue(LogTransactionBase logTransaction,SqlConnection db, string sql, params object[] args)
{
if (string.IsNullOrEmpty(sql))
return null;
if (args != null && args.Length > 0)
sql = string.Format(sql, args);
LastQuery = sql;
var needToDispose = false;
if(db==null)
{
db = GetDB();
needToDispose = true;
}
try
{
using (var cmd = db.CreateCommand())
{
cmd.CommandText = sql;
cmd.CommandTimeout = TIME_OUT;
var v = cmd.ExecuteScalar();
if (v == DBNull.Value) v = null;
return v;
}
}catch(Exception ex)
{
logException(logTransaction,sql,ex);
throw;
}
finally
{
if (needToDispose)
db.Dispose();
}
}
答案 0 :(得分:6)
它与String.Format()
有关。 {0}, {1}, {2}
和{3}
替换type, programId, id, aliases
答案 1 :(得分:6)
是否与
String.Format()
相关?
可能。这些是字符串格式化占位符。 GetValue
很可能以类似于:
public object GetValue(string template, params object[] args)
{
...
string sql = string.Format(template, args);
...
}
答案 2 :(得分:2)
我认为您的GetValue
方法会将{x}
替换为字符串后传递的参数值。这可以通过使用string.Format调用来完成,该调用能够通过名为Composite Formatting的tecnique替换此类占位符
所以也许你的GetValue包含
string sql = string.Format(formatString, listOfParameters)
并定义为
public int GetValue(string formatString, params object[] listOfParameters)
然后,如果传递的参数是
type = "CUSTOMERS"
programID = 1
id = 2
aliases = "1,2,3"
内部字符串格式返回类似
的字符串SELECT COUNT(*) FROM CUSTOMERSalias WHERE ProgramID = 1 AND CUSTOMERSID = 2 and ALIAS IN (1,2,3)
说,我应该补充一点,这是一个非常糟糕的做法 它依赖于字符串连接来构建sql命令 这是Sql Injection的主要途径。应该不惜一切代价避免的非常严重的漏洞。
答案 3 :(得分:0)
那些是占位符。之后以逗号分隔的字符串中的值填充这些位置。所以举个例子。
{0} =输入 {1} = ProgramId
等