使用如下方法,当执行到SQLDriverConnect的时候出现一个Dialog Box,选中一个数据源,输入登陆密码,按确定后立即崩溃,想请教一下原因或者是否有地方做的不对:Dim strOut As String
Dim nOut As Integer
Dim nRes As Integer
Dim hConn As Long
Dim hEnv As Long
           
nRes = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, hEnv)
nRes = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, 0)
nRes = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, hConn)
    
strOut = Space(200)
'这里输入的连接字符串可以为空吗?
nRes = SQLDriverConnect(hConn, Me.hwnd, "", 0, strOut, 150, nOut, SQL_DRIVER_PROMPT)...程序中用到的常量我都查过了,肯定没有错。

解决方案 »

  1.   

    咿呀,我又试了一下,SQLDataSources函数也返回同样的错误(我的目的就是要遍历当前机器上的数据源),我用VC试了一下是好的,但是发现SQLCHAR实际上是byte数组而不是string,我用byte数组以后不崩溃了,但是返回的东西是一堆0。
    我想问一下如果要传递byte数组的指针是不是应该声明为
    byref bName() as byte
    这种形式?还是应该用byval?
    (ps:我刚刚从c++转过来不久,还不太熟悉VB。)
      

  2.   

    你试试
    global gihdb as long
    dim myresult as integer
    dim myconnection as string
    dim mybuff as string *256
    dim mybufflen as integermyconnection="dsn=sqlperson;uid=;pwd=;app=odbstest;wsid=lci;database=people"
    myresult=sqldriverconnect(gihdb,test,form1.hwnd,myconnection,len(myconnection),mybuff,256,mybufflen,sql_driver_complete_requied)
      

  3.   

    谢谢楼上!!
    把所有的handle都设成global了,SQLAllocHandle还是不能省,但是myconnection如果全部正确的话还是会崩掉,myconnection错误的话就返回-2了。
    使用PROMPT则是全部输入结束以后崩的,看上去是填充到那个输出缓冲(mybuff)的时候出错(我怀疑是不是底层有一些不安全的操作)。
    郁闷……
      

  4.   

    哈哈,用了个无耻的方法搞定了,我用LocalAlloc先得到一个Handle,然后用这个Handle作为buffer的指针去调用SQLDriverConnect,没有问题,获得我要的connectString。然后我用SetWindowText把这个Handle指向的内存中的字符串输出到某个form1的标题,然后再用form1.Caption读进来就搞定了。
    估计用文件也可以,如果不输出的话直接写到配置文件就得了。
    太麻烦了,SQLDriverConnect底层肯定做了什么特殊的字符串操作,vb的string不支持才会出错的。