我正在开发一个新项目,我必须从一个表中读取数据并从另一个表中获取多个记录并将它们保存在同一个对象中。问题是当我在阅读器中为我的第二个查询读取多行时它工作正常,但是当我将它们分配给相应的对象变量时,它会给出对象引用错误。
这是我的代码。第一个读者实例只返回一个数据行,但第二个实例返回多行。到目前为止我做了什么我关闭了一个阅读器,然后打开另一个阅读器,检查它是否是一个线程问题,但现在使用。
public AdjustmentRequest GetAdjustmentRequestData(AdjustmentRequest Request)
{
AdjustmentRequest RequestData = new AdjustmentRequest();
using (OleDbConnection DbConnnection = new OleDbConnection(GetConnectionString()))
{
DbConnnection.Open();
//return list of all the Adjustment Categories
string query = "select * from AdjustmentRequests where RequestID ='" + Request.RequestID + "' and [DistributorCode] = '" + Request.DistributorCode + "' and [BranchCode] ='" + Request.BranchCode + "'";
OleDbCommand objOleDBcommand = new OleDbCommand(query, DbConnnection);
OleDbDataReader ojbOleDBReader = objOleDBcommand.ExecuteReader();
if (ojbOleDBReader.HasRows)
{
while (ojbOleDBReader.Read() == true)
{
RequestData.RequestID = ojbOleDBReader.GetValue(0).ToString();
RequestData.RequestStatus = ojbOleDBReader.GetValue(1).ToString();
RequestData.InvoiceNumber = ojbOleDBReader.GetValue(2).ToString();
RequestData.DistributorCode = ojbOleDBReader.GetValue(3).ToString();
RequestData.BranchCode = ojbOleDBReader.GetValue(4).ToString();
RequestData.Comments = ojbOleDBReader.GetValue(5).ToString();
RequestData.AdjustmentCategory = ojbOleDBReader.GetValue(6).ToString();
RequestData.UserID = Convert.ToInt32(ojbOleDBReader.GetValue(7));
}
}
else
{
RequestData = null;
}
if (DbConnnection != null)
{
ojbOleDBReader.Close();
}
string query1 = "select * from AdjustmentRequestDetails where RequestID ='" + Request.RequestID + "'";
OleDbCommand objOleDBcommandDetail = new OleDbCommand(query1, DbConnnection);
OleDbDataReader ojbOleDBReaderDetail = objOleDBcommandDetail.ExecuteReader();
if (RequestData != null)
{
if (ojbOleDBReaderDetail.HasRows)
{
while (ojbOleDBReaderDetail.Read() == true)
{
if (ojbOleDBReaderDetail.GetValue(2).ToString() == "Frait")
{
RequestData.RequestDetailFreight.RequestID = ojbOleDBReaderDetail.GetValue(0).ToString();
RequestData.RequestDetailFreight.AdjustmentCode = ojbOleDBReaderDetail.GetValue(1).ToString();
RequestData.RequestDetailFreight.AdjustmentCategory = ojbOleDBReaderDetail.GetValue(2).ToString();
RequestData.RequestDetailFreight.BrandCostCenter = ojbOleDBReaderDetail.GetValue(3).ToString();
RequestData.RequestDetailFreight.AmountRequested = ojbOleDBReaderDetail.GetValue(4).ToString();
RequestData.RequestDetailFreight.AmountApproved = ojbOleDBReaderDetail.GetValue(5).ToString();
RequestData.RequestDetailFreight.Status = ojbOleDBReaderDetail.GetValue(6).ToString();
RequestData.RequestDetailFreight.Assignee = ojbOleDBReaderDetail.GetValue(7).ToString();
RequestData.RequestDetailFreight.UpdatedDate = ojbOleDBReaderDetail.GetValue(8).ToString();
RequestData.RequestDetailFreight.UpdatedBy = ojbOleDBReaderDetail.GetValue(9).ToString();
RequestData.RequestDetailFreight.ApproveRejectDate = ojbOleDBReaderDetail.GetValue(10).ToString();
RequestData.RequestDetailFreight.RejectionCode = ojbOleDBReaderDetail.GetValue(11).ToString();
}
if (ojbOleDBReaderDetail.GetValue(2).ToString() == "Handling")
{
RequestData.RequestDetailHandling.RequestID = ojbOleDBReaderDetail.GetValue(0).ToString();
RequestData.RequestDetailHandling.AdjustmentCode = ojbOleDBReaderDetail.GetValue(1).ToString();
RequestData.RequestDetailHandling.AdjustmentCategory = ojbOleDBReaderDetail.GetValue(2).ToString();
RequestData.RequestDetailHandling.BrandCostCenter = ojbOleDBReaderDetail.GetValue(3).ToString();
RequestData.RequestDetailHandling.AmountRequested = ojbOleDBReaderDetail.GetValue(4).ToString();
RequestData.RequestDetailHandling.AmountApproved = ojbOleDBReaderDetail.GetValue(5).ToString();
RequestData.RequestDetailHandling.Status = ojbOleDBReaderDetail.GetValue(6).ToString();
RequestData.RequestDetailHandling.Assignee = ojbOleDBReaderDetail.GetValue(7).ToString();
RequestData.RequestDetailHandling.UpdatedDate = ojbOleDBReaderDetail.GetValue(8).ToString();
RequestData.RequestDetailHandling.UpdatedBy = ojbOleDBReaderDetail.GetValue(9).ToString();
RequestData.RequestDetailHandling.ApproveRejectDate = ojbOleDBReaderDetail.GetValue(10).ToString();
RequestData.RequestDetailHandling.RejectionCode = ojbOleDBReaderDetail.GetValue(11).ToString();
}
if (ojbOleDBReaderDetail.GetValue(2).ToString() == "Shipping Charges")
{
RequestData.RequestDetailShippingCharges.RequestID = ojbOleDBReaderDetail.GetValue(0).ToString();
RequestData.RequestDetailShippingCharges.AdjustmentCode = ojbOleDBReaderDetail.GetValue(1).ToString();
RequestData.RequestDetailShippingCharges.AdjustmentCategory = ojbOleDBReaderDetail.GetValue(2).ToString();
RequestData.RequestDetailShippingCharges.BrandCostCenter = ojbOleDBReaderDetail.GetValue(3).ToString();
RequestData.RequestDetailShippingCharges.AmountRequested = ojbOleDBReaderDetail.GetValue(4).ToString();
RequestData.RequestDetailShippingCharges.AmountApproved = ojbOleDBReaderDetail.GetValue(5).ToString();
RequestData.RequestDetailShippingCharges.Status = ojbOleDBReaderDetail.GetValue(6).ToString();
RequestData.RequestDetailShippingCharges.Assignee = ojbOleDBReaderDetail.GetValue(7).ToString();
RequestData.RequestDetailShippingCharges.UpdatedDate = ojbOleDBReaderDetail.GetValue(8).ToString();
RequestData.RequestDetailShippingCharges.UpdatedBy = ojbOleDBReaderDetail.GetValue(9).ToString();
RequestData.RequestDetailShippingCharges.ApproveRejectDate = ojbOleDBReaderDetail.GetValue(10).ToString();
RequestData.RequestDetailShippingCharges.RejectionCode = ojbOleDBReaderDetail.GetValue(11).ToString();
}
if (ojbOleDBReaderDetail.GetValue(2).ToString() == "Other")
{
RequestData.RequestDetailOther.RequestID = ojbOleDBReaderDetail.GetValue(0).ToString();
RequestData.RequestDetailOther.AdjustmentCode = ojbOleDBReaderDetail.GetValue(1).ToString();
RequestData.RequestDetailOther.AdjustmentCategory = ojbOleDBReaderDetail.GetValue(2).ToString();
RequestData.RequestDetailOther.BrandCostCenter = ojbOleDBReaderDetail.GetValue(3).ToString();
RequestData.RequestDetailOther.AmountRequested = ojbOleDBReaderDetail.GetValue(4).ToString();
RequestData.RequestDetailOther.AmountApproved = ojbOleDBReaderDetail.GetValue(5).ToString();
RequestData.RequestDetailOther.Status = ojbOleDBReaderDetail.GetValue(6).ToString();
RequestData.RequestDetailOther.Assignee = ojbOleDBReaderDetail.GetValue(7).ToString();
RequestData.RequestDetailOther.UpdatedDate = ojbOleDBReaderDetail.GetValue(8).ToString();
RequestData.RequestDetailOther.UpdatedBy = ojbOleDBReaderDetail.GetValue(9).ToString();
RequestData.RequestDetailOther.ApproveRejectDate = ojbOleDBReaderDetail.GetValue(10).ToString();
RequestData.RequestDetailOther.RejectionCode = ojbOleDBReaderDetail.GetValue(11).ToString();
}
}
}
}
if (DbConnnection != null)
{
ojbOleDBReaderDetail.Close();
DbConnnection.Close();
}
}
return RequestData;
}
答案 0 :(得分:0)
在@Shyju的建议之后,我在主对象构造函数中启动了内部对象,它就像一个魅力。谢谢@Shyju。
这就是我所做的。 我无法读取RequestData.RequestDetailFreight中的数据,因为主对象RequestData已被初始化,但内部对象却没有。所以我必须在AdjustmentRequest类中执行此操作RequestData是此类的一个对象。
public AdjustmentRequest()
{
RequestDetailFreight = new AdjustmentRequestDetailFreight();
RequestDetailShippingCharges = new AdjustmentRequestDetailShippingCharges();
RequestDetailHandling = new AdjustmentRequestDetailHandling();
RequestDetailOther = new AdjustmentRequestDetailOther();
RequestDetailNew = new List<AdjustmentRequestDetailNew>();
}