0

我有一个表 empinf 字段

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
    }

}
4

3 回答 3

2

我假设这个错误是运行时异常,而不是编译器错误?

问题不在于你的EmployeeDetails班级——而在于其中之一

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

填充到数据读取器中的一个或多个值无法转换为intor string,原因可能是类型错误或为 null。

由于EmpId可能是一个标识列,因此不为空,我的钱要么EmpName是空的Salary列,要么是实际包含浮点数的列,或者是空的。在第二种情况下,您可以使用int?,除非它只是简单的不可靠数据,在这种情况下,请确保该列不可为空。

您可以使用Convert该类将列值转换为 .net 类型 - 因为它们实际上是 Sql 类型。也就是说,这些类型 -SqlInt32例如 - 确实支持直接转换int为 例如,但如果基础值为 null,它也会引发异常。也就是说,也会如此Convert;所以我想两者都可以。

于 2012-08-31T12:37:59.487 回答
2

这主要是一个猜测,但它可能是这样的:

(int)reader["Salary"]

Numeric是十进制数据类型,而不是整数。但是您试图直接将其转换为整数。如果Salary数据库中的值是小数,请尝试将Salary对象上的值也更改为 a decimal

请注意,您只需一次删除一个字段并重新运行测试即可轻松调试此问题并缩小问题范围。当您删除一个字段并且它起作用时,重新添加该字段并且它再次不起作用,您找到了罪魁祸首。

另请注意,您的异常处理形式非常糟糕:

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

您不仅完全忽略了实际异常,而且将其替换为另一个完全没有上下文的异常。您至少应该记录发生的异常。

于 2012-08-31T12:38:17.767 回答
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.
于 2012-08-31T12:37:05.287 回答