问题描述
我试图从数据库中获取 ScrollView
值,但它抛出了一个错误
无法将“System.Byte”类型的对象转换为“system.int32”类型。
在数据库中,Active 字段为 int
。
另外,如何从这个方法返回两个值。
tinyint
解决方法
这是一个小插曲。我无法调试它(因为我不想创建数据库)。
首先我创建一个类型来保存结果。您可以只使用元组,但这似乎更清楚:
public class DataActive
{
public string Data { get; set; }
public byte Active { get; set; }
}
我让您的函数返回这些集合 - 从您的代码中看不到只有一个。
您还会注意到我使用 SqlParameter
将 firstValue
和 secondValue
添加到您的查询中。查找SQL 注入(和Little Bobby Tables)。
如果您使用的是最新版本的 C#(我没有使用),using
有一种新的语法,需要更少的缩进。 using
语句在块末尾的 finally 语句中调用 Dispose
。另请注意,我正在处理 SqlCommand 和 DataReader
public static IEnumerable<DataActive> CheckData(string firstValue,string secondValue)
{
var results = new List<DataActive>();
const string query = @"select M.ident Mi,mmp.active Active from Iden.Iden M
Inner join PtM.MPt MMP on MMP.mPat =M.id
where M.ident = @firstValue and Mi.ident = @secondValue";
using (var connection = new SqlConnection(connString))
{
using (var cmd = new SqlCommand(query))
{
cmd.CommandTimeout = 0;
cmd.CommandType = CommandType.Text;
cmd.Connection = connection;
cmd.Parameters.Add("@firstValue",SqlDbType.NVarChar,50).Value = firstValue;
cmd.Parameters.Add("@secondValue",50).Value = secondValue;
try
{
connection.Open();
using (var reader = cmd.ExecuteReader())
{
var dataOrdinal = reader.GetOrdinal("Mi");
var activeOrdinal = reader.GetOrdinal("Active");
if (reader.HasRows)
{
while (reader.Read())
{
results.Add(new DataActive
{
Data = reader.GetString(dataOrdinal),Active = reader.GetByte(activeOrdinal),});
}
}
}
}
catch (Exception ex)
{
_log.Error($"Exception:{ex.Message}");
}
}
}
return results;
}
如果您的 TINY_INT Active
表示一个布尔值,请找出规则是什么,然后在使用 reader.GetByte
获得该值之后进行转换。
最后一点,通常最好记录 ex.ToString()
而不是 ex.Message
。您以这种方式获取消息和堆栈。