【问题标题】:SqlCommand and ExecuteReader return Non-Public MembersSqlCommand 和 ExecuteReader 返回非公共成员
【发布时间】:2012-11-14 00:47:22
【问题描述】:

我使用 SqlCommand 从 .sql 文件执行脚本查询。

我通过 ExecuteReader 获得结果。

但值是非公共成员,我无法访问它。

知道为什么以及如何解决这个问题吗?

代码

string root = AppDomain.CurrentDomain.BaseDirectory;
string script = File.ReadAllText(root + @"..\SGBD\select_user_from_all_bases.sql");
string connectionString = @"Data Source=(local);Integrated Security=SSPI";
var conn = new SqlConnection(connectionString);

conn.Open();

var users = new SqlCommand(script, conn).ExecuteReader();

foreach (var user in users)
{

}

conn.Close();

【问题讨论】:

  • 你有没有看过你应该如何使用这个 API?
  • 如果您不想大惊小怪地处理该 API,请考虑使用“dapper”之类的东西(在 NuGet 上搜索)。那么整个工作就是:var users = conn.Query<User>(script).ToList();
  • @MarcGravell - 实际上我想在 json 中公开这些用户,所以 Dapper 可能是我搜索的内容。谢谢。
  • @MarcGravell - 我在这里找到了解决方案:stackoverflow.com/a/8965906/652669

标签: c# sql sql-server


【解决方案1】:

如前所述,您可能不应该使用foreach。出于兼容性原因,它需要实现,但这里的while (reader.Read()) 循环更简单。也就是说,如果你愿意,无论如何你都可以使用foreachuser 值实现了IDataRecord,您可以使用该接口访问这些值。

foreach (IDataRecord user in reader)
{
    // access user[0], user["field"], etc. here
}

【讨论】:

    【解决方案2】:

    这是因为 ExecuteReader() 返回的是 SqlDataReader,而不是条目。

    Look at the documentation of the SqlDataReader to see how you should do:

    private static void ReadOrderData(string connectionString)
    {
        string queryString =
            "SELECT OrderID, CustomerID FROM dbo.Orders;";
    
        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            SqlCommand command =
                new SqlCommand(queryString, connection);
            connection.Open();
    
            SqlDataReader reader = command.ExecuteReader();
    
            // Call Read before accessing data.
            while (reader.Read())
            {
                Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
            }
    
            // Call Close when done reading.
            reader.Close();
        }
    }
    

    【讨论】:

    • 注意:commandreader 也应该有 using 语句。
    • 好的,我试过了,但是 reader[0] 返回 0 所以我认为它不起作用。事实上这是一个很好的结果,我是个白痴。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2010-11-15
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多