【问题标题】:Raw SQL in .NET Core.NET Core 中的原始 SQL
【发布时间】:2017-04-25 12:56:51
【问题描述】:

我有这个问题:我需要从我的 .NET Core 应用程序中执行原始 SQL。所以我有这个代码

var sqlConnection1 = new SqlConnection("Server=(localdb)\\mssqllocaldb;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true");
var cmd = new SqlCommand
{
    CommandText = "SELECT * FROM dbo.Candidates WHERE id = " + model.CandidateId,
    CommandType = CommandType.Text,
    Connection = sqlConnection1
};

sqlConnection1.Open();
var wantedRow = cmd.ExecuteReader();
sqlConnection1.Close();

我无法访问 WantedRow 中的数据... (当我使用实体框架时,此查询有效,但我不能使用实体框架)。在 .NET Core 中是否可行?

【问题讨论】:

  • 您收到什么错误?
  • 我没有收到错误,我收到了 SqlDataReader 对象,并且 WantedRow.GetString() 在没有数据时给了我无效的读取尝试。
  • @MacakM 此代码易受 SQL 注入攻击,您需要参数化查询。您也没有正确处理您的 IDisposable 对象。这些需要包含在 using 语句中。
  • 上面的代码没有报错。当我尝试了一些糟糕的方法来获取数据时,我得到了一个错误。

标签: c# sql .net-core


【解决方案1】:

首先,您的代码为sql injection attacks 敞开了大门。使用参数化查询而不是连接字符串。

第二,对实现 IDisposable 接口的所有内容使用using 语句。在这种情况下 - 连接、命令和阅读器。

第三,吸引读者只是工作的一部分。您仍然需要使用 reader.Read() 并获取值。

using(var sqlConnection1 = new SqlConnection("Server=(localdb)\\mssqllocaldb;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true"))
{ 
    using(var cmd = new SqlCommand()
    {
        CommandText = "SELECT * FROM dbo.Candidates WHERE id = @id",
        CommandType = CommandType.Text,
        Connection = sqlConnection1
    })
    {
        cmd.Parameters.Add("@id", SqlDbType.Int).Value = model.CandidateId
        sqlConnection1.Open();

        using(var reader = cmd.ExecuteReader())
        {
            if(reader.Read())
            {
                var id = reader[0];
                var whatEver = reader[1];
                // get the rest of the columns you need the same way
            }
        }
    }
}

【讨论】:

  • 我想为 SQL 注入敞开大门(这就是我不使用实体框架的原因)。我也知道使用,但首先我想要一个有效的代码,然后编写使用。谢谢你的回答。
  • 我想用这个应用程序向我的学生展示他们如何进行 SQL 注入 :) 但是,当我们拥有出色的 ORM 框架时,现在要制作一个容易受到 SQL 注入攻击的应用程序是非常困难的 :D
  • 是的,但是在 .NET Core 中我不能使用 SqlDataAdapter 和其他类我没有太多经验
  • 这是我的观点——你可以忽略它——但我相信,通过接受你接受的答案而不详细说明你正在寻找易受攻击的代码的问题本身,你基本上是在告诉未来的读者它是一个更好的答案,即使他们可能会比这个更好地满足您的特定需求,但大多数未来的读者可能不会从易受 SQL 注入攻击的代码中受益。我相信对于发布的问题,我的答案是当前答案中最好的,因为它是最完整的,并且解决了 Sql 注入和 using 语句。
  • 是的,我想了 20 分钟......我认为你是对的 - 现在接受的答案对我有帮助,因为这是我需要的唯一信息,但对于未来的读者你的答案更好。
【解决方案2】:

ExecuteReader 应该返回 SqlDataReader,这意味着你应该执行类似的操作

while(wantedRow.Read())
{
    var aValue = wantedRow[0].Value;
}

【讨论】:

    【解决方案3】:

    您可以尝试如下使用并尝试访问 SQLDataReader:

    SqlDataReader reader = command.ExecuteReader();
    
    while (reader.Read())
    {
        Console.WriteLine(String.Format("{0}", reader[0]));
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2018-02-28
      • 2020-09-07
      • 2012-06-03
      相关资源
      最近更新 更多