Есть ли лучший способ сделать это: Преобразовать. IsDBNull (строка [somecolumn]) проверка

С jQuery Вы используете $(document).ready() для выполнения чего-то, когда DOM загружается и $(window).on("load", handler) для выполнения чего-то, когда все другие вещи загружаются также, такие как изображения.

различие видно в следующем полном файле HTML, если Вы имеете jollyroger файлы JPEG (или другие подходящие):

<html>
    <head>
        <script src="jquery-1.7.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                alert ("done");
            });
        </script>
    </head><body>
        Hello
        <img src="jollyroger00.jpg">
        <img src="jollyroger01.jpg">
        // : 100 copies of this
        <img src="jollyroger99.jpg">
    </body>
</html>

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

$(document).ready(function() {

в:

$(window).on("load", function() {

затем окно предупреждений не появляется, до после изображения загружаются.

Следовательно, для ожидания, пока вся страница не готова, Вы могли использовать что-то как:

$(window).on("load", function() {
    // weave your magic here.
});
7
задан Ed S. 24 August 2009 в 20:38
поделиться

7 ответов

Абсолютно есть более чистый способ написать этот код, если вы используете .NET 3.5, и без повторного изобретения методов расширения, которые Microsoft уже написала для вас. Просто добавьте ссылку на System.Data.DataSetExtensions.dll , и вы сможете сделать это:

MyObject pymt = new MyObject
                {
                    xcol1id = row.Field<int?>("col1id") ?? 0,
                    xcol2id = row.Field<string>("col2id") ?? String.Empty,
                    xcol3id = row.Field<decimal?>("col3id") ?? 0M
                };
8
ответ дан 6 December 2019 в 05:49
поделиться

Вы можете создать общие методы расширения, подобные этому:

public static class DataRowExtensions {

   public static T GetValueOrDefault<T>(this DataRow row, string key) {
      return row.GetValueOrDefault(key, default(T));
   }

   public static T GetValueOrDefault<T>(this DataRow row, string key, T defaultValue) {
      if (row.IsNull(key)) {
         return defaultValue;
      } else {
         return (T)row[key];
      }
   }

}

Использование:

MyObject pymt = new MyObject();
pymt.xcol1id = row.GetValueOrDefault<int>("col1id");
pymt.xcold2id = row.GetValueOrDefault<string>("col2id", String.Empty);
pymt.xcold3id = row.GetValueOrDefault<int>("CustNum"]);
10
ответ дан 6 December 2019 в 05:49
поделиться

Я обычно использую нулевой оператор объединения в подобных ситуациях. Кроме того, DBNull.ToString возвращает string.Empty, поэтому вам не нужно делать ничего особенного.

MyObject pymt = new MyObject();
pymt.xcol1id= row["col1id"] as int? ?? 0;
pymt.xcold2id= row["col2id"].ToString();
pymt.xcold3id = row["CustNum"] as decimal? ?? 0;
7
ответ дан 6 December 2019 в 05:49
поделиться

Еще лучше, добавьте его как метод расширения в DataRow :

static T GetValueOrDefault<T>(this DataRow row, string columnName)
{
    if (!row.IsNull(columnName))
    {
        // Might want to support type conversion using Convert.ChangeType().
        return (T)row[columnName]
    }

    return default(T);
}

Вы можете использовать его как:

pymt.xcol1id = row.GetValueOrDefault<int>("col1id");
pymt.xcol2id = row.GetValueOrDefault<string>("col2id");
pymt.xcol3id = row.GetValueOrDefault<decimal>("col3id");
3
ответ дан 6 December 2019 в 05:49
поделиться
 static ToType GenericConvert<ToType>(object value)
        {
            ToType convValue = default(ToType);

            if (!Convert.IsDBNull(value))
                convValue = (ToType)value;

            return convValue;
        }


MyObject pymt = new MyObject();
pymt.xcol1id= GenericConvert<int>(row["col1id"]);
pymt.xcold2id= GenericConvert<string>(row["col2id"]) ?? String.Empty;
pymt.xcold3id = GenericConvert<decimal>(row["CustNum"]);
2
ответ дан 6 December 2019 в 05:49
поделиться

Некоторые альтернативы, которые я могу быстро придумать:

  1. Строго типизированные наборы данных
  2. Используйте программы чтения SqlTypes, такие как ReadSqlInt32 , поскольку все они реализуют INullable .
  3. Сгенерируйте код с преобразованием XSLT из XML, чтобы код проверки было легко изменять и поддерживать.
1
ответ дан 6 December 2019 в 05:49
поделиться

Мне это вообще нравится. Наша команда использовала операторы if / else, которые, на мой взгляд, труднее читать.

if (row["col1id"] == dbnull.value)
   pymt.xcol1id = 0;
else
   pymt.xcol1id = (int)row["col1id"];

Ваш код легче читать, потому что он помещает каждое присваивание в отдельные строки.

Функция, предложенная Стэном, может создавать строки. короче, но он скрывает тот факт, что значения NULL заменяются, если вы не дадите ему очень подробное имя.

1
ответ дан 6 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: