⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitmain.pas

📁 包含众多详细的delphi对数据库的访问代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
//本程序对于一些主要的控件比如TDatabase属性为了便于理解,都放在程序里,不需要这设计时作设置。
unit UnitMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, ADODB, Grids, DBGrids, StdCtrls, DBTables, Menus;

type
  TFormMain = class(TForm)
    Query1: TQuery;
    Database1: TDatabase;
    MainMenu1: TMainMenu;
    MenuItemWork: TMenuItem;
    ItemInStore: TMenuItem;
    ItemExit: TMenuItem;
    ItemEmployee: TMenuItem;
    ItemStore: TMenuItem;
    ItemGoods: TMenuItem;
    ItemStorage: TMenuItem;
    procedure ItemExitClick(Sender: TObject);
    procedure ItemInStoreClick(Sender: TObject);
    procedure ItemEmployeeClick(Sender: TObject);
    procedure ItemStoreClick(Sender: TObject);
    procedure ItemGoodsClick(Sender: TObject);
    procedure ItemStorageClick(Sender: TObject);
  private
    Function ChildFormExists(FormName: String):Boolean;
    { Private declarations }
  public
    constructor Create(AOwner: TComponent); override; //重载Form的Create构造函数。
    { Public declarations }
  end;

var
  FormMain: TFormMain;
  ServerName,UserName,Password:String;
  MainFormCreated:Boolean;
Function CheckTableIsExistsed:Boolean;

implementation
Uses UnitDataBaseInfo,UnitInStore,UnitEmployee, UnitStore, UnitGoods,UnitStorage,UnitFlash;
{$R *.DFM}

