1

全部,

我在SqlDataAdapter.Fill()小数字段的一种用法中遇到“转换溢出”异常。错误发生在价值开始 100 亿,但直到 10 亿。这是代码:

DataSet ds = new DataSet();
SqlDataAdapter sd = new SqlDataAdapter();

adapter.SelectCommand = <my SQL Command instance>
adapter.Fill(ds);

我已经阅读了使用 SqlDataReader 作为替代方案,但我们需要明确设置数据类型和精度。我至少要获取 70 列,我不想只为一个错误的十进制字段设置所有列。

任何人都可以建议替代方法吗?

谢谢你。

4

2 回答 2

3

尽管数据集允许“填充”数据适配器,但我通常使用 DataTable 代替,因为在查询时,我只期望一个结果集。话虽如此,我会预先查询表,只是为了得到它的结构......就像

select whatever from yourTable(s) where 1=2

当您执行以下操作时,这将获得预期的结果列

DataTable myTable = new DataTable();
YourAdapter.Fill( myTable );

现在您有一个不会因内容大小而失败的本地表,因为不会返回任何记录,您现在可以显式转到有问题的那一列,并根据需要设置其数据类型/大小信息...

myTable.Columns["NameOfProblemColumn"].WhateverDataType/Precision = Whatever you need...

现在,您的本地架构是合法的,并且问题列将以其精确度被识别。现在,使用正确的 where 子句而不是 1=2 放入正确的查询以实际返回数据...由于第一遍没有实际的行,您甚至不需要执行 amyTable.Clear()来清除行...只需重新运行查询和dataAdapter.Fill().

我实际上没有尝试过,因为我没有您的数据问题来模拟相同的问题,但是理论上的过程应该可以帮助您,而不必明确地遍历所有列......只是可能会造成问题的少数列。

于 2011-09-25T23:09:23.367 回答
0

我遇到了同样的问题,原因是因为在我的存储过程中我返回了一个小数(38,20)字段。我将其更改为十进制(20,10),一切正常。这似乎是 Ado.Net 的限制。

CREATE PROCEDURE FOOPROCEDURE AS
BEGIN
    DECLARE @A DECIMAL(38,20) = 999999999999999999.99999999999999999999;
    SELECT @A;
END
GO

string connectionString ="";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
SqlCommand cmd = new SqlCommand("EXEC FOOPROCEDURE", conn);
SqlDataAdapter adt = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adt.Fill(ds); //exception thrown here
于 2020-08-27T08:01:32.817 回答