很奇怪的问题,关于access数据库的,急急急(200分)

  • 主题发起人 主题发起人 mally
  • 开始时间 开始时间
M

mally

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一段计算程序,需要比较高的精度,因此用了extended类型,本来这段程序的计算结果还是精确的,但是我程序里用到了adoconnection,连接到一个access数据库,只要这个adoconnection一打开,那么这段计算程序就不能准确计算了,就像是extended的变成double的精度一样.而且我试过,如果这个adoconnection连接的是sql server数据库则没有这个问题.也就是说捣乱的是access数据库,有没有解决办法啊?????
 
你是从库中取值然后计算吗?如果是,取值字段一定要是双精度类型(单精度不可以)。我遇到的是数据库字段定义成单精度,结果取出后,计算就不精确。不知道你是不是这种情况。
 
用currency类型
 
我刚才测试了,14位小数没有问题。你的数据库定义,明确指定了小数位数吗?
 
你程序中取ACCESS数据库字段数据类型的时候,代码的类型搞对了没有?还有ACCESS数据库中字段本身的数据类型都要搞对呀
 
我的计算代码里用的数字不少从数据库取出来的,和数据库一点关系都没有,本来这段代码工作好好的.一旦我在程序里把这个adoconnection打开,这段代码就工作不正常了.
 
代码是这样的,下面一个函数:
procedure calXY;
var
x , y : Extended;
a1,b1,a2,b2 : Extended;
A1X, A1Y,A2X, A2Y, B1X, B1Y, B2X, B2Y: Extended;
begin
A1X:=634874.161052602;
A1Y:=3159389.92453509';
A2X:=634874.161052601;
A2Y:=3159446.38660127;
B1X:=634874.128055474;
B1Y:=3159418.19057566;
B2X:=634953.939854369;
B2Y:=3159407.46828426;

a1 := (A1Y-A2Y)/(A1X-A2X);
b1 := (A2Y*A1X-A1Y*A2X)/(A1X-A2X);
a2 := (B1Y-B2Y)/(B1X-B2X);
b2 := (B2Y*B1X-B1Y*B2X)/(B1X-B2X);
x := (b2-b1)/(a1-a2);
y := a1*x+b1;
edit1.Text := floattostr(x);
edit2.Text := floattostr(y);
end;
计算的结果是X=634874.161052602,Y=3159418.18554688
但是我一旦在程序里运行下面的代码(打开一个adoconnection,连接上一个access数据库)后上面函数calXY的计算结果就变成了X=634874.161055284,Y=3159420!!!!我试过,如果这个adoconnection连接的是SQL server数据库,那么calXY不会受到影响.
with dm.ADOConnection do
begin
try
Connected := false;
ConnectStr := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+DBPath+';Persist Security Info=False;';
ConnectionString := ConnectStr;
Connected := true;
result := true;
except
result := false;
end;
end;
 
你再查查, 是不是别的地方有问题。
或者你直接将这两段代码剪出来新建一个工程看看,问题是不是依然存在。

个人认为:calXY与数据库连接之间没有任何关系,不可能会影响计算结果精度。
 
我单独建了一个项目,就只有这两个函数,但是还是这样。下面这个项目,两个button,先点击Button1,得到calXY的结果;再点击Button2,打开adoconnection连接,然后在点击Button1,calXY的结果就不一样了。很奇怪啊,怎么adoconnection连接会影响到系统计算精度的?如果adoconnection连接的是sql server数据库就不会这样。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
ADOConnection1: TADOConnection;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
x , y : Extended;
a1,b1,a2,b2 : Extended;
A1X, A1Y,A2X, A2Y, B1X, B1Y, B2X, B2Y: Extended;
begin
A1X:=634874.161052602;
A1Y:=3159389.92453509;
A2X:=634874.161052601;
A2Y:=3159446.38660127;
B1X:=634874.128055474;
B1Y:=3159418.19057566;
B2X:=634953.939854369;
B2Y:=3159407.46828426;

a1 := (A1Y-A2Y)/(A1X-A2X);
b1 := (A2Y*A1X-A1Y*A2X)/(A1X-A2X);
a2 := (B1Y-B2Y)/(B1X-B2X);
b2 := (B2Y*B1X-B1Y*B2X)/(B1X-B2X);
x := (b2-b1)/(a1-a2);
y := a1*x+b1;
edit1.Text := floattostr(x);
edit2.Text := floattostr(y);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
with ADOConnection1 do
begin
try
Connected := false;
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+'e:/myacc.mdb'+';Persist Security Info=False;';
Connected := true;
except
end;
end;
end;

end.
 
确实像你说的。刚才我测试了你给我的代码。
 
使用你一样的代码。
不连接数据库的时候
x=634874.161052601,y=3159418.1875
连接access数据库
x=634874.161055281,y=3159416
居然和你的都不同。(xp+D7)
 
ACCESS数据库字段数据类型支持double
 
换一种连接方法。就好了
 
var
aq:TAdoquery;
begin
aq:=TAdoquery.Create(nil);
try
aq.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+s
+';Persist Security Info=False';
except
end;

end;
 
修改连接是一样的。只是你这几组数据太特殊,随便修改以后就没有问题了。
 
Currency类型可以保证精度
 
后退
顶部