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

混世罗汉 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文件中,求你们了。
...全文
2051 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
已经找了大把贴子了,没有能解决的
内容概要:该文档为一段用于Google Earth Engine(GEE)平台的JavaScript代码脚本,旨在对研究区域(AOI)内的Landsat 8卫星影像进行土地利用/土地覆盖(LULC)分类。脚本首先筛选2024年云量低于10%的Landsat 8 Level-2地表反射率影像,构建中值合成影像并应用缩放因子校正。随后,基于预先定义的水体(Water)和植被(Vegetation)样本点,合并训练样本并提取影像对应波段数据,采用随机森林分类器(smileRandomForest)对影像进行监督分类。最后,通过划分训练集与测试集,输出混淆矩阵、总体分类精度和Kappa系数,完成分类结果的精度评估。; 适合人群:具备遥感图像处理基础知识的科研人员、地理信息系统(GIS)技术人员以及环境监测相关领域的研究生或专业人员;熟悉GEE平台基本操作者更佳; 使用场景及目标:①实现特定区域多光谱遥感影像的土地覆盖分类;②掌握GEE平台上从影像预处理、样本构建、模型训练到精度验证的完整分类流程;③支持水资源管理、生态环境监测等应用领域的空间数据分析; 阅读建议:此资源以实际代码形式呈现,建议结合GEE开发环境边运行边学习,重点关注影像预处理方法、训练样本构建逻辑、分类器参数设置及精度评估指标解读,便于迁移应用于其他区域或传感器数据。

7,785

社区成员

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

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