2008-12-05 1 views
0

Я где-то читал, что никогда не следует использовать условия ошибки как обычный программный поток. Отличный смысл для меня ... НоКак избежать опрокидывания ошибки, когда SQL Select возвращает ничего

Приложение C#, сидящее на вершине MySQL db. Мне нужно разобрать строковое значение на две части, идентификатор и значение. (Исходные данные поступают из базы данных Devonian), затем проверяйте значение по таблице поиска. Так, несколько оригинальных строк может выглядеть следующим образом:

"6776 Фиолетовый People Eater"

"БИК желтый горошек бикини (в настоящее время используется)"

"DCP Deuce Coup"

Итак, моя маленькая утилита анализирует каждую строку в идентификаторе и описании, основанном на индексе первого пространства (к счастью, соответствует). Затем я передаю идентификатор поиску, получаю новое значение, и мы уходим.

К сожалению, TPTB также решил, что мы больше не нуждаемся ни в каком stinkin 'Yellow Polka-Dot Bikinis (в настоящее время используется). Таким образом, BIK не возвращает строку. Вот фрагмент кода:

foreach (string product in productTokens) { 
     tempProduct = product.Trim(); 
     if (tempProduct.Length > 0) { 
     if (tempProduct.Length < 10) { 
      product_id = tempProduct; 
     } 
     else { 
      int charPosition = tempProduct.IndexOf(" "); 
      product_id = tempProduct.Substring(0, charPosition); 
     } 
     try { 
      s_product = productAdapter.GetProductName(product_id).ToString(); 
     } 
     catch (Exception e) { 
      if (e.Message.ToString() == "Object reference not set to an instance of an object.") { 
      s_product = ""; 
      } 
      else { 
      errLog.WriteLine("Invalid product ID " + e.Message.ToString()); 
      Console.WriteLine("Invalid product ID " + e.Message.ToString()); 
      throw; 
      } //else 
     } //catch 
     if (s_product.Length > 0) { 
      sTemp = sTemp + s_product + "; "; 
     } 
     } //if product.length > 0 
    } //foreach product in productTokens 

Действительно, действительно уродливый! В частности, часть, где я тестирую недопустимый IDin в блоке catch. Там просто должен быть лучший способ справиться с этим.

Если кто-нибудь может мне помочь, я бы очень признателен.

Спасибо.

ответ

2

Вы не должны вызывать ToString() в этой точке, сначала вы должны проверить, является ли возвращаемое значение нулевым;

object productName = productAdapter.GetProductName(product_id); 
if (productName != null) 
{ 
    s_product = productName.ToString(); 
} 
else 
{ 
    s_product = String.Empty; 
} 
+0

Хмм ... Мне не пришло в голову, что ToString() может вызывать исключение, а не выборку. Я сделаю это. Спасибо. – EoRaptor013 2008-12-06 01:04:29

+0

Вы были правы! Это было исключение .ToString(). Если я оставлю это, запрос возвращает объект, и я могу проверить его и преобразовать в строку, если не null. – EoRaptor013 2008-12-08 04:54:30

0

Не можете ли вы просто проверить, возвращает ли GetProductName значение null?

var productName = s_product = productAdapter.GetProductName(product_id); 
if(productName == null) { ... do something } 
else { 
    string name = productName.ToString(); 
} 
1

В дополнение к рекомендациям Роба и Марка и в соответствии с вашим кодом, приведенным выше, я бы предложил другую настройку; Я был бы очень удивлен, если productAdapter.GetProductName() не уже возвращает String, и в этом случае вызов ToString() на нем является излишним. Если это действительно уже вернуть String, то вся ваша попытка/поймать блок становится на одну строку:

s_product = productAdapter.GetProductName(product_id) ?? string.Empty; 

Кроме того, я думаю, что это может быть полезно упомянуть что-то еще, что уже возвращающую String - Exception.Message. Таким образом, все разные места, в которых вы вызываете ToString() в вашем коде, также совершенно избыточны.

Кроме того, я предложил бы использовать метод экземпляра String.Split(), а не сочетание IndexOf и SubString:

product_id = tempProduct.Split(" ", 2)[1]; 

Наконец, решив, какие Exception вы поймали, исследуя Message имущество должно быть полностью последний сценарий.Даже если вы действительно нужно поймать NullReferenceException здесь, вы должны сделать это явно :

catch (NullReferenceException) { 
    s_product = ""; 
} 
catch (Exception e) { 
    // Log your invalid ID error condition here 
} 

PS: Я тоже не совсем уверен, что у всех этот вопрос имеет отношение к MySQL, так как в вашем коде нет доказательств какого-либо DB API.