关于数据库问题(100分)

  • 主题发起人 主题发起人 xiongyi
  • 开始时间 开始时间
X

xiongyi

Unregistered / Unconfirmed
GUEST, unregistred user!
近日,看到一程序,没有设置databasename,却能读出当前目录下数据库的内容,
苦思几日不明其因,请大侠们指点!在此先行谢过!
 
一定是写在代码里面了
 
我仔细察看过代码,没有发现设置databasename的地方
 
ado 就不用database
 
xianjun:
能不能说得详细点
 
当然不需要用databasename啦!
你用TadoQuery,设置connectionstring就可以了。TadoTable也一样的哦!
 
给eric,youbin:
我用的是table。
 
你在运行程序时需要输入密码吗?这种方法是可行的,但不可取,设置了DataBase要好一些.
你可以做一个实验:放一个TABLE在表单上,只在DATABASENAME中选好你要的那个ALIAS NAME,
(就是BDE中设定好的数据源)最好就是上面的那个程序用到的.然后直接去选TABLENAME,选
定好后,再ACTIVE:=TRUE,看看能不能用.这儿就不需要TDATABASE.
或者是他动态建立一个TDATABASE,放在另外一个UNIT中,你这表单中用到它.
 
给zhangkan:
可能是我没说清楚
我不是要求怎么读数据库内容,而是有一程序,没有设置database中的ALIAS NAME,却能读当前目录下数据库
内容,我不明白人家是怎么做的?
 
可能是ADO
 
不设置database中的ALIAS NAME,有些数据库直接用目录代替也可以的,有点记不得了,好象如此
 
用BDE也中以不用DATABASENAME的呀!!
你可以用TDatabase动态创建一个DATABASE就可以的呀!
我们的软件就是这样的!
 
用的是ado吧
 
Session.AddStandardAlias('Cntssamp','c:/delphp11','Paradox');
 
你说的是单表吧!
在页面上加一个TDatabase控件,在DatabaseName位置随便填一个未用到的名字。
如:
DatabaseName=AAA
DriverName=STANDARD
在params中不设置任何参数,则默认为当前路径;如果要指定到某一路径下,则采用
Params.Add('Path=d:/xxxxxx');
最后连接到可。
 
我将主程序及DATAMODE表单内容贴上,请帮我分析分析!
主程序:
unit MainPas;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
DBTables, Dialogs, Menus, ComCtrls, ExtCtrls, ToolWin, StdCtrls;

type
TA00Form = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N22: TMenuItem;
procedure InputClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
A00Form: TA00Form;

implementation

uses DataMode, MInput;

{$R *.dfm}

procedure TA00Form.InputClick(Sender: TObject);
begin
if MDIChildCount > 0 then MDIChildren[0].Close;
Application.CreateForm(TForm1, Form1);
end;

procedure TA00Form.FormCreate(Sender: TObject);
begin
SetMenu(Handle, MainMenu1.Handle);
Application.CreateForm(TDM, DM);
end;
end.

DATAMODE表单内容:
Unit DataMode;

interface

uses
Windows, Forms, BDE, SysUtils, Classes, DB, DBTables, Dialogs, Variants;

type
TDM = class(TDataModule)
Money: TTable;
Custom: TTable;
MIndex: TTable;
SendIn: TTable;
QSendIn: TQuery;
QSendOut: TQuery;
QMIndex: TQuery;
MoneyS: TDataSource;
CustomS: TDataSource;
MIndexS: TDataSource;
SendInS: TDataSource;
QSendInS: TDataSource;
QSendOutS: TDataSource;
QMIndexS: TDataSource;
SendOut: TTable;
SendOutS: TDataSource;
Save01: TTable;
Save01S: TDataSource;
QSave01: TQuery;
QSave01S: TDataSource;
QArrive: TQuery;
QArriveS: TDataSource;
CSendIn: TQuery;
CSendOut: TQuery;
CArrive: TQuery;
CSendInS: TDataSource;
CSendOutS: TDataSource;
CArriveS: TDataSource;
CMoney: TQuery;
CMoneyS: TDataSource;
Query1: TQuery;
DataSource4: TDataSource;
procedure IncSave01(DataSet: TDataSet);
procedure DecSave01(DataSet: TDataSet);
procedure SendInAfterEdit(DataSet: TDataSet);
procedure SendOutAfterEdit(DataSet: TDataSet);
procedure SendInBeforeCancel(DataSet: TDataSet);
procedure SendInBeforeDelete(DataSet: TDataSet);
procedure SendInBeforePost(DataSet: TDataSet);
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

