如何使用SqlDataAdapter填充List<String>?

5

我正在尝试使用SqlDataAdapter填充List,但我无法做到。除了数据适配器之外,还有其他方法可以填充字符串列表吗?请帮助我解决这个问题。谢谢。

下面是我的代码:

public List<String> JSONDataAll()
        {
            List<String> Users = new List<String>();
            con.Open();
            SqlCommand cmd = new SqlCommand("sp_sample_Proc", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(Users);
        }

可能是如何选择将数据选择到List<T>而不是DataTable中?的重复问题。 - Andrey Korneyev
你需要先填充一个datatable,然后从datatable中创建一个List<string> - Ben Robinson
存储过程的返回值是什么?你能添加SP的代码吗? - Steve
是的,现在它可以工作了。 - Vetri
编辑有什么问题吗?如果您需要提出新问题,请不要修改当前的问题,而是提出一个新问题。 - Habib
抱歉,我会在新问题中发布。 - Vetri
3个回答

8

最简单的方法是通过SqlDataReader读取数据,然后迭代结果集填充列表,例如:

public List<String> JSONDataAll()
{
    List<String> Users = new List<String>();
    using (SqlConnection con = new SqlConnection("connectionString"))
    {
        con.Open();
        using (SqlCommand cmd = new SqlCommand("sp_sample_Proc", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    Users.Add(reader.GetString(0)); //Specify column index 
                }
            }
        }
    }
    return Users;
}

在你当前的代码中,你试图使用DataAdapter填充 List<string>,但这是不可行的。相反,你可以填充一个DataTable,然后获取一个List<string>,如下:

DataTable dt = new DataTable();
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
Users = dt.AsEnumerable()
    .Select(r => r.Field<string>("ColumnName"))
    .ToList();

但是,你不应该这样做。这会导致多次迭代,首先用于填充DataTable,第二次用于创建List<string>


@Habib,你能用LINQ帮我得到相同的东西吗?我已经更新了我的LINQ代码。我遇到了转换错误。 - Vetri
@user3336505,这与当前问题的范围无关。如果您有新的问题,请提出新的问题。您之所以会出现错误,是因为您选择了一个匿名类型,然后尝试返回List<string>。一个List<string>怎么可能有一个Key和一个整数值的总计数呢?我不太确定您为什么要使用GroupBy - Habib
我想要以键和值的形式获取数据。 - Vetri
1
@user3336505,您不能返回匿名类型。您可以创建一个新类,其中包含两个属性Key和Count,并将查询结果投影到该类的对象上并返回List<ThatClass>。请参见:https://dev59.com/72kw5IYBdhLWcg3wMHkY - Habib
1
@Habib非常感谢您的帮助 :) - Vetri

7
请尝试这个。
DataTable dt = new DataTable();
da.Fill(dt);
Users = dt.AsEnumerable().Select(n => n.Field<string>(0)).ToList();

0
如果您的数据库中的类型不同,您可以使用此方法,它将接受所有类型。
var dataTable= new DataTable();
dataTable.Fill(dataTable);
var users = dataTable.AsEnumerable().Select(n => n.ItemArray).ToList();

你将获得一个漂亮的元素列表作为结果:

[[3,"Adam","Smith","adamSmith@gmail.com","Kokos",1],
[5,"Dominika","Smith","dominikaSmith@gmail.com","Domis",2]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接