C# 如何使用SqlDataReader在结构数组中存储多个值

C# 如何使用SqlDataReader在结构数组中存储多个值,c#,arrays,sql-server,datareader,C#,Arrays,Sql Server,Datareader,我想使用SqlDataReader用我的SQL Server数据库中的数据填充用户数组 这是我目前的代码: public struct User { public int id; public string log; public string password; public User (int id1,string s, s2) { id=id1; log =s; password=s2; }

我想使用
SqlDataReader
用我的SQL Server数据库中的数据填充用户数组

这是我目前的代码:

public struct User
{
    public int id;
    public string log;
    public string password;

    public User (int id1,string s, s2)
    {
        id=id1;
        log =s;
        password=s2;
    }
}

User[] al = new User[50];
int i=0;

using (SqlConnection connection = new SqlConnection("string")
{
    connection.Open();

    SqlCommand command = new SqlCommand("Select [UserName], [Password]. from [TaUser]", connection);

    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // populate the al array with the datas from the 3 columns : ID, UserName, Password
        }
    }

    connection.Close();
}

我知道,如果我有一个简单的arraylist,我可以只做
al.Add(“”
),但是,当涉及到结构数组时,我会遇到困难。

我建议这样做:

SqlDataReader dataReader = cmd.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(dataReader);
string name = dataTable.Rows[0]["UserName"] as string;
然后像这样读取该数据表:

SqlDataReader dataReader = cmd.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(dataReader);
string name = dataTable.Rows[0]["UserName"] as string;

然后用收集的信息填充用户结构。工作完成了吗?

您的代码中有很多错误

首先,您的用户构造函数无效,它应该是:

public User(int id1, string s, string s2)
其次,您的查询不返回用户id

第三,使用列表而不是数组可能更好

尽管如此,这应该是可行的

List<User> userList = new List<User>() ;
using (SqlConnection connection = new SqlConnection("string")
{
connection.Open();

SqlCommand command = new SqlCommand("Select [Id], [UserName], [Password]. from [TaUser]", connection);

using (SqlDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        var id = reader.GetInt32(0);
        var userName = reader.GetString(1);
        var pwd = reader.GetString(2);
        var user = new User(id, userName, pwd);
        userList.Add(user);
    }
}
connection.Close();

// if you really need an array, do it here
var al = userList.ToArray()
List userList=newlist();
使用(SqlConnection=newsqlconnection(“字符串”)
{
connection.Open();
SqlCommand=newsqlcommand(“选择[Id]、[UserName]、[Password]。从[TaUser]”,连接);
使用(SqlDataReader=command.ExecuteReader())
{
while(reader.Read())
{
var id=reader.GetInt32(0);
var userName=reader.GetString(1);
var pwd=reader.GetString(2);
var user=新用户(id、用户名、pwd);
添加(用户);
}
}
connection.Close();
//如果您确实需要数组,请在此处执行
var al=userList.ToArray()

使用
将其保存到
列表中。添加
,然后调用
。ToArray()
要从列表中获取数组,您的结构没有与查询相同的字段。例如,结构中没有
用户名
字段;而是有一个名为
日志
的神秘字段。这是故意的吗?另外,您的查询返回两列,但是
用户
的构造函数需要3个参数。发生了什么在这里?@JohnWu在不同的域中有不同的属性名并不少见,我建议您使用只读属性使其不可变,因为可禁用的结构会给您带来很多麻烦。最好将其作为一个类,因为作为一个结构,它在一开始并没有真正意义。@dan如果它们不同,则可以,但OP需要指定映射,特别是当属性多于列时。