2012-08-31 45 views
0

有效我有一個表empinf 字段指定的轉換在EmployeeUtilityClass

Empid int 
EmpName Nvarchar 
Salary Numeric 

我有一個包含一個方法Getdetails一個EmployeeUtility類

public EmployeeDetails Getdetails(int employeeId) 
    { 
     SqlConnection con = new SqlConnection(connectionString); 
     SqlCommand cmd = new SqlCommand("SelectEmployee", con); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add(new SqlParameter("@Id",SqlDbType.Int,4)); 
     cmd.Parameters["@Id"].Value=employeeId; 


      try 
       { 
     con.Open(); 

     SqlDataReader reader = cmd.ExecuteReader(); 
     if (!reader.HasRows) return null; 
     reader.Read(); 
     EmployeeDetails emp = new EmployeeDetails((int)reader["EmpId"], (string)reader["EmpName"], (int)reader["Salary"]); 
     reader.Close(); 
     return emp; 
    } 
    catch (SqlException e) 
    { 
     throw new ApplicationException("Data error."); 

    } 
    finally 
    { 
     con.Close(); 
    } 


    } 


EmployeeDetails emp=new EmployeeDetails((int)reader["EmpId"],(string)reader["EmpName"],(int)reader["Salary"]); 

它示出了在此行中的錯誤指示Specified cast is not valid.請在它需要幫助。

我employeeDetails類如下:

public class EmployeeDetails 
{ 
    private int employeeID; 
    public int EmployeeID 
    { 
     get { return employeeID; } 
     set { employeeID = value; } 
    } 

    private string employeeName; 
    public string EmployeeName 
    { 
     get { return employeeName; } 
     set { employeeName = value; } 
    } 

    private int salary; 
    public int Salary 
    { 
     get { return salary; } 
     set { salary = value; } 
    } 

    public EmployeeDetails(int employeeId, string employeeName, int salary) 
    { 
     EmployeeID = employeeID; 
     EmployeeName = employeeName; 
     Salary = salary; 
    } 

    public EmployeeDetails() 
    { 
     // TODO: Complete member initialization 
    } 

} 

回答

1

試試這個:

EmployeeDetails emp=new EmployeeDetails(Convert.ToInt32(reader["EmpId"]),Convert.ToString(reader["EmpName"]),Convert.ToInt32(reader["Salary"])); 

//this assumes that you don't have NULL values in any of those columns, because if you do, it will fail. It would be more safe to check for DBNull.Value before trying to Cast these values. 
+1

謝謝先生,而轉換爲int32它現在工作,並在工資十進制數據類型。我加了Convert.Todecimal(reader [「Salary」])),它工作。 –

2

我假設這個錯誤是一個運行時異常,而不是一個編譯器錯誤?

的問題不在於你EmployeeDetails類 - 但這些

(int)reader["EmpId"], (string)reader["EmpName"], (int)reader["Salary"] 

一個或多個值中的一個被填充到數據讀取器不能轉換成intstring中,要麼是因爲一個糟糕的類型或因爲它爲空。

由於EmpId很可能是一個標識列,因此不爲空,我的錢在EmpName列爲空或Salary列實際包含一個浮點數或爲空。在第二種情況下,您可以使用int?,除非它只是簡單的數據,在這種情況下請確保該列不可爲空。

您可以使用Convert類將列值轉換爲.net類型 - 因爲它們實際上是Sql類型。也就是說,例如,這些類型(例如SqlInt32)確實支持直接投射到int,但如果基礎值爲null,它也會引發異常。這就是說,Convert也會如此;所以我想兩者其實都會做。

2

這主要是一種猜測,但它可能是這樣的:

Numeric是一個十進制的數據類型,而不是一個整數。但是你試圖直接把它轉換爲一個整數。如果數據庫中的Salary值是小數,請嘗試將該對象上的Salary值更改爲decimal

請注意,您可以通過簡單地一次刪除一個字段並重新運行測試,輕鬆調試此問題並縮小將來的問題範圍。當你刪除一個領域,它的工作原理,重新添加該領域,它再次不起作用,你已經找到了罪魁禍首。

還請注意,您的異常處理是可悲可憐的形式:

catch (SqlException e) 
{ 
    throw new ApplicationException("Data error."); 
} 

你不僅完全忽略了實際的異常,但你和其他的這是完全沒有背景的更換。您至少應該記錄發生的異常。

+0

對不起,先生,我沒注意抓住。我現在這樣做。並感謝您的幫助。它現在有效。 –