C#:通过ODBC读取数据导致算术溢出

问题描述 投票:0回答:8

在我的实际项目中,我从 Filemaker v14 数据库读取数据。 我得到这样的数据:

command.CommandText = "SELECT * FROM CAR";

//Create new SqlDataReader object and read data from the command.
using (OdbcDataReader reader = command.ExecuteReader())
{
    /*
    * Get and cast the ID
    */
    int counter = 0;
    while (reader.Read() && counter < numberOfOrders)
    {
        SalesOrder s = new SalesOrder();
        s.abNR = reader["Auftrags Nr."].ToString();
        s.artNr = reader["Artikel nr."].ToString();
        s.quantity = reader["Menge"].ToString();
        s.city_country_Coustomer = reader["Stadt"].ToString();
    }
}

此代码在我正在开发的计算机上完美运行。

如果我将项目放入 IIS,则会出现此错误:

算术运算导致溢出。

在这一行中:

s.abNR = reader["Auftrags Nr."].ToString();

我已经检查了我的计算机和服务器上的 DSN。两者似乎是一样的。

连接的创建方式如下:

conn = new OdbcConnection("DSN=FILEMAKER1;Uid=Test;Pwd=tset");
conn.Open();

command = conn.CreateCommand();

我期待您的答复!

编辑:

这是我的销售订单类:

public class SalesOrder
{
    public string abNR { get; set; }
    public string artNr { get; set; }
    public string quantity { get; set; }
    public string city_country_Coustomer { get; set; }
}

编辑2:

销售订单的示例数据:

Aufrags Nr. | Artikel nr. | Menge | Stadt   |
------------+-------------+-------+---------+
  168953    |   508800    |   2   | Berlin  |
------------+-------------+-------+---------+
  167996    |   508850    |   4   | München |
------------+-------------+-------+---------+
  FF8957    |   509010    |   1   | Berlin  |

编辑3:

[OverflowException:算术运算帽子 einen Überlauf verursacht.] System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i) +359 System.Data.Odbc.OdbcDataReader.GetValue(Int32 i) +57 System.Data.Odbc.DbCache.AccessIndex(Int32 i) +82
System.Data.Odbc.OdbcDataReader.GetValue(Int32 i) +38
Produktionscockpit.SQL.FilemakerController.getActualSalesOrders(Int32 订单数)中 c:\Dev\ProductionCockpit\Produktionscockpit\SQL\FilemakerController.cs:56 Produktionscockpit.Home.addSalesOrderTabelContent() 中 c:\Dev\ProductionCockpit\Produktionscockpit\default.aspx.cs:79
Produktionscockpit.Home.Page_Load(对象发送者, EventArgs e) in c:\Dev\ProductionCockpit\Produktionscockpit\default.aspx.cs:21
System.Web.UI.Control.LoadRecursive() +116
System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint、布尔值 includeStagesAfterAsyncPoint) +2910

c# sql asp.net filemaker
8个回答
6
投票

我读了一些相关内容,发现 32 位和 64 位之间的连接存在问题。您的应用程序是针对 x86 编译的吗?假设您使用 32 位 ODBC 数据源。

根据我在其他遇到同样问题的人中看到的情况(我从未遇到过这种情况),您可以通过将应用程序移至 32 位(如果数据源是 32 位)或某人也卸载了 64 位版本的 filemaker 来修复它并安装了 32 位。

很可能这就是问题所在,但我无法真正给你一个正确的解决方案,因为我不了解你的环境。


3
投票

如果您收到

ArithmeticOverflow
,则听起来 .NET 无法确定您的
Aufttrags Nr.
列的类型并且猜测不正确。

如果此列是

Number
,则 它可以映射到多种 .NET 数据类型 :

在将其输出为字符串之前,您可能会考虑尝试通过

Int64
 方法显式地将其读取为 
Convert.ToInt64()
:

s.abNR = Convert.ToInt64(reader["Auftrags Nr."]).ToString();

或者,如果您希望该值是浮点数,您可以尝试通过

Decimal
 方法使用 
Convert.ToDecimal()
:

s.abNR = Convert.ToDecimal(reader["Auftrags Nr."]).ToString();

关于连接

由于您的问题标题明确询问有关连接到 FileMaker 数据库的信息,因此您可以检查以确保您的连接字符串在此处正确,并查看下面的 Filemaker Pro 连接字符串示例:

Driver=FileMaker Pro;AllAsText=0;ApplicationUsingThreads=1;FetchChunkSize=100; FileOpenCache=0;IntlSort=0;MaxTextlength=255;ServerAddress=127.0.0.1; TranslationOption=0;UseRemoteConnection=1;

尽管您的主要问题似乎与连接无关。


1
投票
您提供的堆栈跟踪

System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i)

让我得出结论:问题是 TEXT 类型确实被 ODBC GetSqlType 识别。行为差异可能是由 ODBC 驱动程序版本或其默认设置不同造成的。检查两个环境中的版本和设置。

作为解决方案,您可以尝试将您的字段转换为某些已知类型。例如,

SELECT CAST(C.[Aufrags Nr.] as NVARCHAR(MAX)) as [Aufrags Nr.], .... FROM CAR C

根据您查询的 SQL 服务器(或 ODBC 源)选择适当的列类型。


1
投票
我曾经遇到过几乎类似的问题,在尝试了很多事情(例如转换为长等)之后,这终于解决了我的问题,尽管我不确定它是如何解决的?

abNR = reader["Auftrags Nr."] + "";

我用 + "" 替换了 ToString();


1
投票
64 位 ODBC DSN 存在一些问题 我刚刚通过运行

C:\WINDOWS\SYSWOW64\odbc32.exe

(而不是默认的 ODBC 工具)在 64 位 Windows 上创建了 32 位 DSN。效果很好。


1
投票
您的列命名约定可能有问题:为此,请将您的查询更改为此

command.CommandText = "SELECT *, [Auftrags Nr.] as AuftragsNr, [Artikel nr.] as ArtikelNr FROM CAR"; //Create new SqlDataReader object and read data from the command. using (OdbcDataReader reader = command.ExecuteReader()) { int counter = 0; while (reader.Read() && counter < numberOfOrders) { SalesOrder s = new SalesOrder(); s.abNR = reader["AuftragsNr"].ToString(); s.artNr = reader["ArtikelNr"].ToString(); s.quantity = reader["Menge"].ToString(); s.city_country_Coustomer = reader["Stadt"].ToString(); } }
    

0
投票
ODBC 驱动程序将名为 AuftragsNr 的列的数据类型确定为 int,并在第 3 行失败。尝试使用 GetString 方法。


0
投票
我们的解决方法是将“OdbcDataAdapte”属性“MissingSchemaAction”设置为“MissingSchemaAction.Add”(而不是“MissingSchemaAction.AddWithKey”)。

© www.soinside.com 2019 - 2024. All rights reserved.