遇到“无效的授权说明”这种错误问题的兄弟来一下!

混世罗汉 2007-05-12 10:37:29
用vb连接sqlserver2000,用以下语句能正常访问:

cn.Open "Provider=SQLOLEDB;Data Source=localhost;User ID=savesms;Password=savesms;Initial Catalog=savesms;Persist Security Info=True"

现在公司要求服务器名、数据库名、登录用户和密码要从.ini文件中读取,现在读取ini文件里的变量没有问题,可连接语句改成下面的就有提示:无效的授权说明

cn.Open "Provider=SQLOLEDB;Data Source=" & tempserver1 & " ;User ID=" & tempusername1 & " ;Password=" & tempuserpassword1 & " ;Initial Catalog= " & tempdatabasename1 & " ;Persist Security Info=True"

更奇怪的是 tempserver1,tempusername1等4个变量的值都已经得到了,就是读出来了。还是不能正常执行这条sql语句,

一定非要把:
tempserver1 = "localhost"
tempusername1 = "sa"
tempuserpassword1 = "ren"
tempdatabasename1 = "savesms"
这样的赋值变量写上才能正常执行sql语句,晕,请高手们给个说法。
公司要求 不能把数据库都配置说明直接写入程序,要可以自己控制,所以要写在.ini文件中,求你们了。
...全文
1953 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2007-05-14
  • 打赏
  • 举报
回复
//为什么要定义为定长的?你的数据不是太多,定义为变长的也不会影响运行速度,还会减少出错的可能

不管怎么定义,都要为字串分配缓冲区,不进行处理的话,是一样会出错的
diclover 2007-05-14
  • 打赏
  • 举报
回复
为什么要定义为定长的?你的数据不是太多,定义为变长的也不会影响运行速度,还会减少出错的可能.
rainstormmaster 2007-05-14
  • 打赏
  • 举报
回复
果然,问题就出在ini文件的读取上,我以tempusername变量为例说明一下,其余的你类似修改:
在你的程序中,先定义了:
Dim tempusername As String * 50
这样是没有问题的
然后,取出数据到缓冲区:
getusername = GetPrivateProfileString(lpAppName, susername, lpDefault, tempusername, Len(tempserver), lpFileName)
这个也是没问题的(不过,最好把Len(tempserver)改为Len(tempusername),这是个习惯问题)

问题在于,取出字串后tempusername除了包含正常的数据("sa")外,其结尾还有一连串的chr(0),也就是说,尽管看起来用msgbox 或debug.print输出的字串显示为 "sa",但实际上,他们并不相等(可以用MsgBox tempusername = "sa"看看是否返回true)
解决办法:
dim s as string
s = Left(tempusername, InStr(1, tempusername, Chr(0)) - 1)
或者
s=left(tempusername,getusername)
或者
s = Replace(tempusername, Chr(0), "")
总之,不管用什么办法,把字串结尾的chr(0)结尾去掉就行
rainstormmaster 2007-05-14
  • 打赏
  • 举报
回复
我建议你认真看一下我上面的回复
rainstormmaster 2007-05-14
  • 打赏
  • 举报
回复
//大哥辛苦了,但我不知道如何为字串分配缓冲区??

你已经分配了:Dim tempusername As String * 50

//我用了trim ,好像没什么用

肯定没用,多出来的不是空格,而是chr(0)
混世罗汉 2007-05-14
  • 打赏
  • 举报
回复
我用了trim ,好像没什么用?
混世罗汉 2007-05-14
  • 打赏
  • 举报
回复
都要为字串分配缓冲区,不进行处理的话,是一样会出错的???

大哥辛苦了,但我不知道如何为字串分配缓冲区??
混世罗汉 2007-05-14
  • 打赏
  • 举报
回复
关键就是: cn.Open "Provider=SQLOLEDB;Data Source=" & Trim(tempserver) & ";User ID=" & Trim(tempusername) & ";Password=" & Trim(tempuserpassword) & ";Initial Catalog= " & Trim(tempdatabasename) & ";Persist Security Info=True"

执行时,提示:无效的授权说明,tempserver等变量,换成具体的值 就可以了。唉,从没遇到过这种问题,请大侠们指导
混世罗汉 2007-05-14
  • 打赏
  • 举报
回复
楼上的老大,放在ini文件中的相关参数,在我的程序中能正确地读出来。我用 msgbox tempserver ,能正确显示localhost,共他也一样,应该说读Ini文件没有问题,我把读ini文件源码放出:

'------------------------------配置文件变量
Dim getusername As Long
Dim getuserpassword As Long
Dim getserver As Long
Dim getdatabasename As Long

Dim tempusername As String * 50
Dim tempuserpassword As String * 50
Dim tempserver As String * 50
Dim tempdatabasename As String * 50


Dim susername As String, suserpassword As String, sserver As String, sdatabasename As String


'--------------读配置文件 ini

File = App.Path & "\config.ini"

lpAppName = "Data" '主题键

sserver = "server"
sdatabasename = "databasename"
susername = "username"
suserpassword = "userpassword"


lpDefault = 0
lpFileName = File

getserver = GetPrivateProfileString(lpAppName, sserver, lpDefault, tempserver, Len(tempserver), lpFileName)
getdatabasename = GetPrivateProfileString(lpAppName, sdatabasename, lpDefault, tempdatabasename, Len(tempserver), lpFileName)
getusername = GetPrivateProfileString(lpAppName, susername, lpDefault, tempusername, Len(tempserver), lpFileName)
getuserpassword = GetPrivateProfileString(lpAppName, suserpassword, lpDefault, tempuserpassword, Len(tempserver), lpFileName)


...

'实例化Connection对象
Set cn = New ADODB.Connection
cn.CursorLocation = adUseClient

cn.Open "Provider=SQLOLEDB;Data Source=" & Trim(tempserver) & ";User ID=" & Trim(tempusername) & ";Password=" & Trim(tempuserpassword) & ";Initial Catalog= " & Trim(tempdatabasename) & ";Persist Security Info=True"

rainstormmaster 2007-05-13
  • 打赏
  • 举报
回复
顶什么顶啊,你的ini文件读取部分可能有问题,贴出来啊
混世罗汉 2007-05-13
  • 打赏
  • 举报
回复
再顶
lsftest 2007-05-12
  • 打赏
  • 举报
回复
估计是trim之类的问题,最简单的:

s="Provider=SQLOLEDB;Data Source=" & tempserver1 & " ;User ID=" & tempusername1 & " ;Password=" & tempuserpassword1 & " ;Initial Catalog= " & tempdatabasename1 & " ;Persist Security Info=True"

debug.print s="Provider=SQLOLEDB;Data Source=localhost;User ID=savesms;Password=savesms;Initial Catalog=savesms;Persist Security Info=True"
rainstormmaster 2007-05-12
  • 打赏
  • 举报
回复
//公司要求 不能把数据库都配置说明直接写入程序,要可以自己控制,所以要写在.ini文件中,求你们了。
你把:
tempserver1 = "localhost"
tempusername1 = "sa"
tempuserpassword1 = "ren"
tempdatabasename1 = "savesms"
都放入ini文件中,定义好4个变量后,读取ini不就行了吗?

至于你说的
//更奇怪的是 tempserver1,tempusername1等4个变量的值都已经得到了,就是读出来了。还是不能正常执行这条sql语句,

我估计是字串处理的有问题
混世罗汉 2007-05-12
  • 打赏
  • 举报
回复
已经找了大把贴子了,没有能解决的

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