c# - 无法从另一个类 C# 获取变量的值

标签 c# asp.net

我正在尝试使用 Crystal Report 打印候选人的信息。

candidate_id 放在candidate class 中,我想要的是在我的 Report 类中获取此 id,以根据 candidate_id 打印 CrystalReport。

以下是我的候选类代码

public partial class Candidate : System.Web.UI.Page {
    string candidate_id;         
    public String CandId {
        get { return candidate_id; }
        set { 
            //getting id stored in session and setting its value
            candidate_id = Convert.ToString(Session["candidate_id_in_session"]); 
        }
    }

这是我的Report Class,我正在尝试获取candidate_id

public class Report {    
    public static DataSet LoadReport() {
        string candidate_val;            
        Candidate can = new Candidate();
        candidate_val = can.CandId;

        SqlDataAdapter da = new SqlDataAdapter();
        SqlCommand command = new SqlCommand(
            "SELECT * From personal_information " + 
            "WHERE candidateNo = @candidate_val", myConn
        );

        command.Parameters.AddWithValue("@candidate_val",candidate_val);
        da.SelectCommand = command;
        DataSet ds = new DataSet();
        da.Fill(ds, "personal_information");
        return ds;
    }
}

我收到以下异常,这显然意味着我没有从其他类(class)获得 candidate_id

System.Data.SqlClient.SqlException: The parameterized query '(@ nvarchar(4000))SELECT * From personal_information WHERE c' expects the parameter '@candidate_val', which was not supplied.

请告诉我我哪里做错了?

我已经检查了值是在 setter 中设置的,但没有在 getter 中返回,另一件有趣的事情是,如果我在 getter 中返回硬编码值,那么它会被传递给另一个类。

最佳答案

您提供一个 null此行中的值:

command.Parameters.AddWithValue("@candidate_val",candidate_val);

因为你设置了candidate_val像这样:

Candidate can = new Candidate();
candidate_val = can.CandId;

并在新创建的 Candidate 中, 没有设置 CandId , CandId 的值是null .

同时执行CandId属性有点奇怪。我会这样实现它:

public String CandId {
    get { return Convert.ToString(Session["candidate_id_in_session"]; }
    set { Session["candidate_id_in_session"] = value; }
}

否则你必须调用CandId = <any value you want>从 session 中获取值到 CandId属性 - 这符合逻辑吗?

作为程序员,我希望该属性返回当前值并在设置时更改当前值,这不是您的实现所做的。


因为评论里提到了:要设置参数为DBNull明确地,你需要这样的东西:

command.Parameters.AddWithValue("@candidate_val",candidate_val ?? DBNull.Value);

只是为了更清楚:我认为像这样实现属性是非常糟糕的风格!如果我打电话

CandId = "Hello";

我希望该属性的值是“Hello”,而不是其他值,就像您的情况一样!


从我得到的评论中,您甚至不想设置该属性。那么你应该这样修改它:

public String CandId {
    get { return Convert.ToString(Session["candidate_id_in_session"]; }
}

最终编辑

您正在实现的设计计划不周。类(class)Report实际上独立于任何与 UI/web/交互相关的东西,而是一个纯业务逻辑类。事实上,无论您是在 ASP.NET、WinForms、WPF 还是 Windows 服务项目中使用此类,都没有关系。为什么要通过访问 ASP.NET session 来引入依赖项?没有理由这样做,也不应该这样做(就像业务逻辑不应该显示错误消息一样)。

您应该更改方法,以便它们将所需的值作为参数(并且在您这样做时,适本地释放资源):

public class Report {    
    public static DataSet LoadReport(string candidate_val) {
        using (SqlCommand command = new SqlCommand("SELECT * From personal_information WHERE candidateNo = @candidate_val", myConn))
        using (SqlDataAdapter da = new SqlDataAdapter(command))
        {
            command.Parameters.AddWithValue("@candidate_val",candidate_val);

            DataSet ds = new DataSet();
            da.Fill(ds, "personal_information");
            return ds;
        }
    }
}

如果这样做了,您的问题将通过简单地调用 LoadReport 来解决。用作:

DataSet ds = Report.LoadReport(Convert.ToString(Session["candidate_id_in_session"]));

关于c# - 无法从另一个类 C# 获取变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22008338/

相关文章:

c# - 在 .NET 4.5 TypeInfo.DeclaredMembers 上过滤掉私有(private)成员

c# - 如何使用可以根据用户系统更改的 wix 创建快捷方式

c# - 当您声明一个没有实例的对象时,.Net 会做什么?

css - ASP.NET 内部样式不知从何而来

javascript - asp.net 如何让网站达到全宽和全高

asp.net - Visual Studio 中 'Web Site' 和 'Project' 之间的区别

c# - 使用dropzone需要添加额外的值

c# - 自动递增 AssemblyInformationalVersion

asp.net - CREATE DATABASE 权限在数据库 'master' 中被拒绝 - 使用 Web 部署、EF 代码优先、Visual Studio

asp.net - VS 2015 和 msbuild 抑制 typescript 错误