也許SO不是這個地方,如果不是,我很抱歉,但我不禁想到有一個更好的方法來做到這一點。這看起來像是一個嚴重而不是很乾淨的方法,用於檢查我正在處理的結果集,然後執行相應的操作。任何人有任何建議? (請忽略我總是返回null的事實)。乾淨的設計來處理從IDataReader的多個結果集
public MemberDto Load(long entityId)
{
using (var cn = new SqlConnection(@"connectionstringstuff"))
{
cn.Open();
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandText = "Client.[MemberGet]";
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@EntityId", entityId);
using (IDataReader dr = cm.ExecuteReader())
{
var memberModel = new MemberDto();
do
{
while (dr.Read())
{
var sdr = new SafeDataReader(dr);
var firstColumn = sdr.GetName(0);
if (firstColumn.StartsWith("Attribute"))
{
AddAttribute(memberModel, sdr);
}
else if (firstColumn.StartsWith("AlternateId"))
{
AddAlternateId(memberModel, sdr);
}
else
{
memberModel.ClientId = sdr.GetInt64("ClientId");
memberModel.Id = sdr.GetInt64("EntityId");
memberModel.Name = sdr.GetString("EntityName");
}
}
} while (dr.NextResult());
}
}
}
return null;
}
private void AddAttribute(MemberDto model, SafeDataReader reader)
{
model.Attributes.Add(
reader.GetInt32("AttributeTypeId").As<EntityAttributeType>(),
reader.GetString("Value"));
}
private void AddAlternateId(MemberDto model, SafeDataReader reader)
{
model.Attributes.Add(
reader.GetInt32("AlternateIdTypeId").As<EntityAttributeType>(),
reader.GetString("Value"));
}
難道你不知道哪個結果集排在第一位嗎? –
是的,我控制着SP。我只是希望不必依賴訂單,以防因某種原因將來有人改變它。我並不完全反對,但我試圖迴避它。 – phreak3eb
@ phreak3eb該訂單應被視爲SP,IMO合同的一部分。如果這種變化,應該預計來電者需要改變。 –