可以说我有两个看起来像这样的类。
class Foo1
{
public String P1 { get; set; }
public String P2 { get; set; }
}
class Foo2
{
public String P3 { get; set; }
public String P4 { get; set; }
}
P1、P2、P3 和 P4没有任何关系。与Foo1和Foo2相同。它们代表完全不同的对象。
我有两个数据库表,其中包含 Foo1 和 Foo2 对象的列表。我必须创建一个 List<Foo1>
和List<Foo2>
返回 Foo1 和 Foo2 的存储过程的输入是不同的。
这是我的问题-我想创建一个通用函数,该函数将连接到数据库并根据需要获取 Foo1 或 Foo2 列表
最初我想到了这样的事情
internal static SqlDataReader GetData(String Proc,NameValueCollection InputParams,SqlConnection conn, ref String Err)
{
using (SqlCommand cmd = conn.CreateCommand())
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = Proc;
conn.Open();
SqlCommandBuilder.DeriveParameters(cmd);
foreach (SqlParameter p in cmd.Parameters)
{
if (p.Direction == ParameterDirection.Input)
{
if (InputParams[p.ParameterName.ToLower().Substring(1)] != String.Empty)
{
p.Value = InputParams[p.ParameterName.ToLower().Substring(1)];
p.DbType = DbType.AnsiString;
}
else
{
Err += "<argumentnotfound>" + p.ParameterName + "</argumentnotfound>";
}
}
else p.Value = DBNull.Value;
}
return cmd.ExecuteReader();
}
catch (Exception e)
{
return null;
}
}
}
我不喜欢在此函数之外返回 SqlDataReader 或创建和关闭 SqlConnection 的想法。
理想情况下,我想在此函数中遍历“阅读器”对象,但返回List<Foo1>
or List<Foo2>
。我能想到的一个解决方案是
internal static List<Object> GetData(NameValueCollection InputParams, ref String Err, String ClassName, String Proc)
{
List<Object> [] objectlist = new List<Object>();
using (SqlConnection conn = getConnection())
{
using (SqlCommand cmd = conn.CreateCommand())
{
try
{
/*
~~ Same as before
*/
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
if(ClassName == "Foo1")
{
Foo1 f = new Foo1();
f.P1 = reader["p1"].ToString();
objectList.Add(f1);
}
else if(ClassName == "Foo2")
{
/* Create and initialize Foo2 object*/
objectList.Add(f2);
}
}
return objectList;
}
catch (Exception e)
{
}
finally
{
conn.Close();
}
}
}
return null;
}
有更好/优雅的方法吗?
编辑
我忘了提到的是——我的最终目标是为来自 Javascript的AJAX调用创建JSON 。我的计划是遍历 Foo1 和 Foo2 对象列表来为每个请求创建 Json 数据。
我认为我可以在存储过程中创建 JSON 并将其作为 varchar(max) 返回并使用 JSON2.js 在客户端创建 JSOn 对象。我在这里看到的缺点是 varchar 的 8000 字符限制。