当前位置: 首页 > 面试题库 >

SqlDataReader读入List

丁学
2023-03-14
问题内容

我正在用C#编写一种从WCF服务查询SQL Server Express数据库的html" target="_blank">方法。我必须使用ADO.NET来做到这一点(然后稍后用LINQ重写它)。

该方法采用两个字符串(fname, lname),然后从匹配记录中返回“ Health Insurance NO”
(健康保险否)属性。我想将其读入列表(还有一些其他属性也可以检索)。

当前代码返回一个空列表。我要去哪里错了?

public List<string> GetPatientInfo(string fname, string lname)
{
    string connString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Users\\xxxx\\Documents\\Visual Studio 2010\\Projects\\ADOWebApp\\ADOWebApp\\App_Data\\ADODatabase.mdf;Integrated Security=True;User Instance=True";

    SqlConnection conn = new SqlConnection(connString);

    string sqlquery = "SELECT Patient.* FROM Patient WHERE ([First Name] = '"+fname+"') AND ([Last Name] = '"+lname+"')";
    SqlCommand command = new SqlCommand(sqlquery, conn);
    DataTable dt = new DataTable();

    List<string> result = new List<string>();

    using (conn)
    {
        conn.Open();

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader != null && reader.Read())
            {
               dt.Load(reader);
               result.Add(Convert.ToString(reader["Health Insurance NO"]));
            }
        }
     }

     return result;
}

问题答案:

您正在尝试加载DataTableDataTable.Load>在一个循环<。您只需要一次。您还在reader.Read()循环中使用。SqlDataReader.Read()使读者前进到下一条记录,而不会消耗它。如果要使用DataTable.Load,则无需先阅读阅读器。因此,您只需要完全删除循环即可加载表。

但是,由于您要返回列表,因此根本不需要列表DataTable,只需循环阅读器即可:

List<string> result = new List<string>();
using (conn)
{
    conn.Open();
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while(reader.Read())
        {
            result.Add(Convert.ToString(reader["Health Insurance NO"]));
        }
    }
}

除此之外,您还可以进行不带sql参数的sql注入。



 类似资料:
  • 问题内容: 我正在尝试使用C#查找表的计数,但是我一直在获取 不存在数据时进行无效的读取尝试 我的代码: 我知道我与数据库之间存在有效的连接,因为我可以在许多地方进行读写操作,但是我无法正确读取数据库有何特别之处?我该如何填充? 问题答案: 您必须阅读: 或者,您可以只使用ExecuteScalar: 定义为: 执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。

  • 问题内容: 我试图通过迭代读取器来获取返回的行数。但是运行此代码时,我总是得到1吗?我在这件事上搞砸了吗? 问题答案: SQLDataReaders是仅转发的。您实际上是在这样做: 您可以改为:

  • 问题内容: 我的存储过程: 在我的C#代码中 有人可以告诉我我做错了什么吗?谢谢你。 问题答案: 我的猜测是,该值将以而不是装箱返回。取消装箱时,类型必须 完全 正确。因此,假设我是对的,但事实并非如此,您可以使用: 它会工作。不过,这很丑陋。如果真正使用单精度值, 则 使用它应该正确,而且(IMO)情况更清楚。 __ 另一方面,您的数据 实际上 可能以的形式从数据库中返回,在这种情况下,您应该(

  • 问题内容: 我该如何更改: 得到 MAX(FormID) 吗? 我的自然趋势是在FormID周围抛出一个MAX,但是我遇到了IndexOutOfRange异常。 问题答案: 当您选择最大ID时,您不应使用-查询仅返回一项,默认情况下未命名,因此您的现有查询会中断,因为它希望得到一个名为“ FormID”的结果-尽管您可以通过以下方式“固定”查询使用。而是使用:

  • 问题内容: 在我的数据库中,我具有NextStatDistanceTime值作为浮点数。执行“ ”行时,出现错误 系统无效的强制转换异常 如何在此代码中从sql命令获取浮点值? 这是我的代码: 问题答案: 我想是时候放一张桌子了。 T-SQL类型名称 相当于.NET C#类型名称 `DataReader` 方法 `FLOAT` `System.Double` `double` `IDataRead

  • 问题内容: 问题继续,我发现自己一遍又一遍地编写以下代码: 必须嵌套两个using语句相当繁琐。有没有办法 告诉 SqlDataReader它拥有命令,并告诉命令它拥有连接? 如果有一种方法,那么我可以编写一个可以这样调用的辅助方法: 还是我必须忍耐一下,并通过SqlDataReader编写自己的包装器? 问题答案: 一件事就是编写一个为您处理的方法,并用每个结果调用一个委托。例如: 然后,Exe