(Возможно) Недопустимый символ в строке подключения ODBC SQL Server PWD = - PullRequest
0 голосов
/ 13 марта 2019

Согласно исследованию, в поле PWD = строки подключения к SQL Server нет недопустимых символов.

Однако, используя 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 Ответ

1 голос
/ 14 марта 2019

Как В документации Microsoft говорится (выделено) -

Строки подключения, используемые 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-правила , которые могут иметь отношение к делу -

 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 рекомендуется использовать, когда необходимо, чтобы Value содержал LCB, RCB или EQ. ValueFormat1 ДОЛЖЕН использоваться, если Value содержит SC или начинается с LCB.

ValueContent1 ДОЛЖНЫ быть заключены в LCB и RCB. Пробелы перед LCB и после RCB ДОЛЖНЫ игнорироваться.

ValueContent1 ДОЛЖЕН содержаться в ValueFormat1. Если в ValueContent1 есть RCB, он ДОЛЖЕН использовать двухсимвольную последовательность ESCAPEDRCB для представления односимвольного значения RCB.

Все это сводится к ... Я считаю, что следующая строка подключения должна работать для вас (обратите внимание, что на значении PWD есть 2 левых / открытых скобки и 3 правых / закрытых скобки) - -

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