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

本文关键字:是什么 查询 SQL | 更新日期: 2023-09-27 17:49:55

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

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

是否与String.Format()有关?

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

的方式生成实际 sql字符串:
public object GetValue(string template, params object[] args)
{
    ...
    string sql = string.Format(template, args);
    ...
}

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

我认为您的GetValue方法将{x}替换为字符串后传递的参数值。这可以通过调用string来实现。能够通过称为复合格式

的技术替换此类占位符的格式。所以也许你的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注入的主要途径。一个非常严重的漏洞,应该不惜一切代价避免。

这些是占位符。后面以逗号分隔的字符串中的值将填充这些位置。举个例子。

{0} =类型{1} = ProgramId

等。