ASP.NET хранит вызов proc, не возвращая строк, но делает это в Management Studio! - PullRequest
3 голосов
/ 14 июля 2011

У меня невероятно странная проблема, которую я пытался решить почти целый день, и теперь я против кирпичной стены и мне нужна помощь!

Я создал веб-сайт .NET 4 C # на своем Windows 7 ПК с недавно установленным SqlServer 2008 Express R2 , и все работает нормально.

Я загрузил базу данных и веб-сайт. Веб-сайт теперь работает на Windows Web Server 2008 R2 (с пакетом обновления 1) База данных находится на другом сервере под управлением Windows Server 2008 R2 Standard с SQL Server 2008 R2.

Остальная часть веб-сайта работает нормально и нормально подключается к базе данных, за исключением одной страницы, и я сузил ее до вызова хранимой процедуры, не возвращающей строк.

Я упростил вызов до этого:

DataSet ds = new DataSet();
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString());
        SqlCommand cmd = new SqlCommand("MYSP 'param1', param2, param3", conn);
        cmd.CommandType = CommandType.Text;
        conn.Open();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        Response.Write("ROWS COUNT IN GET DS " + ds.Tables[0].Rows.Count);
        conn.Close();
        cmd.Dispose();
        return ds;

Для любого из вышеперечисленного, если я запускаю это на своем локальном ПК для точной копии базы данных, он возвращает 2 строки, и если я запускаю его непосредственно в Sqlserver Management Studio на живом сервере, он возвращает 2 строки, но если я запустите это через ASP.net на реальном сервере, он не возвращает строк!

Может ли кто-нибудь пролить свет ??! Я схожу с ума!

Обновление , хотя я использую текст типа команды, я пробовал ее как хранимую процедуру типа команды с разделенными параметрами (как показано ниже), но это не имеет значения

cmd.CommandType = StoredProcedure;
    cmd.Parameters.Add(new SqlParameter("@param1", param1));
            cmd.Parameters.Add(new SqlParameter("@param2", param2));
            cmd.Parameters.Add(new SqlParameter("@param3", param3));

UPDATE

Спасибо всем за ваши комментарии!

Ответ:

Пользователь БД, который использовал веб-сайт, был установлен на "Британский английский" (по умолчанию) .. Я не осознавал этого, поскольку это новый сервер!

Везде, где есть пользователь, установлен «английский», поэтому изменение пользователя на английский исправляет это!

Ответы [ 4 ]

5 голосов
/ 14 июля 2011

обычные вещи, которые нужно попробовать: когда вы входите в базу данных, чтобы выполнить запрос, вы делаете это как тот же пользователь, который использует процесс asp.net? Возможно, вы обнаружите, что если вы используете двух пользователей, они могут быть настроены по-разному (один как EN-GB, другой как EN-US), что может вызвать проблемы с датой? Кроме того, вы можете обнаружить, что привилегии различны для обоих, поэтому у одного будут права tempDb, у другого нет?

2 голосов
/ 14 июля 2011

Если вы вызываете хранимую процедуру , вам следует установить SqlCommand.CommandType для хранимой процедуры:

DataSet ds = new DataSet();

using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString()))
using(SqlCommand cmd = new SqlCommand("MYSP 'param1', param2, param3", conn))
{  
    cmd.CommandType = CommandType.StoredProcedure;  <== STORED PROCEDURE !!
     ......

}

Обновление: , так как вы выполняете сохраненный процесс с параметрами, вы, вероятно, должны использовать это вместо:

using(SqlCommand cmd = new SqlCommand("exec dbo.MYSP 'param1', param2, param3", conn))

, а затем снова используйте CommandType.Text.

1 голос
/ 14 июля 2011

Хорошо, дикий выстрел, но я замечаю, что вы делаете ds.Tables[0].Rows.Count, и мне интересно, возвращает ли ваша хранимая процедура несколько таблиц данных?Лучший ответ на данный момент - от @pseudocoder использовать профилировщик, чтобы увидеть, что на самом деле вызывается.Я бы также предложил установить точку останова в вашем коде и проверить возвращаемый набор данных.

1 голос
/ 14 июля 2011

Используйте SQL Server Profiler для захвата фактического вызова хранимой процедуры, который был выполнен вашим рабочим сервером ASP.NET, а затем сделайте то же самое для настройки разработки.Убедитесь, что входящие параметры одинаковы.

Если параметры совпадают на этом уровне, единственный ответ, который кажется возможным, состоит в том, что сложный SP вашего коллеги имеет некоторый недетерминированный компонент, который портит ваши результаты.Вы понимаете весь SP?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...