2013-08-30 102 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。