【问题标题】:How can i compare an array with sql query in c# code?如何在 C# 代码中将数组与 sql 查询进行比较?
【发布时间】:2020-11-10 16:15:04
【问题描述】:

如何在 C# 中将数组与 SQL 查询进行比较?

我尝试了下面的代码来解决我的问题,但没有成功。

在下面的代码中 data 是包含某些类型数据的数组的名称。

DataTable dt = context.getData("Select * from emp_detail where EState = any(" +data+ ")", CommandType.Text);

【问题讨论】:

标签: c# arrays sql-server asp.net-mvc arraylist


【解决方案1】:

您可以将数据数组序列化为格式正确的字符串并将选择命令更改为类似的内容:

Select * from emp_detail where EState in ('a', 'b', ...) 

此方案仅适用于元素较少的数组。

【讨论】:

  • 您将如何以防止 SQL 注入的方式做到这一点?
【解决方案2】:

我认为您可以这样做来获取要比较的字符串列表:

using System.Linq;

namespace ExampleNamespase
{
    public class SimpleClass
    {
        private class TypeExample
        {
            public string Property { get; }
        }

        private void CompareData(TypeExample[] exampleArray)
        {
            var items = string.Join(", ", exampleArray.Select(t => t.Property));
            var sql = $"Select * from emp_detail where EState in ({items}) ";
        }
    }
}

或者如果你使用的是一个简单的字符串列表:

private void CompareData(string[] exampleArray)
{
    var items = string.Join(", ", exampleArray);
    var sql = $"Select * from emp_detail where EState in ({items}) ";
}

要防止注入,请使用 Dapper 库:

using System.Data;
using Dapper;

namespace ExampleNamespase
{
    public class SimpleClass
    {
        private void CompareData(string[] exampleArray, IDbConnection connection)
        {
            var sql = "Select * from emp_detail where EState in @items ";

            var result = connection.Query<YourTypeClass>(sql, new { items = exampleArray });
        }
    }
}

说明: 第一个示例使用 Linq 库使用 Select 方法检索对象的属性,并使用 string.Join 方法将结果列表连接成逗号分隔的字符串。

第二个例子演示了同样的方法,只是用了一个字符串数组,同样的 string.Join 方法用于连接。

在第三个例子中,使用 Dapper 库来执行请求,我认为应该首选这种方法,因为有助于避免 SQL 注入,也简化了与数据库的工作。要执行查询,我们可以传递一个对象列表,我们想要与数据库中的值进行比较,Dapper 将能够自行处理。我们只需要在请求中定义带有@符号的变量,并传递对象进行处理,该对象将具有相同名称的属性。

附:我为我的英语道歉))

更新:

试试这个:

private void CampareData(string[] exampleArray, IDbConnection connection)
{
    var clearItems = exampleArray.Select(s => $"'{s}'").ToArray();

    var sql = "Select * from emp_detail where EState in @items ";

    var result = connection.Query<YourTypeClass>(sql, new { items = clearItems });
}

在这个变体中,我们将每个项目用 sql 使用的引号括起来,并且查询应该包含如下内容: ... in ('item1', 'item2' ...)

【讨论】:

  • 实际上工作不完美,这段代码发送像“a,b,c”这样的数据,但是数组发送像这样的数据“a”,“b”,“c”
  • 更新了答案,希望我理解正确
  • 为了更好地理解最终会发生什么,描述包含“数据”数组的数据类型,这些是字符串或某种类或其他东西。如果可能的话,再写一个示例 SQL 查询,我认为它会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2015-02-13
  • 2013-05-16
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
相关资源
最近更新 更多