2010-12-28 3 views
1

У меня есть некоторые проблемы с подключением к базе данных и интересно, есть ли у меня что-то не так в моем коде. Пожалуйста ознакомтесь. Этот вопрос связан: Switch between databases, use two databases simultaneously вопрос.Правильный код для извлечения данных из базы данных SQL Server

cs="Data Source=mywebsite.com;Initial Catalog=database;User Id=root;Password=toor;Connect Timeout=10;Pooling='true';" 

using (SqlConnection cnn = new SqlConnection(WebConfigurationManager.ConnectionStrings["cs"].ConnectionString)) 
{ 
    using (SqlCommand cmmnd = new SqlCommand("", cnn)) 
    { 
     try 
     { 
      cnn.Open(); 

      #region Header & Description 
      cmmnd.Parameters.Add("@CatID", SqlDbType.Int).Value = catId; 
      cmmnd.CommandText = "SELECT UpperID, Title, Description FROM Categories WHERE [email protected];"; 

      string mainCat = String.Empty, rootCat = String.Empty; 

      using (SqlDataReader rdr = cmmnd.ExecuteReader()) 
      { 
       if (rdr.Read()) 
       { 
        mainCat = rdr["Title"].ToString(); 
        upperId = Convert.ToInt32(rdr["UpperID"]); 
        description = rdr["Title"]; 
       } 
       else { Response.Redirect("/", false); } 
      } 

      if (upperId > 0) //If upper category exists add its name 
      { 
       cmmnd.Parameters["@CatID"].Value = upperId; 
       cmmnd.CommandText = "SELECT Title FROM Categories WHERE [email protected];"; 
       using (SqlDataReader rdr = cmmnd.ExecuteReader()) 
       { 
        if (rdr.Read()) 
        { 
         rootCat = "<a href='x.aspx'>" + rdr["Title"] + "</a> &raquo; "; 
        } 
       } 
      } 
      #endregion 

      #region Sub-Categories 
      if (upperId == 0) //show only at root categories 
      { 
       cmmnd.Parameters["@CatID"].Value = catId; 
       cmmnd.CommandText = "SELECT Count(CatID) FROM Categories WHERE [email protected];"; 

       if (Convert.ToInt32(cmmnd.ExecuteScalar()) > 0) 
       { 
        cmmnd.CommandText = "SELECT CatID, Title FROM Categories WHERE [email protected] ORDER BY Title;"; 

        using (SqlDataReader rdr = cmmnd.ExecuteReader()) 
        { 
         while (rdr.Read()) 
         { 
          subcat.InnerHtml += "<a href='x.aspx'>" + rdr["Title"].ToString().ToLower() + "</a>\n"; 
          description += rdr["Title"] + ", "; 
         } 
        } 
       } 
      } 
      #endregion 
     } 
     catch (Exception ex) { HasanG.LogException(ex, Request.RawUrl, HttpContext.Current); Response.Redirect("/", false); } 
     finally { cnn.Close(); } 
    } 
} 

Случайные ошибки я получаю являются:

  • Ошибка транспортного уровня произошла при отправке запроса на сервер. (поставщик: поставщик TCP, ошибка: 0 - существующее соединение было принудительно закрыто удаленным хостом.)
  • При установлении соединения с SQL Server возникла связанная с сетью или конкретная ошибка экземпляра. Сервер не найден или не был доступен. Проверьте правильность имени экземпляра и настройте SQL Server для удаленного подключения. (поставщик: поставщик Named Pipes, ошибка: 40 - не удалось открыть соединение с SQL Server)
  • Истекло время ожидания. Период ожидания истекает до получения соединения из пула. Возможно, это произошло из-за того, что все объединенные соединения использовались и максимальный размер пула был достигнут.
  • Не удается открыть базу данных "db", запрошенную при входе в систему. Ошибка входа в систему. Ошибка входа для пользователя «root».
+0

Что вы думаете ?? – egrunin

+0

Правильно ли код, и у меня есть ошибки? –

