【问题标题】:SqlDataReader result view returns notdefined somthingSqlDataReader 结果视图返回未定义的东西
【发布时间】:2018-03-28 12:20:43
【问题描述】:

我的代码有点问题。

我尝试从本地 SQL Server 检索数据。连接正确,存储过程也正确。但是当我从SqlDataReader 读取行时,它是空的。但是当我看SqlDataReader 时,有什么东西?里面,但不是结果。

SQL 查询在 SQL Server Management Studio 中运行良好。

这是我的代码:

List<Customer> customers = new List<Customer>();

using (SqlConnection conn = new SqlConnection())
{
    conn.ConnectionString = "Server=DESKTOP-U8E1S5I;Database=Queue;Trusted_Connection=true";
    conn.Open();

    SqlCommand command = new SqlCommand("GetCustomers", conn);

    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            customers.Add(new Customer
                          {
                            Name = (string)reader["CustomerName"],
                            WaitingNumber = (int?)reader["CustomerNumber"],
                            EnterTime = (DateTime?)reader["CustomerNumber"],
                            Status = (int)reader["CustomerStatus"]
                          });                        
        }
    }
}

结果是“Enumeration Yielded No Results”,其中两行包含 ?:(断点在 reader.read() 之前)

Enumeration Yielded No Results

感谢您的帮助。

【问题讨论】:

  • 尝试迭代reader 是个坏主意——除此之外,当你这样做时,你已经消耗了数据;本质上:即使在调试器中查看这个也会破坏值。所以;当前没有断点会发生什么;你能到reader.Read()吗?它会进入内部以达到customers.Add 吗?注意:严格来说,在这里设置command.CommandType = CommandType.StoredProcedure; 是个好主意,但你通常会侥幸逃脱,只要你不传递参数
  • 错字:您使用了两次CustomerNumber。它可能不是intDateTime。 (这与您最初的错误无关,但这是您接下来会遇到的问题。)
  • @JeroenMostert 实际上,我强烈怀疑您在这里“赚到了钱”,并且 real 问题是在阅读 EnterTime 时出现的无效转换异常 -我进一步怀疑 OP 正在尝试调试代码以找出其不起作用的原因,并且意外地通过调试断点视图消耗了数据
  • @jeroen 它是接下来的事情,但是主要我没有输入命令类型,所以结果只是空的。

标签: c# sql-server


【解决方案1】:

默认情况下,SqlCommand 具有定义为 CommandType.Text 的属性 CommandType,供临时 sql 使用。您必须通过在命令上设置 CommandType 来指定您正在使用 stored procedure。示例:

SqlCommand command = new SqlCommand("GetCustomers", conn);
command.CommandType = CommandType.StoredProcedure;

不要忘记添加命名空间System.Data

【讨论】:

  • 虽然我同意你的观点,但应该指定这一点:它没有引发异常的事实意味着这可能不是直接问题
  • 感谢@MarcGravell 的评论。我想问你为什么说(在对问题的评论中)迭代 SqlDataReader 是一个坏主意?我知道它仍然连接在数据库上,但是在从结果集中获取数据时,还有其他好的方法可以保持性能吗?谢谢。
  • 我的意思是在调试器中这是一个坏主意,因为它会不可逆地改变数据;由于 IDE 会扩展到序列的末尾,这意味着一旦您在 IDE 中查看过一次,数据就不再存在
【解决方案2】:

您需要指定您使用的是存储过程,见下文

SqlCommand command = new SqlCommand("GetCustomers", conn);
command.CommandType = CommandType.StoredProcedure;

或者

SqlCommand command = new SqlCommand("GetCustomers", conn) {
   CommandType = CommandType.StoredProcedure
};

【讨论】:

  • 虽然我同意你的观点,但应该指定这一点:它没有引发异常的事实意味着这可能不是直接问题
猜你喜欢
  • 2017-11-06
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2023-03-31
  • 2019-01-25
  • 1970-01-01
相关资源
最近更新 更多