【发布时间】:2021-12-24 01:51:27
【问题描述】:
对于我正在进行的项目,我有此 OwnershipRole 记录:
public record OwnershipRole
{
public OwnershipRole()
{
}
public OwnershipRole(Guid id, string title, bool isWithdrawn)
{
Id = id;
Title = title;
IsWithdrawn = isWithdrawn;
}
public Guid Id { get; set; }
public string Title { get; set; }
public bool IsWithdrawn { get; set; }
}
}
为了获取这些详细信息,我使用如下 sql 查询:
public List<OwnershipRole> GetOwnershipRoles()
{
var sql = @"
SELECT ItemID, Title, Status
FROM ItemDetail";
var data = GetTable(sql);
return data.Select().Select(dr => new OwnershipRole
{
Id = dr.Field<Guid>(0),
Title = dr.Field<string>(1),
IsWithdrawn = !dr.Field<bool>(2)
}).ToList();
}
private DataTable GetTable(string sql)
{
var rv = new DataTable();
using var cnn = new SqlConnection(_connectionString);
using var cmd = new SqlCommand(sql, cnn);
cnn.Open();
var da = new SqlDataAdapter(cmd);
da.Fill(rv);
cnn.Close();
return rv;
}
我们正在获取结果并将它们放入数据表中。但是,我遇到的问题是 Status 列中的值实际上是字符串。所以我想知道是否可能有类似的情况:
if (Status == "Withdrawn") {
Status == false
}
我知道这行不通,但有没有办法可以操纵从 Status 列获得的值,以适应 OwnershipRole 类中的 bool 参数?
【问题讨论】:
-
你的数据库中Status列的数据类型是什么?
-
旁注:
cnn.Close();是多余的,using var cnn = new SqlConnection(_connectionString);将为您关闭cnn -
GetTable()方法真的让我害怕。它实际上迫使您编写极易受到 sql 注入攻击的代码。 -
@DmitryBychenko
cnn.Open()也是多余的,因为SqlAdapter.Fill()也会打开和关闭连接。 -
你会如何改进它?这就是我得到的,只是任务扩展它