Каков наилучший способ документировать вызовы метода чтения данных? [закрыто]
-
22-07-2019 - |
Вопрос
При работе с пространствами имен, такими как System.Data.Odbc или System.Data.OracleClient, различные методы чтения данных обычно требуют, чтобы целое число, соответствующее столбцу, было предоставлено функциям (например, OracleDataReader.GetInt32 ). Р>
Мой вопрос заключается в следующем: как лучше всего работать с этими функциями, чтобы код самодокументировался. Сейчас мне кажется, что есть три варианта, а именно:
// Option One - Just provide the integer value
string myString = oraData.GetString[0];
// Option Two - Provide the integer value using a constant
string myString = oraData.GetString[FIELD_NAME];
// Option Three - Provide the column name and use System.Convert to return the correct value
string myString = Convert.ToString(oraData["Field_Name"]);
Кажется, что у каждого из этих методов есть свои плюсы и минусы, и мне любопытно посмотреть, что думают другие, или есть ли лучший способ сделать это.
Решение
Я согласен с Эндрю Хэром, с тем дополнением, что я включил функциональность в перегруженный метод расширения, который упрощает операцию:
public static string GetStringByName(this OracleDataReader reader,
string columnName,
string defaultValue)
{
string result = defaultValue;
int columnIndex = reader.GetOrdinal(columnName);
if(!reader.IsDbNull(columnName)
{
result = (string) reader.GetString(columnIndex);
}
return result;
}
В любом случае, просто рефакторинг, который мне очень помог.
Другие советы
Я всегда делал это так:
int columnIndex = dataReader.GetOrdinal("field");
if (!dataReader.IsDBNull(columnIndex))
String myString = dataReader.GetString(columnIndex);
Идея заключается в том, что GetOrdinal
завершится с ошибкой IndexOutOfRangeException
, когда я попытаюсь получить поле, которого нет в читателе. Я хочу это исключение, потому что оно быстро сообщает мне, что между моим кодом и моей БД существует несоответствие.
Кроме того, GetOrdinal
гораздо менее хрупок, чем жесткое кодирование самого ординала как магического числа.
Обычно я использую вариант 3. Мне он нравится, потому что, если базовый запрос когда-либо изменит порядок столбцов, он все равно будет работать, и в нем будет отображаться имя того, что вы просите, а не какое-то магическое число.
Однако я часто использую VB.Net, поэтому часть Convert.ToString ()
может быть сделана неявно. Типы C # могут иметь разные предпочтения.
Кроме того, существует очень небольшое наказание за использование имени поля, а не порядкового номера столбца. Обычно я чувствую, что это оправдано, но в зависимости от вашего приложения вы можете принять это во внимание.