SQLServer 2005 поведенческие различия при использовании osql и sqlcommand - PullRequest
0 голосов
/ 13 июня 2011

Кто-нибудь знает о каких-либо тонких различиях между поведением SQL Server 2005 при выполнении команды через OSQL и программным запросом с использованием SQlConnection?

У меня есть клиент с базой данных на удаленной машине, который яможно использовать OSQL для взаимодействия.Тем не менее, когда я пытаюсь подобный запрос через создание sqlconnection / sqlcommand;Я получаю сообщение об ошибке:

['При установлении соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром.Сервер не найден или не был доступен.Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений (поставщик: сетевые интерфейсы SQL, ошибка: 26 - ошибка при поиске сервера / конкретного экземпляра).

Вот OSQLкоманда, которая работает:

osql -S myHost\SQLEXPRESS -U sa -q "USE [TempDB] select [Endpoint] from [Service]"

Это не работает, сгенерированная выше ошибка.

SqlConnectionStringBuilder cnBldr = new SqlConnectionStringBuilder();

cnBldr.UserID = "sa";
cnBldr.Password  = "PASSWORD";
cnBldr.DataSource = "myHost\\SQLEXPRESS";
cnBldr.InitialCatalog = "TempDB";
using (SqlConnection cn = new SqlConnection(cnBldr.ConnectionString))

using (SqlCommand cmd = new SqlCommand("select [Endpoint] from [Service]",cn))
{
   cn.Open();
   SqlDataReader rdr = cmd.ExecuteReader();
   rdr.Read();
}

В обоих случаях я работаю как один и тот же пользователь (то есть: я регистрируюВ качестве пользователя Windows я либо открываю окно cmd и выполняю команду OSQL, либо запускаю приложение Windows, которое содержит фрагмент кода выше. OSQL будет работать, фрагмент кода генерирует ошибку, описанную выше. В обоих случаях используется 'sa'учетная запись для доступа к базе данных. Фрагмент OSQL предложит пользователю ввести пароль.

Есть ли разница между этими двумя факторами, которые могут быть связаны с этим поведением? Я не верю, что это связано с проблемойс количеством подключений, как я могу свободно переключаться между выполнением команды osql (которая будет работать) и выполнениемприложение (которое генерирует сообщение об ошибке).

Спасибо за любые мысли.

-john

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Во-первых, не используйте TempDB, имя - tempdb, и ваш код будет взломан с учетом регистра.

В случае проблем с подключением выполните шаги, описанные в Сетевые интерфейсы SQL, ошибка: 26 - Ошибка при поиске указанного сервера / экземпляра . OSQL использует ODBC, а SQLCommand имеет встроенную управляемую реализацию SNI, поэтому между ними есть различия, и они зависят от глобальных параметров конфигурации компьютера. Следуйте инструкциям в связанной статье, чтобы определить, где разрывается соединение.

0 голосов
/ 14 июня 2011

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

С этой точки зрения нет никаких внутренних отличий между osql / sqlcmd и программным запросом.

...