Это ответ на код Антона, который не работает с экранированными кавычками. Я изменил 3 места.
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;
}
Как и предполагалось в оригинальном сообщении, это было не так просто, как ожидалось, но в итоге я смог подключиться через именованный канал.
Установите полную .NET Framework 4.5.2 или более позднюю версию, , затем перезагрузите компьютер , затем вы сможете подключиться, используя:
sqlcmd -S (localdb)\.\MySharedInstance
Я обнаружил, что именованные каналы генерируют новый хэш при перезагрузке компьютера, именованный общий экземпляр будет сохранен после перезагрузки.
Важно отметить, что он не будет работать до перезагрузки.
ДРУГОЕ РЕДАКТИРОВАНИЕ
Кори, если у вас установлены предыдущие версии 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
, я получаю правильное сообщение об ошибке, когда пытаюсь остановить его, я получаю сообщение, что он [уже] запущен, когда я пытаюсь запустить его, но я не могу подключиться к это?
Так что, если вам не нужен 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.