我有一个在Server 2003上运行的生产系统,必须在昨天/今天重建,与我们的AS400(DB2)进行对话。该系统现在是Windows 7 x64。它使用ADO对象来完成此操作,连接字符串中的提供程序指定为MSDASQL,并使用系统数据源(dsn)。问题是数值被截断。这是剪切测试版本,其输出为注释(完整脚本编写为强制转换Data.Fields()。值为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#正确读取它。供应商就像我一样迷失了。有没有人对下一步的搜索/下一步尝试有什么想法?我检查了ADO Type
属性并打印出4,这意味着它知道它也是一个精度浮点数。