Почему я не могу подключиться к общедоступному экземпляру SQL Server 2012 LocalDB?

Это ответ на код Антона, который не работает с экранированными кавычками. Я изменил 3 места.

  1. Конструктор для StringBuilder в SplitCommandLineArguments , заменив любой \ " на \r
  2. В for-loop в SplitCommandLineArguments я теперь заменяю символ \r на \ " .
  3. Изменен метод SplitCommandLineArgument от частного к публичному static.

public static string[] SplitCommandLineArgument( String argumentString )
{
    StringBuilder translatedArguments = new StringBuilder( argumentString ).Replace( "\\\"", "\r" );
    bool InsideQuote = false;
    for ( int i = 0; i < translatedArguments.Length; i++ )
    {
        if ( translatedArguments[i] == '"' )
        {
            InsideQuote = !InsideQuote;
        }
        if ( translatedArguments[i] == ' ' && !InsideQuote )
        {
            translatedArguments[i] = '\n';
        }
    }

    string[] toReturn = translatedArguments.ToString().Split( new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries );
    for ( int i = 0; i < toReturn.Length; i++ )
    {
        toReturn[i] = RemoveMatchingQuotes( toReturn[i] );
        toReturn[i] = toReturn[i].Replace( "\r", "\"" );
    }
    return toReturn;
}

public static string RemoveMatchingQuotes( string stringToTrim )
{
    int firstQuoteIndex = stringToTrim.IndexOf( '"' );
    int lastQuoteIndex = stringToTrim.LastIndexOf( '"' );
    while ( firstQuoteIndex != lastQuoteIndex )
    {
        stringToTrim = stringToTrim.Remove( firstQuoteIndex, 1 );
        stringToTrim = stringToTrim.Remove( lastQuoteIndex - 1, 1 ); //-1 because we've shifted the indicies left by one
        firstQuoteIndex = stringToTrim.IndexOf( '"' );
        lastQuoteIndex = stringToTrim.LastIndexOf( '"' );
    }
    return stringToTrim;
}
24
задан Cory McCarty 18 April 2012 в 17:28
поделиться

3 ответа

Как и предполагалось в оригинальном сообщении, это было не так просто, как ожидалось, но в итоге я смог подключиться через именованный канал.

Connecting to a LocalDB instance via named pipe

7
ответ дан Russell Speight 18 April 2012 в 17:28
поделиться

Установите полную .NET Framework 4.5.2 или более позднюю версию, , затем перезагрузите компьютер , затем вы сможете подключиться, используя:

sqlcmd -S (localdb)\.\MySharedInstance

Я обнаружил, что именованные каналы генерируют новый хэш при перезагрузке компьютера, именованный общий экземпляр будет сохранен после перезагрузки.

Важно отметить, что он не будет работать до перезагрузки.

0
ответ дан Wili Whitelaw 18 April 2012 в 17:28
поделиться

ДРУГОЕ РЕДАКТИРОВАНИЕ

Кори, если у вас установлены предыдущие версии SQL Server (например, 2008), то есть версия sqlcmd, которую вы используете. Для подключения к LocalDb вам необходимо использовать версию SQL Server 2012 sqlcmd. Поэтому ваши инструкции для пользователей должны убедиться, что они используют версию SQL Server 2012, выполнив:

C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd -S "(localdb)\.\InstanceName"

Это сработало для меня. Я не проверял, доступен ли этот путь и версия sqlcmd пользователям, у которых только установил sqllocaldb.msi. Извините, но у меня нет свободных компьютеров без установленного SQL Server 2012 (или только с установленными предыдущими версиями), чтобы попробовать это полностью. Но, пожалуйста, дайте мне знать, если явный вызов версии 110 sqlcmd сработает.

Я думаю, что вы также можете проинструктировать пользователей изменять свои системные переменные так, чтобы на первом месте стояла версия 110 (что, IMHO, должно иметь место автоматически).

Один из сотрудников Кшиштофа подтвердил FileTimeToSystemTime как ошибку. Так что до сих пор нет известных мне исправлений для не-владельцев для подключения через sqllocaldb. Но я показал, что и SSMS, и sqlcmd можно заставить работать, поэтому я надеюсь, что это приблизит вас к работе.

РЕДАКТИРОВАТЬ

Вам необходимо добавить в экземпляр любых пользователей, не являющихся владельцами, например, CREATE LOGIN [MyDomain\OtherUser] FROM WINDOWS; и любые соответствующие разрешения. В моем тесте вход в систему не удался и генерировал неправильное сообщение об ошибке (сообщение об ошибке «FileTimeToSystemTime» является ошибкой). Вам также необходимо GRANT CONNECT. Как только вы это сделаете, вы сможете подключиться от второго пользователя, используя Management Studio с этим соединением (единственным, которое я пробовал):

(localdb)\.\MySharedInstance

Но из sqlcmd, Я по-прежнему получаю сообщение об ошибке, независимо от того, как я пытаюсь подключиться:

sqlcmd -S "(localdb)\.\MySharedInstance"
sqlcmd -S ".\MySharedInstance"
sqlcmd -S "(localdb)\MySharedInstance"
sqlcmd -S "GREENHORNET\MySharedInstance"
sqlcmd -S ".\LOCALDB#SH04FF8A"
sqlcmd -S "GREENHORNET\LOCALDB#SH04FF8A"

Весь выход:

HResult 0xFFFFFFFF, Уровень 16, Состояние 1 Сетевые интерфейсы SQL Server:

Ошибка при поиске указанного сервера / экземпляра [xFFFFFFFF].

Sqlcmd: Ошибка: собственный клиент Microsoft SQL Server 10.0: при установлении соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или недоступен. Проверьте, правильно ли указано имя экземпляра и настроен ли SQL Server для разрешения удаленных подключений. Для получения дополнительной информации см. Электронную документацию по SQL Server.

Sqlcmd: ошибка: собственный клиент Microsoft SQL Server 10.0: истекло время ожидания входа.

Хотя я проверил, что экземпляр настроен на прием удаленных соединений. Итак, есть еще один обруч, через который должен пройти sqlcmd.

А что касается sqllocaldb exe, как это следует какой-либо логике? Я могу видеть, что экземпляр есть через info, я получаю правильное сообщение об ошибке, когда пытаюсь остановить его, я получаю сообщение, что он [уже] запущен, когда я пытаюсь запустить его, но я не могу подключиться к это?

enter image description here

Так что, если вам не нужен sqlcmd доступ, в краткосрочной перспективе я бы попросил, чтобы вторичные пользователи делали свое дело с SSMS (как только вы предоставите соответствующие разрешения) и, надеюсь, Кшиштоф получит больше информации о других предметах.


Что касается обновления 4.0.2, из http://connect.microsoft.com/SQLServer/feedback/details/723737/smo-cant-connect-to-localdb-instances :

Мы приняли явное решение не включать .NET Framework 4.0.2 в установщик LocalDB. Установка обновления .NET Framework увеличит размер установщика LocalDB и приведет к вероятной перезагрузке. Поскольку LocalDB построен независимо от .NET, мы не думали, что мы должны брать эту стоимость за каждую установку LocalDB. Будущие версии .NET (включая .NET 4.5, теперь в CTP) будут поддерживать LocalDB из коробки. Некоторые разработчики также могут в будущем выбрать ODBC, PHP Driver / PDO и, возможно, JDBC. Эти разработчики не будут заинтересованы в обновлении .NET.

23
ответ дан Aaron Bertrand 18 April 2012 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: