我有这个问题:我需要从我的.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中的数据... (当我使用Entity Framework时,此查询有效,但我无法使用Entity Framework)。是否可以在.NET Core中使用?
答案 0 :(得分:9)
首先,您的代码是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
}
}
}
}
答案 1 :(得分:2)
您可以尝试使用如下方法并尝试访问SQLDataReader:
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(String.Format("{0}", reader[0]));
}
答案 2 :(得分:2)
ExecuteReader应该返回SqlDataReader,这意味着你应该做类似
的事情while(wantedRow.Read())
{
var aValue = wantedRow[0].Value;
}