2013-08-30 3 views
3

Я работаю с ASP.NET MVC 4, используя C# и SQL ServerВыберите NULL значение из таблицы SQL Server

Я выбор строки данных из следующей таблицы

CREATE TABLE [dbo].[Mem_Basic] (
[Id]   INT   IDENTITY (1, 1) NOT NULL, 
[Mem_NA]  VARCHAR (100) NOT NULL, 
[Mem_Occ]  VARCHAR (200) NOT NULL, 
[Mem_Role] VARCHAR (200) NOT NULL, 
[Mem_Email] VARCHAR (50) NULL, 
[Mem_MPh]  VARCHAR (15) NULL, 
[Mem_DOB]  DATE   NULL, 
[Mem_BGr]  NCHAR (10) NULL, 
[Mem_WAnn] DATE   NULL, 
[Mem_Spouse] VARCHAR (75) NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

используя следующий код

public MemberBasicData GetMemberProfile(int id) 
{ 
     MemberBasicData mb = new MemberBasicData(); 
     using (SqlConnection con = new SqlConnection(Config.ConnectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("SELECT * FROM Mem_Basic WHERE Id="+id+"", con)) 
      { 
       try 
       { 
        con.Open(); 
        SqlDataReader reader = cmd.ExecuteReader(); 
        if(reader.Read()==true) 
        { 
         mb.Id = (int)reader["Id"]; 
         mb.Mem_NA = (string)reader["Mem_NA"]; 
         mb.Mem_Occ = (string)reader["Mem_Occ"]; 
         mb.Mem_Role = (string)reader["Mem_Role"]; 
         mb.Mem_Email = (string)reader["Mem_Email"]; 
         mb.Mem_MPh = (string)reader["Mem_MPh"]; 
         mb.Mem_DOB = (Convert.ToDateTime(reader["Mem_DOB"])); 
         mb.Mem_BGr = (string)reader["Mem_BGr"]; 
         mb.Mem_WAnn = (Convert.ToDateTime(reader["Mem_WAnn"])); 
         mb.Mem_Spouse = (string)reader["Mem_Spouse"]; 
        } 
       } 
       catch (Exception e) { throw e; } 
       finally { if (con.State == System.Data.ConnectionState.Open) con.Close(); } 
      } 
     } 
     return mb; 
    } 

Это показывает ошибку

Невозможно наложить объект типа «System.DBNull» на тип «System.String».

(Mem_Email, MPh .. и т.д. иногда содержат значение NULL .. если значение равно нулю, я хочу вернуть нуль). Кто-нибудь, пожалуйста, помогите мне.

+2

Не связанный с вашим вопросом (как у вас есть ответ ниже), но ваша попытка, поймать и, наконец, все излишне. Ловить и бросать бессмысленно (и усекает трассировку стека так, как вы ее реализовали), и, наконец, закрытие соединения, даже если ваше использование оператора 'use' будет обрабатывать это для вас уже. –

+0

Использование разъема или ORM поможет здесь много. Лично, когда я слышу «C#» и «SQL Server», я думаю, что Entity Framework, но есть много альтернатив. – anaximander

ответ

4

Просто сделайте несколько коротких, если вы должны сделать то же самое для всех других переменных:

mb.Mem_Email = reader["Mem_Email"] == System.DBNull.Value ? null : (string) reader["Mem_Email"]; 
3

Вы можете сэкономить серьезную сумму боли здесь с помощью инструмента, как Dapper (http://www.nuget.org/packages/Dapper):

public MemberBasicData GetMemberProfile(int id) 
{ 
    using (var con = new SqlConnection(Config.ConnectionString)) 
    { 
     return con.Query<MemberBasicData>(
      "SELECT * FROM Mem_Basic WHERE [email protected]", 
      new { id } // full parameterization, done the easy way 
     ).FirstOrDefault(); 
    } 
} 

вещи это:

  • делает правильную настройку параметров (для производительности и SAF щества), но без каких-либо неудобств
  • делает все материализации, обработка аннулирует (как в параметрах и столбцах) для вас
  • безумно оптимизированные (в основном, это измеримо с той же скоростью, как писать весь код самостоятельно, за исключением случаев меньше вещи, чтобы получить неправильно)
+0

Отличный выбор! –

+0

Как я могу вернуть модель, используя этот – neel

+1

@Parvathiiiii, код выше ** показывает **, как вы возвращаете модель, используя это. Это точно *. В принципе, метод 'Query ' материализует каждую строку, найденную в экземпляре 'T' через' IEnumerable '(т. Е. На строку); оттуда мы можем использовать LINQ, если хотим, поэтому 'FirstOrDefault' получает нас от' IEnumerable '' 'T'. –

0

Изменить для всех столбцов, которые могут быть NULL из этого

mb.Mem_NA = (string)reader["Mem_NA"]; 

к тому, что

mb.Mem_NA = reader["Mem_NA"].ToString(); 
2

В качестве альтернативы ответа короля Кинга вы можете написать код так:

mb.Mem_Email = reader["Mem_Email"] as string; 

Для типов значений, если столбец допускает пустые значения, это хорошая практика, чтобы сопоставить их с обнуляемыми типами значений в C# так, что этот код reader["Mem_DOB"] as DateTime? работает

0

Лечить NULLABLE поля:

mb.Mem_Email = System.DBNull.Value.Equals(reader["Mem_Email"])?"": 
             (string)reader["Mem_Email"]; 

Do то же для: mb.Mem_MPh, mb.Mem_BGr и mb.Mem_Spouse.

Смежные вопросы