【问题标题】:How to get data in INT from SQLDataReader in .NET如何从 .NET 中的 SQLDataReader 获取 INT 中的数据
【发布时间】:2021-04-12 23:23:41
【问题描述】:

我正在尝试从数据库中获取 int 值,但它抛出了一个错误

无法将“System.Byte”类型的对象转换为“System.Int32”类型。

在数据库中,Active 字段为tinyint

另外,如何从这个方法返回两个值。

private string CheckData(string firstValue, string SecondValue, int Active)
{
    string Data = "";

    StringBuilder sb = new StringBuilder();
    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'";
    sb.Append(query);

    sb.Replace("firstValue", firstValue);
    sb.Replace("SecondValue", SecondValue);
            
    SqlConnection connection = new SqlConnection(connString);

    SqlCommand cmd = new SqlCommand(sb.ToString());
    cmd.CommandTimeout = 0;
    cmd.CommandType = CommandType.Text;
    cmd.Connection = connection;

    try
    {
        connection.Open();

        SqlDataReader reader = cmd.ExecuteReader();

        if (reader.HasRows)
        {
            while (reader.Read())
            {
                Data = reader.GetString(reader.GetOrdinal("Mi"));
                Active = reader.GetInt32(reader.GetOrdinal("Active"));
            }
        }
    }
    catch (Exception ex)
    {
        _log.Error($"Exception:{ex.Message}");
    }
    finally
    {
        connection.Close();
        connection.Dispose();
    }

    return Data;
}

标签: c# sql-server sqldatareader


【解决方案1】:

这是一个尝试。我无法调试它(因为我不想创建数据库)。

首先我创建一个类型来保存结果。你可以只使用一个元组,但这似乎更清楚:

public class DataActive
{
    public string Data { get; set; }
    public byte Active { get; set; }
}

我让你的函数返回这些的集合 - 从你的代码中看不出只有一个。

您还会注意到我使用SqlParameters 将firstValuesecondValue 添加到您的查询中。查找 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", SqlDbType.NVarChar, 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 更好。您可以通过这种方式获得消息和堆栈。

【讨论】:

    猜你喜欢
    • 2019-10-06
    • 2011-03-07
    • 1970-01-01
    • 2013-07-18
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多