Хранимая процедура хорошо работает в SSMS, но нет строк, возвращаемых при вызове в C # - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть хранимая процедура, которую мне нужно запустить в C #, и установить набор результатов, возвращаемых из SP, в таблицу HTML. Обратите внимание, что SP работает хорошо в SSMS и возвращает результаты.

Код C #, который я использую (это в проекте ASP 4.5):

SQLDatabase sqldb = new SQLDatabase();
using (SqlConnection sqlcn = new SqlConnection(sqldb.GetConnectionString().ToString()))
{
   if (sqlcn.State == ConnectionState.Closed)
   {
      sqlcn.Open();
   }
   SqlCommand cmd = new SqlCommand("[MyStoredProcedure]", sqlcn);
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("@FromDate", Convert.ToDateTime(txtFrom.Value.ToString()));
   cmd.Parameters.AddWithValue("@ToDate", Convert.ToDateTime(txtTo.Value.ToString()));
   using (SqlDataAdapter a = new SqlDataAdapter(cmd))
   {
       DataSet ds = new DataSet();
       a.Fill(ds);
       dtExtra = ds.Tables[0];
   }
}

Приведенный выше код возвращает 0 строк, даже если SP работает в SSMS. Во время отладки строка подключения и параметры становятся все правдой, никаких проблем. Строка подключения:

<add name="DefaultDB" connectionString="Data Source=TestEnv;Initial Catalog=TestTable;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>

Я не понимаю, что может быть причиной этого. Я нашел тему ниже, но я уже использую Integrated Security=SSPI в строке подключения, так что это мне не помогло. Любой совет будет оценен.

ASP.NET хранит вызов proc, не возвращая строк, но делает это в Management Studio!

РЕДАКТИРОВАТЬ: РЕШЕНО! Спасибо @NineBerry. Это превратилось в проблему между / и использованием в SP. Изменение txtTo.Value как: DateTime.Today.AddDays(1).ToString("yyyy-MM-dd"); в коде устранило проблему (раньше было DateTime.Today.ToString("yyyy-MM-dd"), я должен был включить его в часть кода, не думал, что это связано с этим, извините). Лучшим решением было бы обновить SP, используя >= и <= вместо / и ключевых слов tho.

1 Ответ

0 голосов
/ 08 ноября 2018

Я бы изменил ваш код так:

using(var dbConnection = new SqlConnection("..."))
using(var command = new SqlCommand(query, dbConnection))
{
     dbConnection.Open();
     ...
}

Обработка пулов соединений в блоке using всегда является хорошей идеей в соответствии с рекомендациями Microsoft:

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

Вы проверяете, закрыто ли соединение, что если соединение не используется? Используя синтаксис using, вы реализуете dispose. Таким образом, он корректно закроет ваше соединение, поэтому вам не нужно проверять, закрыто ли соединение, если только вы не используете единственное соединение для соединения.

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

...