目标:实现创建广告系列的更通用方法。
问题:我必须创建多个arraylists,每个arraylists都匹配一个唯一的结构,以便在Sql数据库中比较和更新表。本着DRY的精神,我试图找到一种更好的方法来创建每个数组。我使用的代码如下
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Configuration;
public static void Users()
{
String sql = "";
try
{
conn.Open();
sql = "SELECT" +
"database.dbo.table1.username," +
"database.dbo.table1.status" +
"FROM" +
"database.dbo.table1";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
//structure below
User structure_A = new User();
structure_A.username = dr.GetValue(0).ToString();
structure_A.status = dr.GetValue(1).ToString();
//added to arraylist
arraylist_A.Add(structure_A);
}
dr.Close();
conn.Close();
}
注意:可根据要求提供更多信息。提前感谢您的任何见解
答案 0 :(得分:3)
您可以做的一件事是创建一个采用不同参数的通用方法。例如:
public static ArrayList LoadInfo<T>(string sql, Func<SqlDataReader, T> getItem) where T: new
{
var list = new ArrayList();
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
list.Add(getItem(dr));
}
return list;
}
public static User LoadUser(SqlDataReader dr)
{
User structure_A = new User();
structure_A.username = dr.GetValue(0).ToString();
structure_A.status = dr.GetValue(1).ToString();
return User;
}
现在,要调用它来加载用户,只需将SQL查询和LoadUser
方法传递给它:
string usersQuery = "SELECT ...."; // select users query
ArrayList usersList = LoadInfo(usersQuery, LoadUser);
如果你需要加载一堆Fooby
个对象,你可以创建一个Fooby查询和一个LoadFooby
方法,它可以从数据行创建和填充Fooby。
我建议你考虑使用List而不是ArrayList
。
答案 1 :(得分:1)
您可以使用泛型来解决问题,并使用反射来找出结构的外观。但我建议改为查看实体框架。
首先在这里首先使用EF数据库:http://msdn.microsoft.com/en-us/data/jj200620