【问题标题】:Object is null using SqlCommand stored procedure to Object使用 SqlCommand 存储过程到 Object 对象为空
【发布时间】:2023-03-30 02:59:01
【问题描述】:

我正在尝试执行 SQL 存储过程并将结果收集到 List<T> 中。我没有收到错误,但列表始终为空。存储过程产生了 100 多条记录,所以我知道它不应该为空,但我不知道为什么它为空。

这是我的代码:

List<TicketExtendedFieldModel> list = new List<TicketExtendedFieldModel>();

using (SqlCommand cmd = new SqlCommand("GetExtendedFields", con))
{
    con.Open();
    cmd.CommandType = CommandType.StoredProcedure;

    list = cmd.ExecuteScalar() as List<TicketExtendedFieldModel>;
    con.Close();
}

非常感谢任何帮助。

【问题讨论】:

  • cmd.ExecuteScalar() 将始终返回单个值,而不是列表。仅当您确定变量属于该类型或处理不属于该类型的情况(在这种情况下将为null)时,才应使用as

标签: c# sql-server sqlcommand


【解决方案1】:

您的列表为空,因为 cmd.ExecuteScalar() 它不是 List&lt;TicketExtendedFieldModel&gt; 类型。将ExecuteScalar 更改为ExecuteReader

【讨论】:

  • 将 ExecuteScalar 更改为 ExecuteReader 不起作用。这是一个即时错误。我很确定我必须为此使用 SqlDataReader,然后是我尝试首先使用的 While(reader.Read),但尝试逐字段读取对象时出错。
  • 是的,使用 SqlDataReader 应该可以解决问题。什么错误?贴出代码和错误信息。
【解决方案2】:

您正在使用SqlCommand.ExecuteScalar() 执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行被忽略

那么现在我们将如何获得由 StoredProcedure 返回的 100 条记录的列表?

你可以使用SqlCommand.ExecuteReader()[还有更多方法可以做到这一点]

List<TicketExtendedFieldModel> list = new List<TicketExtendedFieldModel>();

using (SqlCommand cmd = new SqlCommand("GetExtendedFields", con))
{
   con.Open();
   cmd.CommandType = CommandType.StoredProcedure;

   SqlDataReader rdr = cmd.ExecuteReader();
   while (rdr.Read())
   {
      TicketExtendedFieldModel obj = new TicketExtendedFieldModel();
      // your properties from TicketExtendedFieldModel and then
      // obj.name = Convert.ToString(rdr["name"]);
      list.Add(obj);
   }
   con.Close();
}

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2012-12-06
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多