2013-08-30 101 views
3

我与ASP.NET MVC 4用C#和SQL Server选择从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) 
); 

使用下面的代码选择数据行工作NULL值

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_EmailMPh ..等,有时含有NULL值..如果值为null我想返回null)。任何人都请帮助我。

+2

与你的问题无关(因为你有下面的答案),但你的尝试,赶上,最后都是多余的。捕获和抛出是毫无意义的(并且会按照你实现的方式截断堆栈跟踪),并且finally会关闭连接,即使你使用'using'语句将会为你处理。 –

+0

使用连接器或ORM将在这里帮助很大。就个人而言,当我听到“C#”和“SQL Server”时,我认为实体框架,但有很多的选择。 – anaximander

回答

4

只是做一些简短的,如果,你应该为所有其他变量做同样的:

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

你可能疼痛严重金额保存自己这里像短小精悍的工具(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 '方法通过'IEnumerable '(即每行)将每个找到的行记录到'T'的实例中。从那里我们可以使用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

治疗可空字段:

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

相同: mb.Mem_MPh,mb.Mem_BGr和mb.Mem_Spouse。