如何将Sql中的money类型的数据转化为C#中的int型?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将Sql中的money类型的数据转化为C#中的int型?相关的知识,希望对你有一定的参考价值。

如题。
数据表中有一字段:cardMoney,数据类型money,我要在C#中查询得到这列的值
select cardMoney from 表

请问如何将返回的值转化为int型的?
int i = select cardMoney from 表 这样不可以 !
int i = (int)select cardMoney from 表 这样VS不提示错,但程序运行起来提示无法转换。请高手指教下!

将Sql中的money类型的数据转化为C#中的int型:
string st1 = ConfigurationManager.ConnectionStrings["yikawangluoConnectionString"].ConnectionString;

SqlConnection Conn1 = new SqlConnection(st1);
Conn1.Open();
SqlCommand mycomm1 = new SqlCommand("select account from userinfo where name='"+name2+"'", Conn1);
try

SqlDataReader r = mycomm1.ExecuteReader();
r.Read();
// TextBox1.Text = ((DbType)r[0]).ToString();
decimal money = Convert.ToDecimal(r[0]);
TextBox1.Text = money.ToString();

catch (SqlException eeee)

// Response.Redirect("error1.aspx");


数据库中的money类型对应C#的decimal类型,要解决这个问题起码有两种办法转换数据类型:
1:
使用Convert类提供的静态方法ToDecimal
decimal money = Convert.ToDecimal(this.lable1.Text.Trim());
2:
使用decimal类提供的静态方法Parse
decimal money = decimal.Parse(this.lable1.Text.Trim());
向数据库中插入money类型时,不需要单引号,类似于int型的插入操作。
参考技术A 用强制转换Convert.ToInt32 参考技术B string cmdText= "select cardMoney from "+表名;
object value = comm.ExecuteScalar(cmdText);
int money2Int = (int)decimal.Parse(value);
参考技术C string str = select cardMoney from 表;

int i = convert.toint32(str);本回答被提问者采纳
参考技术D select cast(cardMoney as int) as cardMomey from 表

Money PHP - 将 Money 对象保存在数据库中的无损方法

【中文标题】Money PHP - 将 Money 对象保存在数据库中的无损方法【英文标题】:Money PHP - Loseless way to Persist Money Object in Database 【发布时间】:2018-02-07 10:16:31 【问题描述】:

我指的是moneyphp/money 库,我计划在我们的一个项目中使用它来处理货币。文档很棒,只是它没有涉及如何在数据库中持久化。它谈到了将货币对象编码为 JSON,但存储字符串使得查询变得像比较金额或货币一样简单。

通过问题,我发现很少有关于教义的讨论,而且它对教义是如此具体,以至于我无法从中受益。

用简洁的话问我的问题:如何在不丢失细节的情况下存储货币对象?我对 Postgresql 很感兴趣,但是任何关系数据库都可以。

注意:我已经阅读了许多不同的方法来将货币保存在数据库中,他们differ in how they do。对与此特定库一起使用的特定方式感兴趣。

【问题讨论】:

有什么反对分别存储这两个字段的吗?这似乎是最自然的方式。 没有。我没有这个限制。只要存储/检索是无损的,就可以了。唯一的限制是(1)运行查询应该很容易(2)保存和检索数据应该是无损的。 为了方便那些不熟悉库的人,您需要存储哪些确切的属性? 如果分割属性没问题,那么我认为无损存储完全取决于数据库系统。但是检查:moneyphp.org/en/latest/concept.html#integer-limit 意味着不鼓励使用字符串类型以外的任何东西。这意味着在数据库中进行计算可能会出现问题。 我建议两个字符串字段(具有适当的长度),而不是在数据库内进行计算。 【参考方案1】:

在阅读了许多不同的线程、帖子等之后,我得出的结论是只有两种方式是可以接受的(请参阅 this question 中的优秀 cmets):

    每次保存到数据库时将所有货币转换为最小单位(例如美分),并在检索时重新转换。

    使用所需精度的 DECIMAL/NUMERIC 数据类型(在进行正常操作时,许多人建议使用 NUMERIC(15,4),如果进行货币兑换操作,则建议使用 NUMERIC(15,6))

当然无论选择什么,都必须加上货币栏目。

因为this library(当我问这个问题时,这不是原来的),我最终选择了第一种方法,这使得这非常容易。以下是我创建issue后作者的解释:

我只能告诉你,我个人将我的资金存储在数据库中 作为一个整数,表示以次要单位(美分)为单位的金额,以及 如果应用程序使用多个货币,则可选 CHAR(3) 货币(否则货币在应用程序中是硬编码的)。

您可以通过这种方式以整数形式获得次要单位的金额:

$money->getMinorAmount()->toInt();

您可以从存储在数据库中的整数中检索 Money 使用:

Money::ofMinor($integerAmount, 'USD');

【讨论】:

注意,您的示例代码适用于brick/money,而不是moneyphp/money ;) 我放弃了图书馆有两个原因(1)与对另一个(链接)的友好回应相比,对我打开的问题的严厉回应大致相同。 (2)砖库支持最小转换单位的自动转换,从而简化了事情。我会加粗那部分!

以上是关于如何将Sql中的money类型的数据转化为C#中的int型?的主要内容,如果未能解决你的问题,请参考以下文章

C# 的哪种数据类型相当于 SQL Server 中的钱? [复制]

在SQL数据库中,设置了一个字段的类型为money,但是money类型数据保留的是四位小数,如何设置为两位小数?

C# 十进制到 SQL Server 钱

c#语言中怎么把int 型的数字转化为string 型输出

使用 Convert.ToDecimal() 会导致 C# 中的值四舍五入。如何克服这个问题?

如何将 SqlDbtype.Money = 0 与 Sql 服务器中的货币字段进行比较