想设计这样一个软件:系统中只对ODBC编程,
当在用户机器上安装的时候,自动判断其操作系统中安装了何种数据库,并在相应的数据库引擎中创建数据库
我只知道delphi注册ODBC的方法,但是对整个思路很迷茫,知道的或有相应经验的提供一下思路啊~~~

解决方案 »

  1.   


    type
        USHORT          = Word;    SQLSMALLINT     = SHORT;
        SQLRETURN       = SQLSMALLINT;
        SQLINTEGER      = Longint;
        SQLHANDLE       = SQLINTEGER;
        SQLHENV         = SQLHANDLE;
        SQLUSMALLINT    = USHORT;
        SQLPCHAR        = PChar;const
        //  DLL名
        odbc32 = 'odbc32.dll';    SQL_SUCCESS             = 0;
        SQL_SUCCESS_WITH_INFO   = 1;
        SQL_INVALID_HANDLE      = -2;
        SQL_ERROR               = -1;
        SQL_NO_DATA             = 100;
        SQL_NO_DATA_FOUND       = SQL_NO_DATA;    SQL_FETCH_NEXT          = 1;
        SQL_FETCH_FIRST_USER    = 31;
        SQL_FETCH_FIRST_SYSTEM  = 32;
        SQL_FETCH_FIRST         = 2;    SQL_MAX_DSN_LENGTH      = 32;//  SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_INVALID_HANDLE, SQL_ERROR
    function SQLAllocEnv(var EnvironmentHandle: SQLHENV): SQLRETURN;
        stdcall; external odbc32 name 'SQLAllocEnv';function SQLFreeEnv(EnvironmentHandle: SQLHENV): SQLRETURN;
        stdcall; external odbc32 name 'SQLFreeEnv';//  SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE.
    function SQLDrivers(
         EnvironmentHandle: SQLHENV;
         Direction: SQLUSMALLINT;
         DriverDescription: SQLPCHAR;
         BufferLength1: SQLSMALLINT;
         var DescriptionLengthPtr: SQLSMALLINT;
         DriverAttributes: SQLPCHAR;
         BufferLength2: SQLSMALLINT;
         var AttributesLengthPtr: SQLSMALLINT): SQLRETURN;
         stdcall; external odbc32 name 'SQLDrivers';//  SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE.
    function SQLDataSources(
         EnvironmentHandle: SQLHENV;
         Direction: SQLUSMALLINT;
         ServerName: SQLPCHAR;
         BufferLength1: SQLSMALLINT;
         var NameLength1Ptr: SQLSMALLINT;
         Description: SQLPCHAR;
         BufferLength2: SQLSMALLINT;
         var NameLength2Ptr: SQLSMALLINT): SQLRETURN;
         stdcall; external odbc32 name 'SQLDataSources';//底下这个过程就能取得电脑上ODBC的所有连接
    procedure TMainDataModule.GetODBC;
    const
        BUF_MAX = 1024;
    var
        LEnvironmentHandle: SQLHENV;
        LDriverDescription: array[0..BUF_MAX] of Char;
        LDescriptionLengthPtr: SQLSMALLINT;
        LDriverAttributes: array[0..BUF_MAX] of Char;
        AttributesLengthPtr: SQLSMALLINT;
        LReturn: SQLRETURN;
        LText: String;
    begin
        try
            if (SQLAllocEnv(LEnvironmentHandle) = SQL_ERROR) then Exit;        try
                FillChar(LDriverDescription, SizeOf(LDriverDescription), 0);
                FillChar(LDriverAttributes, SizeOf(LDriverAttributes), 0);            LReturn := SQLDrivers(LEnvironmentHandle, SQL_FETCH_FIRST,
                     LDriverDescription, BUF_MAX + 1, LDescriptionLengthPtr,
                     LDriverAttributes, BUF_MAX + 1, AttributesLengthPtr);            while (LReturn <> SQL_NO_DATA_FOUND) do
                begin
                    LText := String(LDriverDescription);
                    if Pos('MySQL ODBC',LText) > 0 then
                    begin
                        MySQLODBC := LText;
                        Exit;
                    end;                FillChar(LDriverDescription, SizeOf(LDriverDescription), 0);
                    FillChar(LDriverAttributes, SizeOf(LDriverAttributes), 0);                LReturn := SQLDrivers(LEnvironmentHandle, SQL_FETCH_NEXT,
                         LDriverDescription, BUF_MAX + 1, LDescriptionLengthPtr,
                         LDriverAttributes, BUF_MAX + 1, AttributesLengthPtr);
                end;        finally
                SQLFreeEnv(LEnvironmentHandle);
            end;
        except
            on E:Exception do Exit;
        end;
    end;
      

  2.   

    再给你看个例子吧unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function BreakList(const ANullTerminateText: array of Char): String;
      end;
    type
        USHORT          = Word;    SQLSMALLINT     = SHORT;
        SQLRETURN       = SQLSMALLINT;
        SQLINTEGER      = Longint;
        SQLHANDLE       = SQLINTEGER;
        SQLHENV         = SQLHANDLE;
        SQLUSMALLINT    = USHORT;
        SQLPCHAR        = PChar;const
        //  DLL名
        odbc32 = 'odbc32.dll';    SQL_SUCCESS             = 0;
        SQL_SUCCESS_WITH_INFO   = 1;
        SQL_INVALID_HANDLE      = -2;
        SQL_ERROR               = -1;
        SQL_NO_DATA             = 100;
        SQL_NO_DATA_FOUND       = SQL_NO_DATA;    SQL_FETCH_NEXT          = 1;
        SQL_FETCH_FIRST_USER    = 31;
        SQL_FETCH_FIRST_SYSTEM  = 32;
        SQL_FETCH_FIRST         = 2;    SQL_MAX_DSN_LENGTH      = 32;//  SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_INVALID_HANDLE, SQL_ERROR
    function SQLAllocEnv(var EnvironmentHandle: SQLHENV): SQLRETURN;
        stdcall; external odbc32 name 'SQLAllocEnv';function SQLFreeEnv(EnvironmentHandle: SQLHENV): SQLRETURN;
        stdcall; external odbc32 name 'SQLFreeEnv';//  SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE.
    function SQLDrivers(
         EnvironmentHandle: SQLHENV;
         Direction: SQLUSMALLINT;
         DriverDescription: SQLPCHAR;
         BufferLength1: SQLSMALLINT;
         var DescriptionLengthPtr: SQLSMALLINT;
         DriverAttributes: SQLPCHAR;
         BufferLength2: SQLSMALLINT;
         var AttributesLengthPtr: SQLSMALLINT): SQLRETURN;
         stdcall; external odbc32 name 'SQLDrivers';//  SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE.
    function SQLDataSources(
         EnvironmentHandle: SQLHENV;
         Direction: SQLUSMALLINT;
         ServerName: SQLPCHAR;
         BufferLength1: SQLSMALLINT;
         var NameLength1Ptr: SQLSMALLINT;
         Description: SQLPCHAR;
         BufferLength2: SQLSMALLINT;
         var NameLength2Ptr: SQLSMALLINT): SQLRETURN;
         stdcall; external odbc32 name 'SQLDataSources';var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.BreakList(const ANullTerminateText: array of Char): String;
    var
        LStart: Integer;
        LBuffer: array[0..255] of Char;
        LText: String;
    begin
        LStart := 0;
        LText := ANullTerminateText;
        Result := LText;
        Inc(LStart, Length(LText) + 1);
        while (True) do
        begin
            FillChar(LBuffer, SizeOf(LBuffer), 0);
            Move(ANullTerminateText[LStart], LBuffer, SizeOf(LBuffer));
            LText := LBuffer;
            Inc(LStart, Length(LText) + 1);
            if (LText = '') then Break;
            Result := Result + ',' + AnsiQuotedStr(LText, '"');
        end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    const
        BUF_MAX = 1024;
    var
        LEnvironmentHandle: SQLHENV;
        LDriverDescription: array[0..BUF_MAX] of Char;
        LDescriptionLengthPtr: SQLSMALLINT;
        LDriverAttributes: array[0..BUF_MAX] of Char;
        AttributesLengthPtr: SQLSMALLINT;
        LReturn: SQLRETURN;
        LText: String;
    begin
        Memo1.Clear();    try
            if (SQLAllocEnv(LEnvironmentHandle) = SQL_ERROR) then Exit;        try
                FillChar(LDriverDescription, SizeOf(LDriverDescription), 0);
                FillChar(LDriverAttributes, SizeOf(LDriverAttributes), 0);            LReturn := SQLDrivers(LEnvironmentHandle, SQL_FETCH_FIRST,
                     LDriverDescription, BUF_MAX + 1, LDescriptionLengthPtr,
                     LDriverAttributes, BUF_MAX + 1, AttributesLengthPtr);            while (LReturn <> SQL_NO_DATA_FOUND) do
                begin
                    LText := String(LDriverDescription);// + '/' + BreakList(LDriverAttributes);
                    Memo1.Lines.Add(LText);                FillChar(LDriverDescription, SizeOf(LDriverDescription), 0);
                    FillChar(LDriverAttributes, SizeOf(LDriverAttributes), 0);                LReturn := SQLDrivers(LEnvironmentHandle, SQL_FETCH_NEXT,
                         LDriverDescription, BUF_MAX + 1, LDescriptionLengthPtr,
                         LDriverAttributes, BUF_MAX + 1, AttributesLengthPtr);
                end;        finally
                SQLFreeEnv(LEnvironmentHandle);
            end;
        except
            on E:Exception do Memo1.Lines.Add(E.Message);
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    const
        BUF_MAX = 1024;
    var
        LEnvironmentHandle: SQLHENV;
        LServerName: array[0..SQL_MAX_DSN_LENGTH] of Char;
        LNameLength1Ptr: SQLSMALLINT;
        LDescription: array[0..BUF_MAX] of Char;
        LNameLength2Ptr: SQLSMALLINT;
        LReturn: SQLRETURN;
        LText: String;
    begin
        Memo1.Clear();    try
            if (SQLAllocEnv(LEnvironmentHandle) = SQL_ERROR) then Exit;        try
                FillChar(LServerName, SizeOf(LServerName), 0);
                FillChar(LDescription, SizeOf(LDescription), 0);            LReturn := SQLDataSources(LEnvironmentHandle, SQL_FETCH_FIRST,
                     LServerName, SQL_MAX_DSN_LENGTH + 1, LNameLength1Ptr,
                     LDescription, BUF_MAX + 1, LNameLength2Ptr);            while (LReturn <> SQL_NO_DATA_FOUND) do
                begin
                    LText := String(LServerName) + '/' + BreakList(LDescription);
                    Memo1.Lines.Add(LText);                FillChar(LServerName, SizeOf(LServerName), 0);
                    FillChar(LDescription, SizeOf(LDescription), 0);                LReturn := SQLDataSources(LEnvironmentHandle, SQL_FETCH_NEXT,
                         LServerName, SQL_MAX_DSN_LENGTH + 1, LNameLength1Ptr,
                         LDescription, BUF_MAX + 1, LNameLength2Ptr);
                end;        finally
                SQLFreeEnv(LEnvironmentHandle);
            end;
        except
            on E:Exception do Memo1.Lines.Add(E.Message);
        end;
    end;end.
      

  3.   

    上面的程序在我电脑上的运行结果:
    Button1Click:
    SQL Server
    Microsoft Access Driver (*.mdb)
    Microsoft Text Driver (*.txt; *.csv)
    Microsoft Excel Driver (*.xls)
    Microsoft dBase Driver (*.dbf)
    Microsoft Paradox Driver (*.db )
    Microsoft Visual FoxPro Driver
    Microsoft FoxPro VFP Driver (*.dbf)
    Microsoft dBase VFP Driver (*.dbf)
    Microsoft Access-Treiber (*.mdb)
    Microsoft Text-Treiber (*.txt; *.csv)
    Microsoft Excel-Treiber (*.xls)
    Microsoft dBase-Treiber (*.dbf)
    Microsoft Paradox-Treiber (*.db )
    Microsoft Visual FoxPro-Treiber
    Driver do Microsoft Access (*.mdb)
    Driver da Microsoft para arquivos texto (*.txt; *.csv)
    Driver do Microsoft Excel(*.xls)
    Driver do Microsoft dBase (*.dbf)
    Driver do Microsoft Paradox (*.db )
    Driver para o Microsoft Visual FoxPro
    Microsoft ODBC for Oracle
    MySQL ODBC 3.51 DriverButton2Click:
    MS Access Database/Microsoft Access Driver (*.mdb)
    Excel Files/Microsoft Excel Driver (*.xls)
    dBASE Files/Microsoft dBase Driver (*.dbf)
    _iamp/MySQL ODBC 3.51 Driver
    Xtreme Sample Database 2005 CHS/Microsoft Access Driver (*.mdb)
    QT_Flight32/Microsoft Access Driver (*.mdb)
    LocalServer/SQL Server
      

  4.   

    1楼的代码很精彩,对我也很有用,但是,针对我的问题,是否能给我一个完整的解决方案呢?
    检测到某种数据库以后,就开始用sql建数据库,建表吗?
    那么基础数据,通过插入语句?
      

  5.   


    你检测到某种数据库后,可以在TADOConnection控件的ConnectionString属性里设置连接上数据库,
    我给你一段连接MYSQL 5.0数据库的语句吧
    DRIVER={MySQL ODBC 3.51 Driver};SERVER = 192.168.1.6;DATABASE = iamp;USER = WJH;PASSWORD = 123456;OPTION=3;如果你是要根据返回的数据库类型后用SQL语句去建数据库,可以再放一个TADOQuery控件,或者是动态创建也可以。
    底下是一段连接MSSQL数据库的语句:
    Provider=SQLOLEDB.1;Password=admroot5;Persist Security Info=True;User ID=sa;Initial Catalog=master;Data Source=.
    你在TADOConnection连接成功后,可以使用
    var
      TQuery : TADOQuery;
    begin 
      TQuery := TADOQuery.Create(nil);
      TQuery.Connection := TADOConnection;//TADOConnection这个你换成上面定义的名称就行
      TQuery.SQL.Text := '';//这里写创建数据库的语句
      try
          TQuery.ExecSQL;
      except
      end;
      //上面就创建好数据库后,然后你就可以进行创建表之类的操作了,后面我就不写了
    end;
      

  6.   

    ODBC不是直接在系统配置就可以了么