procedure PackTable(Table: TTable);
Const
IDField: String = '编号';
var
DM: TDM;

implementation

{$R *.dfm}

procedure PackTable;
//DbiPackTable(Table1.DBHandle, Table1.Handle, nil, szdBASE, True);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
Table.Exclusive := True;
Try
Table.Open;
HDb := Table.Database.Handle;
DbiGetCursorProps(Table.Handle, Props);
Table.Close;
if (Props.szTableType = szPARADOX) then begin
FillChar(TableDesc, sizeof(TableDesc), 0);
StrPCopy(TableDesc.szTblName, Table.TableName);
StrPCopy(TableDesc.szTblType, Props.szTableType);
TableDesc.bPack := True;
DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False);
End;
Except
Showmessage('因故无法整理数据库:' + Table.TableName);
End;
end;

procedure TDM.IncSave01(DataSet: TDataSet);
begin
if Save01.Locate(IDField,DataSet[IDField],[]) Then Save01.Edit Else
Begin
Save01.Append;
Save01[IDField] := DataSet[IDField];
Save01['数量'] := 0;
Showmessage('新入药品');
End;
Save01['数量'] := Save01['数量'] + DataSet['数量'];
Save01.Post;
end;

procedure TDM.DecSave01(DataSet: TDataSet);
begin
if not Save01.Locate(IDField,DataSet[IDField],[]) then
Begin
Showmessage('该产品没有库存,无法出货');
Abort;
Exit;
End;
Save01.Edit;
Save01['数量'] := Save01['数量'] - DataSet['数量'];
Save01.Post;
end;

procedure TDM.SendInAfterEdit(DataSet: TDataSet);
begin
Save01.Locate(IDField,DataSet[IDField],[]);
Save01.Edit;
if Dataset = SendIn Then
Save01['数量'] := Save01['数量'] - DataSet['数量']
else
Save01['数量'] := Save01['数量'] + DataSet['数量'];
Save01.Post;
end;

procedure TDM.SendOutAfterEdit(DataSet: TDataSet);
begin
Save01.Locate(IDField,DataSet[IDField],[]);
Save01.Edit;
Save01['数量'] := Save01['数量'] + DataSet['数量'];
Save01.Post;
end;

procedure TDM.SendInBeforeCancel(DataSet: TDataSet);
begin
if Dataset.State = dsInsert Then Exit;
IncSave01(DataSet);
end;

procedure TDM.SendInBeforeDelete(DataSet: TDataSet);
begin
if DataSet[IDField] = null then Exit;
if not Save01.Locate(IDField,DataSet[IDField],[]) then Begin
if IDNo = MessageBox(Application.Handle,'无法删除库存部分数据,继续吗?',
'系统提示', MB_YESNO) then Abort;
Exit;
End;
Save01.Edit;
if Dataset = SendIn Then
Save01['数量'] := Save01['数量'] - DataSet['数量']
else
Save01['数量'] := Save01['数量'] + DataSet['数量'];
Save01.Post;
end;

procedure TDM.SendInBeforePost(DataSet: TDataSet);
begin
if DataSet[IDField] = null then Abort;
end;
end.
 
给zhangkan:
程序已发,请查收!
 
给ZHANGKAN:
不管结果如何,向你表示感谢!毕竟我是第一次在DFW上提问.
同时,向所有热心的DFW表示感谢!
(解决问题后,在给大家加分)
 
后退
顶部