【问题标题】:Type conversion in C# for SQL dataC# 中用于 SQL 数据的类型转换
【发布时间】:2022-10-05 03:46:57
【问题描述】:

我有一个DataTable,它是从 SQL 数据库中填充的。值作为对象类型返回(由于某种原因,Calculate 函数也返回对象),所以我需要将它们转换为正确的类型。它使代码变得如此复杂。

像这样:

 double value;

 foreach (DataRow row in sampleDataTable.Rows)
 {
     value +=  (double)Global.Calculate(Convert.ToDouble(Global.dbNullCheck(row["value1"], 0)) / Convert.ToDouble(row["value2"]), 2);
 }

我可以将上面的代码写成:

 double sum;
 double value1;
 double value2;

 foreach (DataRow row in sampleDataTable.Rows)
 {
     value1 = Convert.ToDouble(Global.dbNullCheck(row["value1"], 0);
     value2 = Convert.ToDouble(row["value2"]);
     sum +=  (double)Global.Calculate(value1 / value2, 2);
 }

但是,当然,仍然不清楚,我做错了什么。如果它们是DBNull,我需要检查所有值,然后我需要转换它们。有什么想法可以改进这种类型的代码吗?它在我的代码周围:)

有没有处理 SQL 数据的好方法?

【问题讨论】:

  • 这与 <sql> 语言无关。也许您应该添加 <sql-server> 标记?
  • 使用:foreach(sampleDataTable.AsEnumerable().Where(x => x.Field<object>("value1") == DBNull.Value) 中的 DataRow 行)
  • 问题可能始于一开始没有使用强类型的东西。您现在在弱类型事物的道路上走得很远,现在很难想出一个通用的简单解决方案。大多数 ORM 或任何类型的映射器都可以在一个中心位置进行处理,但之后您将不再需要摆弄这些细节。
  • @Ralf 弱类型是指很多带有对象的返回类型? C#不是已经是强类型语言了吗?我之前没用过ORM,是不是这种情况的解决方案?
  • 你的代码很好。你所有的变量都有类型。

标签: c# ado.net


【解决方案1】:

不要考虑“转换”。这些对象是已经你想要的类型;只是 ADO.Net 库无法提前知道使用什么类型。因此,您需要一个相对较慢的转换,而不是一个投掷.

此外,一般来说,您最初不希望从各个列的角度进行思考。相反,定义一个class 对象来表示每一行。然后创建一个接受DataRow 作为参数并返回这个新类的实例作为结果的函数。这个功能将要需要知道如何处理各个列,但更大的 foreach 循环(或类似的)应该只是调用这个函数。

【讨论】:

  • 非常感谢您的回答。据我了解,强制转换将是必要的,但如果我为这种逻辑单独使用一些类和函数会很好。如果我错了,请纠正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2012-06-26
  • 1970-01-01
  • 2015-09-03
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多