代码之家  ›  专栏  ›  技术社区  ›  MadBoy

如何将未知数量的参数从C_传递到SQL查询?

  •  2
  • MadBoy  · 技术社区  · 15 年前

    我有一个简单的查询,从哪里输入,我有如下内容:

    WHERE ([Comment]  LIKE '%something%'
          OR [Comment] LIKE '%aaaa%'
          OR [Commnet] LIKE '%ccc') 
    AND Replace([Number], ' ', '') = @number
    

    不幸的是,现在这是硬编码的代码,所以如果有任何变化(更多或是 [Comment] 字段我必须在代码中更改它。能通过吗 [评论] 像一个具有多个值(我不知道)的参数,所以我将创建一些SQL表,其中包含我想在该查询中使用的每个注释(并且用户将能够从程序中添加新的注释,以便自动处理这些注释)?

      using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
            using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
                sqlQuery.Parameters.AddWithValue("@number", varNumber);
                using (var sqlQueryResult = sqlQuery.ExecuteReader())
                    while (sqlQueryResult.Read()) {
                        string varID = sqlQueryResult["ID"].ToString();
    
                    }
            }
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Oded    15 年前

    你可以使用 table value parameters 在SQL Server 2008中。

    对于早期版本,可以传入XML参数并使用xpath解析数据。

    要深入分析不同选项,请阅读 this 文章作者:Erland Sommarskog(SQL Server 2005)和 additional article 关于SQL Server 2008。

        2
  •  1
  •   Oliver    15 年前

    即使ODED的解决方案似乎是最好的方法(直到现在我还不知道),我目前以某种方式自动建立了命令和参数(目前与您的问题不匹配,因为您正在使用 like ):

    // Some sql statement with a placeholder for all parameters (@ID0, @ID1, @ID2, ...)
    string sql = "select * from table where ID in ( {0} )";
    
    // Create a list of items of @ID0, 3; @ID1, 8; ...
    var parameters = myList.Where(item => item.MatchesSomeCondition())
                           .Select((item, index) => new
                                   {
                                       Name = "@ID" + index,
                                       Value = item.ID
                                   });
    
    // Add all parameters to the sqlCmd
    foreach(parameter in parameters)
    {
        sqlCmd.Parameters.AddWithValue(parameter.Name, parameter.Value);
    }
    
    // Insert all @IDx into the sql statement
    // Result: "select * from table where ID in ( @ID0, @ID1, @ID2, ... )"
    sqlCmd.CommandText = String.Format(sql, String.Join(", ", parameters.Select(parameter => parameter.Name).ToArray()
    
    推荐文章