.NET Core中的原始SQL

Mac*_*akM 4 c# sql .net-core

我有这个问题:我需要从我的.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();
Run Code Online (Sandbox Code Playgroud)

我无法访问wantedRow中的数据...(当我使用Entity Framework时,此查询有效,但我无法使用Entity Framework).是否可以在.NET Core中使用?

Zoh*_*led 12

首先,您的代码是sql注入攻击的开门.使用参数化查询而不是连接字符串.

其次,将该using语句用于实现IDisposable接口的所有内容.在这种情况下 - 连接,命令和阅读器.

第三,让读者只是工作的一部分.您仍然需要使用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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我的观点-您可以忽略它-但我相信,通过接受您接受的答案,而无需详细说明问题本身,即您正在寻找易受攻击的代码,基本上是在告诉未来的读者,这是一个更好的答案,即使他们可能会比这更好地满足您的特定需求,因此大多数未来的读者可能不会从容易受到SQL注入攻击的代码中受益。我相信对于所发布的问题,我的答案是当前答案中最好的,因为它是最完整的,并且可以同时处理Sql注入和using语句。 (3认同)