SqlDataAdapter.Fill() - 转换溢出

时间:2011-09-25 22:26:47

标签: c# sql-server-2008 sqldatareader sqldataadapter

所有

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

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

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

我已经阅读过使用SqlDataReader作为替代,但我们需要显式设置数据类型和精度。我正在获取至少70列,我不想仅为一个十进制字段设置错误。

有人可以建议其他方法吗?

谢谢。

2 个答案:

答案 0 :(得分: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来实际返回数据...因为第一遍中没有实际的行,所以甚至不需要myTable.Clear()来清除行...只需重新运行查询dataAdapter.Fill()

我没有真正尝试过,因为我没有数据问题来模拟同样的问题,但是理论过程应该让你无需明确地通过所有列...只是可能造成问题的少数几个

答案 1 :(得分: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