首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#:通过ODBC读取数据的算术溢出

C#:通过ODBC读取数据的算术溢出
EN

Stack Overflow用户
提问于 2016-05-11 14:28:43
回答 7查看 3K关注 0票数 5

在我的实际项目中,im从一个文件制造商v14数据库读取数据。我得到的数据如下:

代码语言:javascript
复制
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。两者似乎是一样的。

这种对像是这样产生的:

代码语言:javascript
复制
conn = new OdbcConnection("DSN=FILEMAKER1;Uid=Test;Pwd=tset");
conn.Open();

command = conn.CreateCommand();

我期待着你的回答!

编辑:

这是我的销售订单-班级:

代码语言:javascript
复制
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:

SalesOrder的示例数据:

代码语言:javascript
复制
Aufrags Nr. | Artikel nr. | Menge | Stadt   |
------------+-------------+-------+---------+
  168953    |   508800    |   2   | Berlin  |
------------+-------------+-------+---------+
  167996    |   508850    |   4   | München |
------------+-------------+-------+---------+
  FF8957    |   509010    |   1   | Berlin  |

编辑3:

OverflowException:模算术运算hat。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() in c:\Dev\ProductionCockpit\Produktionscockpit\default.aspx.cs:79 ) c:\Dev\ProductionCockpit\Produktionscockpit\default.aspx.cs:21中的Produktionscockpit.Home.Page_Load(对象发送方,EventArgs e) System.Web.UI.Control.LoadRecursive() +116 System.Web.UI.Page.ProcessRequestMain(布尔型includeStagesBeforeAsyncPoint,布尔型includeStagesAfterAsyncPoint) +2910

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-05-23 10:10:53

我读了一些关于这个的文章,在32位和64位之间连接有一个问题。您的应用程序正在为x86编译吗?假设您使用的是32位ODBC数据源.

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

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

票数 5
EN

Stack Overflow用户

发布于 2016-05-11 14:42:02

如果您正在接收一个ArithmeticOverflow,听起来.NET在确定Aufttrags Nr.列的类型时遇到了问题,并且猜错了。

如果这个列是一个Number,那么它可以映射到各种各样的.NET数据类型。

在将其输出为字符串之前,您可能会考虑通过Int64方法显式地将其读取为Convert.ToInt64()

代码语言:javascript
复制
s.abNR = Convert.ToInt64(reader["Auftrags Nr."]).ToString();

或者,如果您期望该值是一个浮点数,则可以尝试通过Decimal方法使用Convert.ToDecimal()

代码语言:javascript
复制
s.abNR = Convert.ToDecimal(reader["Auftrags Nr."]).ToString();

关于连接

由于您问题的标题显式地询问有关连接到FileMaker数据库的内容,所以您可以检查到确保连接字符串在这里是正确的。和下面的示例Filemaker连接字符串:

代码语言:javascript
复制
Driver=FileMaker Pro;AllAsText=0;ApplicationUsingThreads=1;FetchChunkSize=100;
FileOpenCache=0;IntlSort=0;MaxTextlength=255;ServerAddress=127.0.0.1;
TranslationOption=0;UseRemoteConnection=1;

虽然您的主要问题似乎与连接无关。

票数 3
EN

Stack Overflow用户

发布于 2016-05-20 11:08:35

您提供的堆栈跟踪System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i)促使我得出结论,问题在于该文本类型确实被ODBC GetSqlType识别。行为上的差异可以通过ODBC驱动程序的不同版本或默认设置来解释。检查两个环境中的版本和设置。

作为一项工作,你可以尝试把你的字段转换成一些已知的类型。例如,

代码语言:javascript
复制
SELECT CAST(C.[Aufrags Nr.] as NVARCHAR(MAX)) as [Aufrags Nr.], .... FROM CAR C

根据查询的SQL server (或ODBC源)选择适当的列类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37165695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档