Этот запрос SQL ничего не возвращает, когда я знаю, что данные существуют - PullRequest
1 голос
/ 29 ноября 2011

Я пытаюсь получить информацию об элементах для отображения на странице.По какой-то причине главная категория (masCat.cat_name) не возвращает данные.Вот код для моего оператора SQL:

  strSQL.CommandText = "Select Top 25 tblItem.item_id, tblItem.item_title
     , masCat.cat_name, regCat.cat_name, tblItem.item_lot, tblCosigner.cs_txt_id
     , tblItem.item_status, tblItem.item_photo_status, tblItem.item_pr
     , tblItem.item_premium
  From tblItem
  Left Join tblCosigner On (tblItem.item_cs_txt_id = tblCosigner.cs_txt_id)
  Left Join tblCDR On (tblItem.item_cdr_txt_id = tblCDR.cs_id)
  Left Join tblCat As masCat On (tblItem.item_mcat_id = masCat.cat_id)
  Left Join tblCat As regCat On (tblItem.item_cat_id = regCat.cat_id)
  Where " + sqlQuery + "
  Order By tblItem.item_id;";
  try
  {
      conn.Open();
      using (SqlDataReader itemReader = strSQL.ExecuteReader())
      {
          while (itemReader.Read())
          {
              resultText += "<tr>\n<td>" + itemReader.GetValue(0).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(1).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(2).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(3).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(4).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(5).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(6).ToString() + "</td>\n";
              resultText += "<td>" + itemReader.GetValue(7).ToString() + "</td>\n";
              if (itemReader.GetValue(8).ToString().Length > 0)
              {
                  price = double.Parse(itemReader.GetValue(8).ToString());
              }
              if (itemReader.GetValue(9).ToString().Length > 0)
              {
                  premium = double.Parse(itemReader.GetValue(9).ToString());
              }
              total = price + premium;
              resultText += "<td>" + total.ToString("0.00") + "</td>\n</tr>\n";
          }
          itemReader.Close();
      }
  }

Я думал, что мой оператор соединения был неправильным для соединения masCat, но если я просто изменил tblItem.item_mcat_id на просто tblItem.item_cat_id (который является вторичнымкатегория, также выбранная в этом же запросе), работает просто отлично.Оба извлекаются из одной и той же таблицы, но из разных связанных полей в реляционной таблице.Я уверен, что tblItem.item_mcat_id - это правильное имя поля для идентификатора главной категории.

Теперь я привык использовать MySQL, и я знаю, что с SQL вы должны выполнять Group By, а также,Но я не знаю, что я бы сгруппировал, кроме tblItem.item_id, чтобы он не объединял строки данных.Поэтому я не понимаю, как это решило бы мою проблему.Может кто-нибудь увидеть что-то не так с этим оператором SQL?Все возвращается нормально, за исключением главной категории.

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

РЕДАКТИРОВАТЬ

Это в комментариях, но переменная sqlQuery имеет значение по умолчанию «tblItem.item_id> 0».Это работает, если я добавляю к нему другие критерии динамически (не включая основную категорию).

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

ИСПРАВЛЕНО

Кто бы ни создавал таблицы, изначально создавал нулевую панель tblItem.item_mcat_id ... -.-

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

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

tblItem.item_mcat_id = masCat.cat_id

не одного типа или один содержит отступы, а другой нет.Возможно, вам придется сделать бросок.Наконец, УБЕДИТЕСЬ, что item.mcat_id ДЕЙСТВИТЕЛЬНО существует в столбце cat_id.

0 голосов
/ 29 ноября 2011

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

if(itemReader.HasRows) 
{ 
     While(itemReader.Read())
     {

     }
}

, не уверен, что это проблемы или нет, но я бы начал с этого.

0 голосов
/ 29 ноября 2011

С кодом, который вы разместили, невозможно помочь вам напрямую.

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

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

При этом единственный способ решить вашу проблему - это поместить полную результирующую строку запроса в SQL Management Studio (или использовать ее базовую версию в VS) и посмотреть, что получится. Это означает, что вам нужно вывести свойство CommandText при выполнении программы.

Это можно сделать с помощью Debug.WriteLine () . Результаты будут отображаться в вашем окне OUTPUT по умолчанию.

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