我正在尝试使用 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/