关于ConnectionString的问题,解析PWD和UID(不简单!)(200分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
已知一ConnectionString如'DSN=MYDB;UID=AAA;PWD=qwert;......',
要求解析出DSN,UID,PWD。

似乎非常容易:我通过替换';'字符为','后,利用TStringList的CommaText将其分割,然后查询是否有'DSN',
'UID','PWD'开始的字符串,解析出结果。

但是现在问题来了,PWD,也就是说密码,其本身就有可能包含';',这是我将如何处理?
根据ADO的链接生成器,现有如下的可能情况:
1.'DSN=MYDB;PWD=qwert;UID=admin;',密码为'qwert;'
2.'DSN=MYDB;PWD=;UID=admin;',密码为';'
3.'DSN=MYDB;UID=admin;',密码为''
4.'DSN=MYDB;PWD=a;a;UID=admin;',密码为'a;a'或者'a;a;'
第4种情况是最奇怪的,不同的密码,生成的链接字符串却是相同的,
我真搞不懂ado是如何做的。

各位可以创建一个access数据库,并建立一个dsn看看。
 
只有在显示密码的时候才会在链接字符串中有密码显示。
 
密码中分号结尾时生成链接串是不正常的。
 
来自:kkyy, 时间:2002-6-26 22:02:00, ID:1183311
只有在显示密码的时候才会在链接字符串中有密码显示。

对!

来自:kkyy, 时间:2002-6-26 22:06:00, ID:1183317
密码中分号结尾时生成链接串是不正常的。

不对。。。我的确碰到了这种情况。
 
我一般是先最小化字符串,然后查找比如用户名,查找“user id=”,
再一个字符一个字符分析,下一个字符是不是分号,如是分号,
再下一个字符后面有没有可能是关键字,如是就取了。
当然是从原来的链接串中取了。
 
哈,,显然ado不是象你那么做的,,,哈。
 
bigroute,兄弟,别说风凉话了,你说ado是怎么做的? 它也得从connectionstring中提取
用户名和密码啊
 
估计是根据关键字匹配,像PWD=等等...
 
呵呵,不用直接用CommaText了,还是手工处理为好。

你可以试试从后向前扫描来做。通常连接串是这样格式的:
AAA=111;BBB=222;CCC=333
那么,从后向前扫描,到第一个等号,得到一个子串“333”,做为值保存。
再向前扫描“;”,得到第二个子串“CCC”,做为字段名,以此类推,直到
最后(也就是正常顺序的第一个字段名)一个字段结束。分解结果:

333 CCC
222;BBB
111;AAA

如果不匹配就报错。

这样,你就得到了一个字段名列表和一个值列表,然后,你再处理以下字段
列表中的空格和值列表中的结束符”;“

这个方法的话, 对你举例1,3,4的连接串都能解决。只是2的情况有点特殊,
因为这样取到的值串,可能会以”;“结尾,如果把”;“删除的话,可能就取不
到了,只好自己判断一下,如果字段名是PSW ,则不处理对应的值。

程序比较简单,就不写了。

BTW:第2种情况我想密码应该是空值,而不是”;“,不过我没试,就按你说的
办吧。
 
还是有问题的,请考虑密码中含有等号和分号的情况!

另外,谁能说说第四种情况到底怎么回事? 不同的密码,生成的字符串是一样的?
 
我试啦sqlserver没问题
有分号或等号试密码变为:password="asdf;sadf=asdf",分号等号无影响呀
 
是否可以提取一下密码,然后测试一下能否连接成功到数据库,不能继续提下一个可能的密码,
如果成功就确定了.
 
选一个数据库连接先,拷贝字符,替换相关部分不就行了。
 
如何处理是难不到大富翁们的,关键是ADO是怎么做的!!
 
以后就动态的写入配置文件,这样就不会出现这样的问题了
 
后退
顶部