SQL查询中的{0},{1},{2},{3}是什么

时间:2014-03-13 12:59:40

标签: c# sql sql-server

我想知道下面给出的查询中的{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();
    }
    }

4 个答案:

答案 0 :(得分:6)

它与String.Format()有关。 {0}, {1}, {2}{3}替换type, programId, id, aliases

中的值

答案 1 :(得分:6)

  

是否与String.Format()相关?

可能。这些是字符串格式化占位符。 GetValue很可能以类似于:

的方式生成实际 sql字符串
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