gpt4 book ai didi

c# - 用 SQL 语句的结果填充任何 ArrayList

转载 作者:行者123 更新时间:2023-11-30 14:00:29 25 4
gpt4 key购买 nike

我有以下代码接受 SQL 语句(字符串),将结果加载到 ArrayList(organisationList)中,它是组织的集合:

public void FillDataGridView(DataGridView grid, string SQLCommand)
{
SqlCommand dataCommand = new SqlCommand();
dataCommand.Connection = dataConnection;
dataCommand.CommandType = CommandType.Text;
dataCommand.CommandText = SQLCommand;

SqlDataReader dataReader = dataCommand.ExecuteReader();

while (dataReader.Read())
{
Organisation org = new Organisation();

org.OrganisationId = (int)dataReader["OrganisationId"];
org.OrganisationName = (string)dataReader["OrganisationName"];

organisationList.Add(org);
}

grid.DataSource = organisationList;
dataReader.Close();
}

我想调整此方法以填充传递给它的 ArrayList。

我是否可以将列表传递到方法中并得到类似的东西:

public void FillArrayList(DataGridView grid, SqlDataReader reader, ArrayList list)
{
//Fill the list with the contents of the reader
while (reader.Read())
{
Object obj = new Object

for(int i; i = 0; i < obj.NoOfProperties)
{
obj.Property[i] = reader[i];
}

list.Add(obj);
}
}

抱歉,如果这有点含糊,我是 OOP 的新手,有点迷茫!

编辑:根据达伦·戴维斯的建议,我修改了如下方法:

public void FillArrayList<T>(DataGridView grid, SqlDataReader reader, List<T> list)
{
//Fill the list with the contents of the reader
while (reader.Read())
{
Object obj = new Object();
Type type = typeof(T);

FieldInfo[] fields = type.GetFields(); // Get the fields of the assembly
int i = 0;

foreach(var field in fields)
{
field.SetValue(obj, reader[i]); // set the fields of T to the reader's value
// field.setValue(obj, reader[field.Name]); // You can also set the field value to the explicit reader name, i.e. reader["YourProperty"]
i++;
}

list.Add((T)obj);
}

grid.DataSource = list;
}

当我运行代码时,将对象转换为类型 T 时出现错误:

Unable to cast object of type 'System.Object' to type 'TestHarness.Organisation'.

我的印象是对象可以存储任何东西。谁能告诉我为什么不能执行此类型转换?

谢谢,

安迪

最佳答案

除非您使用的是 .NET 1.1,否则您可能不应该使用 ArrayList ;通用 List<T>更可取。

您不能将成员添加到 object - 它是不可扩展的。您需要知道要创建的对象的类型。泛型将是一个合理的对象。但是,为了节省您一些时间,您最好看看 dapper :

var list = dataConnection.Query<YourType>(SQLCommand).ToList();

这将做所有事情,使用直接的列名到成员名的映射。您需要创建一个 YourType类具有您期望的属性(适当键入)。

如果你用的是4.0,dapper也支持dynamic :

var list = dataConnection.Query(SQLCommand).ToList();

这使用 dynamic ,所以你仍然可以这样做(不声明类型):

foreach(var obj in list) {
Console.WriteLine(obj.OrganisationId);
Console.WriteLine(obj.OrganisationName);
}

我个人只会使用 dynamic如果数据的使用位置非常接近它的访问位置,则采用这种方法。对于从方法返回,通用方法是首选。同样,dynamic不适用于 DataGridView .

最后,我注意到没有参数;你总是想使用参数而不是连接。 Dapper 也支持:

string foo = ...;
var list = dataConnection.Query<YourType>(
"select * from SomeTable where Foo = @foo", new { foo }).ToList();

关于c# - 用 SQL 语句的结果填充任何 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10664770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com