【问题标题】:Make a ODBC connection from a delphi-7 application throu ADOConnectionstring通过 ADOConnectionstring 从 delphi-7 应用程序建立 ODBC 连接
【发布时间】:2013-01-23 09:53:28
【问题描述】:

背景:

用 Delphi-7 或 -6 编写的应用程序(通过 .exe 文件进行搜索)。称为 Sigmanest。

我已经搬到了新的服务器上,剩下的是在 SQL 服务器下运行的 SigmaNest 数据库。经过数小时的故障排除将该数据库迁移到新服务器。问题已经涵盖了这个 SQL Server 应用程序的所有方面。默认情况下服务未启动,向导无法正常工作,缺少全文内容,可笑的很多地方都需要右键单击等等。丢失的东西还在继续。

目前我在新硬件上有一个带有数据库 SNDBase (sigmanest) 的工作 SQL 服务器,但无法从客户端连接。

这不可能是对的,我想并搜索了替代方案。在 MySQL 工作台中单击 4-5 次,然后我将它运行在测试 linux 盒子上...很好..

但现在问题来了。

SigmaNest 使用ini 文件进行配置。

所以在我找到的一个ini 文件中

; 1 = Paradox, 2 = MSSQLServer or MSDE
ADOConnectionString=Provider=SQLOLEDB.1;Data Source=ODIN\SIGMANEST;User ID=sigmanest;Password="";Persist Security Info=True;Initial Catalog=SNDBase;

Okej .. 在客户端安装 Mysql odbc 驱动并建立连接。到目前为止一切正常..

转到google,找到了mysql的ADOConnectionsstring ...

ADOConnectionString=DRIVER={MySQL ODBC 5.2a Driver};SERVER=192.168.100.19;PORT=3306;DATABASE=SNDBase;UID=sigmanest;PASSWORD=;OPTION=4;

但应用程序无法启动。只需返回 sigmanest 的 db 连接配置工具即可。

已将此发布到 SigmaTek,但我给出的唯一回复是一封邮件,其中包含通过 SQLOLEDB 用于 MS sql 服务器的 ADOConnection 字符串。

已搜索驱动器并没有找到 anny dbex*.dll 文件,这意味着它们不使用 dbExpress 组件(我的猜测)。

那么是否存在一些应用程序未附带的缺失 dll 文件。或者这种东西是在程序内部硬编码的?

有人知道如何进行吗?

或者我应该放弃 mysql 的梦想,去浪费空间的 sql server 后端。

每尼尔

PS。 SigmaNest.exe 有一个时间戳 2006-05-19 DS。

【问题讨论】:

  • 这个问题不属于这里,也许是超级用户?
  • 这是针对第三方应用程序的供应商支持问题(针对 SigmaTek),不适用于 StackOverflow。但是,1 = Paradox, 2 = MSSQLServer or MSDE 有标志的事实表明它必须是这三个之一 - MySQL MSSQLServer/MSDE(MSSQLServer/MSDE 是 Microsoft 产品,MySQL 不是,它们绝不是直接替代品彼此)。

标签: delphi delphi-7 delphi-6


【解决方案1】:

抱歉,我不知道该去哪里解决这个问题。可以这么说,stackoverflow 似乎把世界上所有有才华的人都聚集在了一个屋檐下。

Ken White:是的,你是对的,我不能在这个应用程序上使用 MySQL(经过数小时的谷歌搜索和测试)。

无论如何,我设法建立了这样的联系(也许某些东西对其他人有用,其中一些与 Delphi 相关)

  • 首先你要下载mysql连接器http://dev.mysql.com/downloads/connector/odbc/

  • 从控制面板-> 管理工具->“用户 DSN”选项卡下的数据源 (ODBC) 建立 ODBC 连接

  • 你用记事本新建一个文本文件。

  • 用扩展名 .udl 重命名文件

  • 双击它并填写对话框...

  • 在记事本中打开文件,你就有了 adoconnection 字符串。

但您的问题还没有结束。SQL 与 MySQL 的差异会使您的应用停止运行。例如,MySQL 中的布尔值被声明为 tinyint (0=false 1=true)

这里提到了一种解决方法http://www.i-logic.com/utilities/MySQL.htm

所以我的奋斗没有任何回报,但上面的一些可能会引起其他人的兴趣。

每尼尔斯..

【讨论】:

  • 我再次提起这个话题。这个旧应用程序再次出现问题并寻找悖论替换。该应用程序可以处理悖论和 ms sql。最好的选择是 firebird,但很难理解它的工作原理以及如何移动数据集。我只是想知道您可以在 MySQL 中做些什么来动态更改变量的类型?我的意思是当应用程序的 select 语句请求时在 boolean 和 tinyint 之间进行转换?
【解决方案2】:

ODBC 可以在运行时配置,下面是配置 ODBC 以使用 BDE 连接到 SQL Server 的示例。

unit uBDEConnectionSqlServer;

interface

uses
    DBTables, Windows, Classes, SysUtils;

type TBDEConnectionSqlServer = class(TComponent)
  private
    { Private declarations }
    function CreateOBDCConnection(dataBase : string; server: string):Boolean;


  public
    { Public declarations }
    Function CreateBDEConnection(dataBase: TDatabase; dataBaseName : string; server:string; userName:string; password:string): Boolean;

  end;
  
  const
      ODBC_ADD_DSN = 1; // Add data source
      ODBC_CONFIG_DSN = 2; // Configure (edit) data source
      ODBC_REMOVE_DSN = 3; // Remove data source
      ODBC_ADD_SYS_DSN = 4; // add a system DSN
      ODBC_CONFIG_SYS_DSN = 5; // Configure a system DSN
      ODBC_REMOVE_SYS_DSN = 6; // remove a system DSN
      ODBC_REMOVE_DEFAULT_DSN = 7; // remove the default DSN
      
  function SQLConfigDataSource(
        hwndParent: HWND;
        fRequest: WORD;
        lpszDriver: LPCSTR;
        lpszAttributes: LPCSTR): BOOL; stdcall; external 'ODBCCP32.DLL';

implementation

Function TBDEConnectionSqlServer.CreateBDEConnection(dataBase: TDatabase; dataBaseName : string; server:string; userName:string; password:string): Boolean;
var
  retorno: TDatabase;
Begin
  result := false;

  if (CreateOBDCConnection(dataBaseName, server) = true) then
  begin
    dataBase.AliasName := 'testedelphi';
    dataBase.LoginPrompt := False;
    dataBase.DatabaseName := 'testedelphi';
    dataBase.Params.Values['DATABASE NAME']       := dataBaseName;
    dataBase.Params.Values['USER NAME']           := userName;
    dataBase.Params.Values['ODBC DSN']            := dataBaseName;
    dataBase.Params.Values['OPEN MODE']           := 'READ/WRITE';
    dataBase.Params.Values['BATCH COUNT']         := '200';
    dataBase.Params.Values['LANGDRIVER']          := '';
    dataBase.Params.Values['MAX ROWS']            := '-1';
    dataBase.Params.Values['SCHEMA CACHE DIR']    := '';
    dataBase.Params.Values['SCHEMA CACHE SIZE']   := '8';
    dataBase.Params.Values['SCHEMA CACHE TIME']   := '-1';
    dataBase.Params.Values['SQLPASSTHRU MODE']    := 'SHARED AUTOCOMMIT';
    dataBase.Params.Values['SQLQRYMODE']          := '';
    dataBase.Params.Values['ENABLE SCHEMA CACHE'] := 'FALSE';
    dataBase.Params.Values['ENABLE BCD']          := 'FALSE';
    dataBase.Params.Values['ROWSET SIZE']         := '20';
    dataBase.Params.Values['BLOBS TO CACHE']      := '64';
    dataBase.Params.Values['BLOB SIZE']           := '32';
    dataBase.Params.Values['PASSWORD']            := password;
    result := true;
  end;
  
end;

function TBDEConnectionSqlServer.CreateOBDCConnection(dataBase : string; server: string):Boolean;
var
  resultado: BOOL;
begin
  Result := False;
  resultado := SQLConfigDataSource(
  0,
  ODBC_ADD_DSN,
  'SQL Server',
  PChar(
    'DSN='+dataBase+#0 +
    'SERVER='+server+#0 +
    'ADDRESS='+server+#0 +
    'NETWORK=dbmssocn'#0 +
    'DATABASE='+dataBase+#0 +
    'DESCRIPTION='+server+dataBase+#0 +
    #0
  )
  );

  if(StrToInt(BoolToStr(resultado)) <> 0) then
    Result := True;
end;

end.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多