+0

Что происходит, когда вы пытаетесь запустить его? Мы не можем проверить это для вас. Кроме того, почему вы говорите, что это имеет какое-то отношение к проблеме с двумя базами данных? Здесь есть только одна база данных. – egrunin

ответ

3

Здесь нет реальных проблем.

Вам не нужен посторонний наконец {cnn.close(); }, поскольку предложение use позаботится об этом для вас. Однако изменение будет иметь ровно нулевой эффект.

Другое дело в том, что я поставил бы try .. catch за пределами предложения using с перенаправлением. Но, опять же, я не думаю, что это повлияло бы на отказ от вызова.

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

Который оставляет нам только одно реальное решение: хостинг-провайдеры. Они либо перегрузили свой сервер БД до степени непригодности, либо какой-то элемент оборудования в своей сетевой настройке (nic, switch, router и т. Д.) Плох и отбрасывают пакеты.

+0

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

1

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

Используйте анализатор пакетов, чтобы выяснить, если потерянные пакеты вопрос ,

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

True ... one error on "description = rdr [" Title "];", должно быть "description = rdr [" Описание "]. ToString()"?

Не нужно использовать оператор using вокруг объекта SqlCommand, и поскольку вы используете специальные запросы, просто используйте string.Format («sql test {0}», param). Таким образом, вы можете повторно использовать объект SqlCommand без необходимости очистки параметров.

Самая большая проблема, которую я вижу здесь, заключается в том, что вы смешали слой презентации с бизнес-уровнем с уровнем данных. Сбросьте попытку ...улавливать и разрешать бизнес-уровню обрабатывать записи. Верните объект на уровень представления и разрешите ему выполнять перенаправления. Держите слой источника данных очень простым ... получите данные и верните объект. Бизнес-уровень может обрабатывать любую бизнес-логику для самой сущности.

SQL Server не найдена может быть вашей ошибкой или поставщиками ... если провайдер часто виноват, смените поставщиков.

+0

Нет конечно :). Я думаю, что нет ничего плохого в cs. –

+0

«Начальный каталог = база данных» говорит, что имя базы данных «база данных». Кроме того, что случилось с «Data Source = mywebsite.com»? Разрешает ли mywebsite.com известный IP-адрес SQL Server? –

+0

Хотя, может быть база данных с именем «database», мое настоящее имя базы данных - FirmaDMOZ. Мое настоящее доменное имя db - mssql2005.turhost.com, который разрешает IP. –

0

Вы уверены, что БД настроена на предоставление удаленного доступа с использованием TCP?

+0

Возможно, у провайдера возникают проблемы с сервером, но это временно. Макс. 10 минут в автономном режиме. Веб-сайт теперь находится в сети: http://firmadmoz.com/ –

1

Есть несколько несоответствий, которые необходимо исправлено:

  1. описание = RDR [ "Title"]; не определено надлежащее кастинг.
  2. Тот же объект команды используется для каждого оператора sql, и даже вы не очищаете параметры, было бы идеально, если бы отдельная команда использовалась для каждого оператора sql.
  3. Слишком много переназначений, лучше всего обрабатывать перенаправление в конце метода.
  4. Проверьте работоспособность сервера базы данных, похоже, что сервер базы данных недостаточно чувствителен.

Надеюсь, это поможет.

+0

1: Я очистил код. 2: Почему нужно очищать параметры, если они одинаковы? Я просто меняю значения. Зачем потреблять ресурсы, пока я могу использовать одну и ту же команду для многих действий? 3: Я согласен с переадресацией. 4: Я не могу это сделать. –

+1

Да, вы правы, что одна и та же команда может быть использована, но в терминах отладки и обслуживания кода это будет немного сложно. Возможно, вам придется подумать о том, чтобы изменить хостинг-провайдера, так как ваш сайт довольно большой, и размещение на общем сервере было бы проблемой. Кто знает, чей запрос испортил сервер! – ShahidAzim

Смежные вопросы