客户端没有装DELPHI(BDE)、MSSQL,单靠ODBC可以连吗?如果可以,那么我把ODBC对注册表的写入用程序来实现,客户端不就可以不用设置ODBC了吗?
哪位大虾能回答我上面的问题,我在线等待!(注:程序没有用ADO开发)

解决方案 »

  1.   

    做安装程序是将BDE驱动程序一并打包,并且在注册表中配置ODBC。
      

  2.   

    用ODBC很方便的;
    你可以用SQLCONFIGDATASOUCE来搞定;
      

  3.   

    BBS水木清华站∶精华区
    发信人: cuterat (学习的革命), 信区: VisualBasic        
    标  题: Re: 如何用程序实现ODBC的连接即自动生成一个数据源? 
    发信站: BBS 水木清华站 (Wed Feb 24 12:09:21 1999) 
     
     
    我不赞成读写注册表定制 DSN 
    调用ODBC32 API 比较好 
    例子: 
     
    在模块文件中的API和常数声明: 
     
    Public Const ODBC_ADD_DSN = 1 
    Declare Function SQLConfigDataSource Lib "odbccp32.dll" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Boolean 
     
    在窗体上加command button:cmdReg 
     
    Private Sub cmdReg_Click() 
        Dim szDriver As String 
        Dim szAttributes As String 
        Dim retcode As Boolean 
         
        szAttributes = "DSN=my65dsn" & Chr(0) _ 
            & "DESCRIPTION=SQLConfigDSN Sample" & Chr(0) _ 
            & "SERVER=Myserver" & Chr(0) _ 
            & "ADDRESS=192.168.64.67,1433" & Chr(0) _ 
            & "NETWORK=dbmssocn" & Chr(0) _ 
            & "DATABASE=pubs" & Chr(0) 
         
        szDriver = "SQL Server" & Chr(0) 
        retcode = SQLConfigDataSource(Me.HWND, ODBC_ADD_DSN, szDriver, szAttributes) 
    End Sub 
     
    如果参数 lpszAttributes 给出的参数不够完备,会弹出对话窗体。 
     
    -- 
    ※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.112.29.185] BBS水木清华站∶精华区
      

  4.   

    Delphi数据库编程技巧  
      
       提供  Delphi是当前流行的编程语言之一,它具有强大的数据库功能。在使用过程中有很多技巧性问题,问题其实不难,但是要一个简单的解决方案,可能也破费思量,下文就此做了一写些简单介绍。  1.  如何动态设置ODBC源    很多时候程序员需要自动生成ODBC数据源,而不是指导客户"打开控制面板…  …  ",到底如何去做呢?相信很多人会选择编程修改注册表来实现这项功能,因为ODBC的详细信息全部存放在注册表的下述键值内:  "HKEY_LOCAL_MACHINESOFTWAREODBC"  修改一下ODBC的配置,通过前后的注册表比较,你可以发现一定的规律。在这里我只是想说,哥们,别这么犯傻了(如果我让你写一个通用的ODBC源处理程序,你得累死),用这个Windows  ODBC  API函数吧,  function  SQLConfigDataSource(hwndParent:  Integer;  fRequest:  Integer;  
    lpszDriverString:  String;  lpszAttributes:  String):  Integer;  
    stdcall;external  ’ODBCCP32.DLL’;    了解数据库编程的朋友都知道,数据库的访问方式不论DAO、ADO、ODBC或是BDE或是其它第三方的数据库连接控件,归根结底,都是一些个函数集,只要你愿意,你可以编写出自己的数据库访问方式用以替代。深入研究这些底层函数,很多时候会为你提供相当地便利。  
      SQLConfigDataSource这个函数MSDN有详细的说明,我不想整段翻译下来让你扁我,我只是结合流行的SQL  Server谈谈如何有技巧的调用该函数。其它的数据库大同小异。    SQLConfigDataSource(0,  ODBC_ADD_SYS_DSN,’SQL  Server’,  
      ’DSN=Record_ODBC’+  chr(0)  +  
      ’Server=(local)’+  chr(0)  +  
      ’Database=master’+  chr(0)  +  
      ’Description=DragonPC  SQLServer  ODBC  Source’+  chr(0));    这是我的Delphi程序中调用该函数的一个实例,第一个参数是父窗口句柄,设置为0则该函数不显示任何对话框。第二个参数是操作类型,你需要定义如下的操作类型常量:  Const  
      ODBC_ADD_DSN  =  1;  //  Add  a  new  user  data  source.  
      ODBC_CONFIG_DSN  =  2;  //  Configure  (modify)  an  existing  user  data  source.  
      ODBC_REMOVE_DSN  =  3;  //  Remove  an  existing  user  data  source.  
      ODBC_ADD_SYS_DSN  =  4;  //  Add  a  new  system  data  source.  
      ODBC_CONFIG_SYS_DSN  =  5;  //  Modify  an  existing  system  data  source.  
      ODBC_REMOVE_SYS_DSN  =  6;  //  Remove  an  existing  system  data  source.    从名字我们知道,要添加ODBC源,我们需要调用的是ODBC_ADD_SYS_DSN  或是ODBC_ADD_DSN参数。第三个参数也没有什么好说的,我们添加的是SQL  Server数据库的ODBC源,所以填入’SQL  Server’参数,如果需要建立Excel文件的ODBC数据源,我们可以填入’Excel  Files  (*.xls)’,这些字符串参数相信各位同志在添加ODBC源时,已经多次见过。  
    关键的是第三个参数的设置,不同的数据库类型所支持的关键字是不一样的,这里仅仅就SQL  Server所支持的关键字作一个简单说明:  
      DSN:你的ODBC数据源名称。  
      Server:你的数据库服务器名称,使用(local)指的是本地计算机安装的数据库。注:最新的SQL  Server  2000支持一台计算机运行多个SQL  Server服务,这个时候你需要指定SqlSever的InstanceName。  
      Address:指定SQL  Server服务器的网络IP地址。  
      Database:指定默认数据库名称。  
      Language:指定默认语言。  
      Description:备注信息。    详细的参数和信息可以查阅微软网站的以下网址。  
      http://msdn.microsoft.com/library/psdk/dasdk/odch3kit.htm  
      http://msdn.microsoft.com/library/psdk/sql/od_odbc_c_99yd.htm  2.  如何动态设置BDE别名    这个问题其实是考察程序员对BDE的TSession组件的熟悉程度,一个数据库程序的建立,即使你没有显式的添加TSession组件,系统中依然存在一个名字为Session的TSession对象,你可以在任何位置调用该对象的方法和属性。TSession类的很多方法可以帮助我们的应用程序获取系统BDE环境,下面介绍一个代码片断用以添加一个BDE别名:    var  
      BDEList  :  TStringList  ;  
      ...  
      begin  
      ...  
      BDEList  :=  TStringList.Create  ()  ;  
      try  
      Session.GetAliasNames(BDElist)  ;  //  获取系统所有BDE别名列表  
      if  BDEList.IndexOf(’DragonPC’)=  -1  then  begin  //  如果没有我们的BDE别名"DragonPC"  
      BDEList.Clear  ;  
      BDEList.Add(’SERVER  NAME=’  +  ’SQLServerName’));  //  数据库服务器名称  
      BDEList.Add(’DATABASE  NAME=master’)  ;  //  默认数据库  
      BDEList.Add(’USER  NAME=sa’);  //  用户名  
      Session.AddAlias(’DragonPC’,  ’MSSQL’,  BDEList)  ;  //  添加一个MSSQL类型的BDE别名  
      ShowMessage(’系统即将建立BDE别名!’)  ;  
      Session.SaveConfigFile()  ;  //  存储BDE配置  
      end;  
      finally  
      BDEList.Free  ;  
      end;    这么简单,用户就可以随时建立、删除和修改BDE别名(有兴趣的朋友可以查看TSession组件的源代码,看看调用了哪些BDE函数)。另外像DeleteAlias,ModifyAlias,GetDatabaseNames,GetDriverNames,GetStoredProcNames,GetTableNames,GetPassword等等TSession类的方法,使用起来非常简单,通过Delphi的随机帮助,读者可以试着自己调用一下看看。通过对Session的灵活应用,再配合我下面将要提到的扑捉SQL异常的技巧,你完全可以写一个媲美SQL  Explorer的通用数据库查询工具。  3.  如何扑捉运行SQL语句时的错误    老是有朋友在开发一些开放的数据库接口(比如Delphi的SQL  Explorer工具)时发愁,既然是开放的,当然需要允许用户使用SQL语句访问数据库,这些还好办,一旦用户的运行SQL语句出现错误,程序员如何扑捉该异常呢?很简单,看看下面的函数:  Const  
      ExecSQLMode  =  0  ;  
      OpenSQLMode  =  1  ;  
      ResultRight  =  ’SQL  query  result  is  right’  ;  
      ...  
      function  RunSql(RunQuery:  TQuery;  Sqls:  TStringList;  var  ErrorMsg:  string;  
      Mode:  integer)  :  integer  ;  
      begin  
      ErrorMsg  :=  ResultRight  ;  
      Result  :=  0  ;  
      try  
      RunQuery.DatabaseName  :=  ’RecordDB’  ;  
      RunQuery.SQL.Clear()  ;  
      RunQuery.SQL.AddStrings(Sqls)  ;  
      if  Mode  =  ExecSQLMode  then  
      RunQuery.ExecSQL()  
      else  
      RunQuery.Open()  ;  
      except  
      on  e:exception  do  
      ErrorMsg  :=  e.Message  +  #13  +  #10  +’---  错误是俺发现的  ---’  ;  
      end;  
      end;    朋友看明白了吧,我的函数很简单,将SQL语句代码段作为参数传递给TQuery组件,通过设置查询方式(ExecSQLMode、OpenSQLMode)来处理有结果集返回的数据查询语句(select)或是没有结果集返回的数据操作语言(update、delete、insert、create等)。而异常的扑捉呢,我们扑捉所有异常的老祖宗Exception,因为Delphi的所有异常都是从Exception继承下来的,这样一个简单的SQL语句运行和异常处理函数就完成了,一旦返回的ErrorMsg的值不是ResultRight,ErrorMsg就会返回异常的信息,程序员就可以加以判断以处理不同的情况。