Общий способ обработки DBNull - PullRequest
2 голосов
/ 10 ноября 2011

В моем коде много логики этого типа при использовании SqlDataReader Есть ли более чистый, более общий способ справиться с этим?

 if (reader["VisitingAddressId"] != DBNull.Value)
 {
     visitingAddress = new Address()
     {
         AddressId = Convert.ToInt64(reader["VisitingAddressId"]),
         Address1 = reader["VisitingAddress"].ToString(),
         AddressType = AddressType.VisitingAddress,
         PostalCode = reader["VisitingPostal"].ToString(),
         PostalDistrict = reader["VisitingPostalDistrict"].ToString()
      };
  }

 if (reader["PostalAddressId"] != DBNull.Value)
 {
     postalAddress = new Address()
     {
         AddressId = Convert.ToInt64(reader["PostalAddressId"]),
         Address1 = reader["PostalAddress"].ToString(),
         AddressType = AddressType.PostalAddress,
         PostalCode = reader["PostalPostal"].ToString(),
         PostalDistrict = reader["PostalPostalDistrict"].ToString()
      };
  }

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

У меня есть эти вспомогательные методы в классе обслуживания данных (вы можете сделать их оба статическими):

    public T CastDBValue<T>(object value)
    {
        return MapValue<T>(value);
    }   

    internal static T MapValue<T>(object value)
    {
        try
        {
            T result;
            result = value == DBNull.Value ? default(T) : (T)value;
            return result;
        }
        catch (InvalidCastException cex)
        {
            logger.ErrorFormat("Invalid cast while mapping db value '{0}' to type {1}. Error: {2}", value, typeof(T).Name, cex);
            throw new InvalidCastException(string.Format("Invalid cast while mapping db value '{0}' to type {1}. Error: {2}", value, typeof(T).Name, cex.Message));
        }
    }

Затем в коде отображения вы просто делаете:

AddressId = dataService.CastDBValue<int>(reader["AddressId"]));
if (AddressId > 0) { ... }
2 голосов
/ 10 ноября 2011

Вы можете использовать микро-ORM, например Dapper: http://code.google.com/p/dapper-dot-net/

Функциональность мультикартирования устраняет весь этот код котельной плиты.

db.Query<Post,Address,Address,Post>("select * from Posts left join Address ... etc", 
 (post,vaddress,paddress) => 
  {
     post.VisitingAddress = vaddress; 
     post.PostalAddress = paddress; 
     return post; 
   });
0 голосов
/ 10 ноября 2011

То, что вы имеете в виду, это ОРМ, которых много. NHibernate, Entity Framework, даже ADO.NET (который вы уже используете) поддерживает реляционные наборы данных, хотя в этом случае вам обычно приходится использовать DataSet или производные классы со строгой типизацией.

Проверьте раздел .NET здесь для списка:

http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software

Какие у вас требования? Может быть, мы можем сузить это.

...