Python从ODBC连接截断数字

2024-09-29 10:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在server2003上运行的生产系统,昨天/今天必须重建它,它与我们的AS400(DB2)通信。系统现在是Windows7x64。它使用ADO对象来实现这一点,连接字符串中的提供者被指定为MSDASQL,它使用系统数据源(dsn)。问题是数值被截断了。下面是简化的测试版本,其输出为注释(完整的脚本是为cast编写的数据字段()。值为float--这没有帮助):

Con = win32com.client.Dispatch("ADODB.Connection")    
Con.Open ("Provider=MSDASQL;DSN=AS400", "UserID", "Password")
Data = win32com.client.Dispatch("ADODB.Recordset")
Data.Open("SelectStatement", Con, 2, 3, 1)
val = str(Data.Fields("FieldName").Value)
print val  #prints 53, value is 53.750 in the database

val2 = 123.123 + 1
print val2  #prints 124.123 as expected

我在最后加入了val2作为一个健全的检查,以确保python没有错误地对待所有的数字。你知道吗

我编写了一个快速的C应用程序,它可以打开一个ODBC连接并打印一个数值。它打印正确的值:

using System;
using System.Collections.Generic;
using System.Data.Odbc;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                OdbcCommand cmd = new OdbcCommand("selectstatement", new OdbcConnection("dsn=as400;uid=pwd;pwd=pwd"));
                cmd.Connection.Open();
                var dr = cmd.ExecuteReader();
                dr.Read();
                var val = dr["fieldname"];
                Console.WriteLine(val); //prints 53.750 as expected
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

因此,这似乎不是DSN的错误配置,因为C#读取正确。供应商和我一样不知所措。有没有人知道下一步该去哪里找/尝试什么?我检查了ADOType属性,它打印4,这意味着它知道它也是一个单精度浮点。你知道吗


Tags: cmddata系统pwdvalopenprintscon