如何从类响应中填充数据表变量值

  • 本文关键字:填充 数据表 变量值 响应 c#
  • 更新时间 :
  • 英文 :


如何将检索类变量值传递给checkIn表单?

checkIn形式:我的问题是:为什么oldCheckInDt变量仍然是空的?

// assign variable 
DataTable oldCheckInDt = new DataTable();
private void btnUpdateCheckIn_Click(object sender, EventArgs e)
{
Retrieve.loadDataTable("sp_loadBasicCheckIn", oldCheckInDt, Convert.ToInt32(txtCheckInId.Text.Trim()));
// my question - why is "oldCheckInDt"// still empty
}

检索类:

public static void loadDataTable(string proc, DataTable tb, Int32 Id)
{
try
{
SqlCommand cmd = new SqlCommand(proc, MainClass.con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", Id);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
tb = dt;    // tb successfully filled with data.
}
else
{
tb = null;
}
}
catch (Exception ex)
{
MainClass.showMessage("Exception : " + ex, "error");
}
}

当以这种方式传递数据表时,接收方法在其堆栈中创建一个新变量(称为tb),并在该变量处分配对DataTable oldCheckInDt = new DataTable();行创建初始表的内存的引用。
现在,当您写入tb = dt;时,您正在将tb的值(它包含一个引用)更改为另一个引用(dt的值),但初始oldCheckInDt不受此操作的影响。它仍然包含原始引用。

这是编程的关键点。理解值和引用之间的区别是基本的,参见:值与引用以及更多关于这一点的文章。

然而,为了快速修复你的代码,我认为你应该返回loadDataTable方法中加载的数据表,而不是试图将加载的表分配给从调用者传递的参数。

public static DataTable loadDataTable(string proc, Int32 Id)
{
try
{
using(SqlConnection con = new SqlConnection(MainClass.Connectionstring))
{
con.Open();
SqlCommand cmd = new SqlCommand(proc, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@id", SqlDbType.Int32).Value = Id;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
catch (Exception ex)
{
MainClass.showMessage("Exception : " + ex, "error");
return null;
}
}

那么在调用代码中你可以写

// assign variable 
DataTable oldCheckInDt = new DataTable();
private void btnUpdateCheckIn_Click(object sender, EventArgs e)
{
oldCheckInDt ? Retrieve.loadDataTable("sp_loadBasicCheckIn", oldCheckInDt, Convert.ToInt32(txtCheckInId.Text.Trim()));
if(oldCheckInDt!= null && oldCheckInDt.Rows.Count > 0)
{
....
}    
else
{
....
}
}

注意对loadDataTable方法所做的其他更改。首先,使用全局连接对象并在应用程序的生命周期内保持打开状态是一个常见错误。创建/使用/销毁是保存资源和让ADO。. NET连接池为您提供连接服务。其次,不要使用AddWithValue,因为它对Date、Decimals/Float或事件字符串类型的参数有微妙的行为。最好避免它

最新更新