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クラスではなく、これらの1つにあります

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

データリーダーに入力されている1つ以上の値は、タイプが正しくないかnullであるため、intまたはに変換できません。string

EmpIdIdentity列である可能性が高く、したがってnullではないため、私のお金は、列EmpNameがnullであるか、Salary実際にfloatを含む列であるか、nullであるかのいずれかになります。int?2番目のケースでは、単に危険なデータでない限り、を使用できます。その場合は、列がnull許容でないことを確認してください。

このクラスを使用して、Convert列の値を.net型に変換できます。これは、実際にはSql型になるためです。とは言うものの、これらのタイプ(たとえば)は、たとえばSqlInt32への直接キャストをサポートしていintますが、基になる値がnullの場合は例外もスローします。そうは言っても、そうなるでしょうConvert。だから私はどちらかが実際に行うと思います。

于 2012-08-31T12:37:59.487 に答える
2

これはほとんど推測ですが、これである可能性があります。

(int)reader["Salary"]

Numericは10進数のデータ型であり、整数ではありません。しかし、あなたはそれを整数に直接キャストしようとしています。データベースのSalary値が10進数のSalary場合は、オブジェクトの値もに変更してみてくださいdecimal

一度に1つのフィールドを削除してテストを再実行するだけで、これを簡単にデバッグし、将来的に問題を絞り込むことができることに注意してください。フィールドを削除して機能する場合は、フィールドを再度追加しても機能しません。原因が見つかりました。

また、例外処理はひどく貧弱な形式であることに注意してください。

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 に答える