Function CheckTableIsExistsed:Boolean;
begin
  Result:=True;
  try
    With TQuery.Create(Application) do
    begin
      Try
        DatabaseName:=FormMain.Database1.DatabaseName;
        //检查商品数据表是否建立。
        SQL.Clear;
        SQL.Add('Select * from SysObjects Where Name="Goods"');
        //每个数据库的所有的表都在本数据库的SysObjects中有记录。
        Try
          Open;
        Except
          On E:Exception do
          begin
            ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
               '错误信息:'+E.Message);
            Raise;
          end;
        end;
        if IsEmpty then//如果返回结果集为空,则表示没有商品数据表。
        begin
          SQL.Clear;
          SQL.Add('CREATE TABLE Goods (');//创建数据表。
          SQL.Add('    [iNo] [INT] NOT NULL ,');   //关键字段。编号
          SQL.Add('    [sName] [varchar] (40) NULL ,');  //名称。为避免和数据的保留字冲突,建议字段名前类型缩写,比如用sName而不用Name做字段名。
          SQL.Add('    [sEName] [varchar] (40) NULL ,');     //英文名称
          SQL.Add('    [iUnit] [varchar] (6) NULL ,');   //单位。
          SQL.Add('    [fPrice] [varchar] (4) NULL)');       //单价。
          Try
            ExecSQL;
                    //这里用ExecSQL而不是用Open,是因为DataSet的Open方法只是用于打开SQL语是Select语句的返回结果集
                    //对于其它SQL语句因为没有返回集所以只能用ExecSQL来执行。

            SQL.Clear;
            SQL.Add('ALTER TABLE Goods WITH NOCHECK ADD');
            SQL.Add('         PRIMARY KEY  CLUSTERED ([iNo]) ON [PRIMARY]');
            ExecSQL;
            //创建主关键字段约束。一旦创建主关键字段约束,这个表中的主关键字段就是iNo,这个字段就不允许有重复。并且数据都会按照这个字段自动排序。
          Except
            On E:Exception do
            begin
              ShowMessage('创建商品数据表:Goods出错,请检查网络连接是否正常!'+#13#10+
                 '错误信息:'+E.Message);
              Raise;
            end;
          end;
        end;

        SQL.Clear;
        SQL.Add('Select * from SysObjects Where Name="Employee"');
        Try
          Open;
        Except
          On E:Exception do
          begin
            ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
               '错误信息:'+E.Message);
            Raise;
          end;
        end;
        if IsEmpty then
        begin
          SQL.Clear;
          SQL.Add('CREATE TABLE Employee (');                   //建立员工表。
          SQL.Add('    [iNo] [INT] NOT NULL ,');                //关键字段。编号
          SQL.Add('    [sName] [varchar] (40) NULL ,');     //姓名
          SQL.Add('    [sEName] [varchar] (40) NULL)');         //英文名。
          Try
            ExecSQL;
                    //这里用ExecSQL而不是用Open,是因为DataSet的Open方法只是用于打开SQL语是Select语句的返回结果集
                    //对于其它SQL语句因为没有返回集所以只能用ExecSQL来执行。
            SQL.Clear;
            SQL.Add('ALTER TABLE Employee WITH NOCHECK ADD');
            SQL.Add('         PRIMARY KEY  CLUSTERED ([iNo]) ON [PRIMARY]');
            ExecSQL;
            //创建主关键字段约束。
          Except
            On E:Exception do
            begin
              ShowMessage('创建员工数据表:Emploree出错,请检查网络连接是否正常!'+#13#10+
                 '错误信息:'+E.Message);
              Raise;
            end;
          end;
        end;

        SQL.Clear;
        SQL.Add('Select * from SysObjects Where Name="Store"');
        Try
          Open;
        Except
          On E:Exception do
          begin
            ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
               '错误信息:'+E.Message);
            Raise;
          end;
        end;
        if IsEmpty then
        begin
          SQL.Clear;
          SQL.Add('CREATE TABLE Store (');                        //建立仓库表。
          SQL.Add('    [iNo] [INT] NOT NULL ,');                  //关键字段。编号
          SQL.Add('    [sName] [varchar] (40) NULL ,');       //名称。
          SQL.Add('    [sEName] [varchar] (40) NULL)');           //英文名。
          Try
            ExecSQL;
                    //这里用ExecSQL而不是用Open,是因为DataSet的Open方法只是用于打开SQL语是Select语句的返回结果集
                    //对于其它SQL语句因为没有返回集所以只能用ExecSQL来执行。
            SQL.Clear;
            SQL.Add('ALTER TABLE Store WITH NOCHECK ADD');
            SQL.Add('         PRIMARY KEY  CLUSTERED ([iNo]) ON [PRIMARY]');
            ExecSQL;
            //创建主关键字段约束。
          Except
            On E:Exception do
            begin
              ShowMessage('创建仓库数据表:Store出错,请检查网络连接是否正常!'+#13#10+
                 '错误信息:'+E.Message);
              Raise;
            end;
          end;
        end;

        SQL.Clear;
        SQL.Add('Select * from SysObjects Where Name="Storage"');
        Try
          Open;
        Except
          On E:Exception do
          begin
            ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
               '错误信息:'+E.Message);
            Raise;
          end;
        end;
        if IsEmpty then
        begin
          SQL.Clear;
          SQL.Add('CREATE TABLE Storage (');                 //库存数据量表。
          SQL.Add('    [iStoreNo] [Int] NOT NULL ,');                   //仓库编号
          SQL.Add('    [iGoodsNo] [INT] NOT NULL ,');            //商品编号。
          SQL.Add('    [fQuantity] [Numeric] (8,2) NULL)');            //商品数量。
          Try
            ExecSQL;
            
            SQL.Clear;
            SQL.Add('ALTER TABLE Storage WITH NOCHECK ADD');
            SQL.Add('         PRIMARY KEY  CLUSTERED ([iStoreNo],[iGoodsNo]) ON [PRIMARY]');
            SQL.Add('ALTER TABLE Storage ADD');
            SQL.Add('         FOREIGN KEY ([iStoreNo]) REFERENCES Store ([iNo])');
            SQL.Add('ALTER TABLE Storage ADD');
            SQL.Add('         FOREIGN KEY ([iGoodsNo]) REFERENCES Goods ([iNo])');
            ExecSQL;
            //创建主关键字段约束和外键。
            //在SQL中,外键是指一个表(称之为关连表)中的某个字段(称之为关连字段)与另一个表(称之为被关连表)的某个字段(称之为被关连字段)关连,
            //当创建了外键约束后,关连表的每一个关连字段的记录值,都必须在被关连表中存在。而被关连表中被关连字段的值如果在关连表中存在,
            //则被关连表的这个记录的被关连字段值不允许修改,也不允许删除。

            //如果说主键约束主要是保证字段值的唯一性的话,外键约束就是为了保存整个数据库数据的完整性。

            //也就是说:InStoreMaster的员工编号字段不允许也不应该存在一个在Employee表中不存在的记录。
          Except
            On E:Exception do
            begin
              ShowMessage('创建仓库数据表:Store出错,请检查网络连接是否正常!'+#13#10+
                 '错误信息:'+E.Message);
              Raise;
            end;
          end;
        end;

        SQL.Clear;
        SQL.Add('Select * from SysObjects Where Name="InStoreMaster"');
        Try
          Open;
        Except
          On E:Exception do
          begin
            ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
               '错误信息:'+E.Message);
            Raise;
          end;
        end;
        if IsEmpty then
        begin
          SQL.Clear;
          SQL.Add('CREATE TABLE InStoreMaster (');                 //创建进仓单明细表。
          SQL.Add('    [iNo] [VARCHAR] (12) NOT NULL ,');                   //单号
          SQL.Add('    [dDate] [DateTime] NULL ,');            //商品编号。
          SQL.Add('    [iStore] [INT] NOT NULL ,');            //仓库编号。
          SQL.Add('    [iEmployee] [INT] NOT NULL)');            //员工。
          Try
            ExecSQL;
            
            SQL.Clear;
            SQL.Add('ALTER TABLE InStoreMaster WITH NOCHECK ADD');
            SQL.Add('         PRIMARY KEY  CLUSTERED ([iNo]) ON [PRIMARY]');
            SQL.Add('ALTER TABLE InStoreMaster ADD');
            SQL.Add('         FOREIGN KEY ([iEmployee]) REFERENCES Employee ([iNo])');
            ExecSQL;
            //创建主关键字段约束和外键。
            //在SQL中,外键是指一个表(称之为关连表)中的某个字段(称之为关连字段)与另一个表(称之为被关连表)的某个字段(称之为被关连字段)关连,
            //当创建了外键约束后,关连表的每一个关连字段的记录值,都必须在被关连表中存在。而被关连表中被关连字段的值如果在关连表中存在,
            //则被关连表的这个记录的被关连字段值不允许修改,也不允许删除。

            //如果说主键约束主要是保证字段值的唯一性的话,外键约束就是为了保存整个数据库数据的完整性。

            //也就是说:InStoreMaster的员工编号字段不允许也不应该存在一个在Employee表中不存在的记录。
          Except
            On E:Exception do
            begin
              ShowMessage('创建仓库数据表:Store出错,请检查网络连接是否正常!'+#13#10+
                 '错误信息:'+E.Message);
              Raise;
            end;
          end;
        end;

        SQL.Clear;
        SQL.Add('Select * from SysObjects Where Name="InStoreDetail"');
        Try
          Open;
        Except
          On E:Exception do
          begin
            ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
               '错误信息:'+E.Message);
            Raise;
          end;
        end;
        if IsEmpty then
        begin
          SQL.Clear;
          SQL.Add('CREATE TABLE InStoreDetail (');                 //创建进仓单明细表。
          SQL.Add('    [iNo] [VARCHAR] (12) NOT NULL ,');                   //单号
          SQL.Add('    [iGoodsNo] [INT] NOT NULL ,');               //商品编号。
          SQL.Add('    [fPrice] [Money] NULL ,');              //单价。
          SQL.Add('    [fQuantity] [Numeric] (8,2) NULL)');        //数量。
          Try
            ExecSQL;
            
            SQL.Clear;
            SQL.Add('ALTER TABLE InStoreDetail WITH NOCHECK ADD');
            SQL.Add('         PRIMARY KEY  CLUSTERED ([iNo],[iGoodsNo]) ON [PRIMARY]');
            SQL.Add('ALTER TABLE InStoreDetail ADD');
            SQL.Add('         FOREIGN KEY ([iGoodsNo]) REFERENCES Goods ([iNo])');
            SQL.Add('ALTER TABLE InStoreDetail ADD');
            SQL.Add('         FOREIGN KEY ([iNo]) REFERENCES InStoreMaster ([iNo])');
            ExecSQL;
            //创建主关键字段约束和外键。
            //在SQL中,外键是指一个表(称之为关连表)中的某个字段(称之为关连字段)与另一个表(称之为被关连表)的某个字段(称之为被关连字段)关连,
            //当创建了外键约束后,关连表的每一个关连字段的记录值,都必须在被关连表中存在。而被关连表中被关连字段的值如果在关连表中存在,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -