用于数值数据类型的 SqlDataReader

Posted

技术标签:

【中文标题】用于数值数据类型的 SqlDataReader【英文标题】:SqlDataReader for numeric data type 【发布时间】:2013-07-04 06:52:48 【问题描述】:

我有这个代码:

public void nactiData()

        SqlCommand cm = new SqlCommand("SELECT * FROM zajezd WHERE akce="+nc_zajezd_vyber, con); 
        con.Open();
        SqlDataReader reader = cm.ExecuteReader();

        if (reader.Read())
        
            zpocdnu.Text = reader.GetInt32(31).ToString();
            zcena3.Text = reader.GetDecimal(6).ToString();
        

        con.Close();
    

问题是它没有读取zcena3,因为表中的数据类型是numeric

在微软的网站上写着我应该用GetDecimal阅读它,但它也不起作用。

有什么解决办法吗?

【问题讨论】:

* 与列位置一起使用是自找麻烦。写出列名,如GetString("col1") 我试过了,应该用什么替换*? SQL Server 中的这些列是什么确切 数据类型?如果它们是intsmallintbigint;你需要使用.GetInt16/.GetInt32/.GetInt64(不是.GetDecimal)。您说使用GetDecimal 不起作用 - 如何不起作用?你有错误吗?如果是这样:什么错误 哦,GetDecimal 确实有效,我允许空值。谢谢 @Andomar:应该是reader.GetString(reader.GetOrdinal("col1"))(通常调用GetOrdinal的结果只会执行一次,然后缓存在一个变量中)。 【参考方案1】:

(你自己解决了你的问题,但让我提出以下建议。)

由于您使用的是 SQL Server 数据读取器,因此请使用 GetSqlDecimal 而不是 GetDecimal

它的性能应该会好一些(因为它不会进行任何不必要的转换)。 还可以处理NULL(通过返回的SqlDecimal值的IsNull属性)。

【讨论】:

以上是关于用于数值数据类型的 SqlDataReader的主要内容,如果未能解决你的问题,请参考以下文章

单元测试 - 存根 SqlDataReader

使用 SQLDataReader 读取 IP 地址

SqlDataReader将Binary列转换为bool

将 SqlDataReader 传递给函数作为转换参数

如何使用 SqlDataReader 获取位值并将其转换为布尔值?

1.1_数据的来源和类型