(也许)ODBC SQL Server连接字符串PWD =

时间:2019-03-13 20:04:46

标签: odbc connection-string sql-server-express

根据我的研究,SQL Server连接字符串的PWD =字段中没有非法字符。

但是,我使用SQL Server Express 2008将SA密码更改为GUID,具体是:

  

{85C86BD7-B15F-4C51-ADDA-3B6A50D89386}

因此,当通过ODBC连接时,我使用以下连接字符串:

"Driver={SQL Server};Server=.\\MyInstance;Database=Master;UID=SA;PWD={85C86BD7-B15F-4C51-ADDA-3B6A50D89386};"

但是由于SA登录失败而返回。

但是,如果我将SA密码更改为同样长的时间但没有 {}-,它会成功! PWD =中是否有某些字符需要转义?我没有运气就尝试了所有不同的组合。

1 个答案:

答案 0 :(得分:1)

Microsoft's documentation所述(已加强调)-

  

ODBC使用的连接字符串具有以下语法:

connection-string ::= empty-string[;] | attribute[;] | attribute; connection-string

empty-string ::=

attribute ::= attribute-keyword=[{]attribute-value[}]

attribute-value ::= character-string

attribute-keyword ::= identifier
     

可以选择将属性值括在大括号中,这样做是一种好习惯。当属性值包含非字母数字字符时,这可以避免出现问题。 假定值中的第一个右大括号终止了该值,因此值不能包含右大括号字符。

我建议您在设置密码时简单地删除括号,然后上面提供的连接字符串应该可以正常工作。

添加

我在Microsoft的网站上进行了进一步的挖掘,发现一些可能与之相关的ABNF rules-

 SC           = %x3B         ; Semicolon 
 LCB          = %x7B         ; Left curly brackets 
 RCB          = %x7D         ; Right curly brackets  
 EQ           = %x3D         ; Equal sign 
 ESCAPEDRCB   = 2RCB         ; Double right curly brackets 
 SpaceStr     = *(SP)        ; Any number (including 0) spaces
 ODBCConnectionString =  *(KeyValuePair SC) KeyValuePair [SC]
 KeyValuePair = (Key EQ Value / SpaceStr)
 Key = SpaceStr KeyName
 KeyName = (nonSP-SC-EQ *nonEQ)
 Value = (SpaceStr ValueFormat1 SpaceStr) / (ValueContent2)
 ValueFormat1 = LCB ValueContent1 RCB
 ValueContent1 = *(nonRCB / ESCAPEDRCB)
 ValueContent2 = SpaceStr / SpaceStr (nonSP-LCB-SC) *nonSC
 nonRCB = %x01-7C / %x7E- FFFF                                 ; not "}"
 nonSP-LCB-SC = %x01-1F / %x21-3A / %x3C-7A / %x7C- FFFF       ; not space, "{" or ";"
 nonSP-SC-EQ = %x01-1F / %x21-3A / %x3C / %x3E- FFFF           ; not space, ";" or "="
 nonEQ = %x01-3C / %x3E- FFFF                                  ; not "="
 nonSC = %x01-003A / %x3C- FFFF                                ; not ";"

...

  如果需要ValueFormat1包含ValueLCBRCB,建议使用

EQValueFormat1包含Value或以SC开头时,必须使用LCB

     

ValueContent1必须用LCBRCB括起来。封闭LCB之前和RCB后面的空格必须忽略。

     

ValueContent1必须包含在ValueFormat1中。如果RCB中有一个ValueContent1,则它必须使用两个字符的序列ESCAPEDRCB来表示一个字符的值RCB

所有这些都归结为...我相信以下连接字符串应该为您工作(请注意,PWD值上有2个左/右大括号和3个右/右大括号) -

"Driver={SQL Server};Server=.\\MyInstance;Database=Master;UID=SA;PWD={{85C86BD7-B15F-4C51-ADDA-3B6A50D89386}}};"