【问题标题】:SqlDataReader to read into List<string>SqlDataReader 读入 List<string>
【发布时间】:2013-10-10 15:24:42
【问题描述】:

我正在用 C# 编写一个方法来从 WCF 服务查询 SQL Server Express 数据库。我必须使用 ADO.NET 来执行此操作(然后稍后使用 LINQ 重写它)。

该方法接受两个字符串 (fname, lname),然后从匹配记录中返回“健康保险 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;
}

【问题讨论】:

  • 好吧调试它。它是否进入while 块?它真的执行result.Add 行吗?也可以自己对数据库执行相同的操作:取 sqlquery 的值并手动在数据库上运行它。
  • 你确定你真的在取回数据吗?
  • @Arran,你是对的......它根本没有执行该行。我确实手动运行了查询以确保它是正确的,它返回正确的记录。抱歉,我已经插入断点并尝试调试了近 3 天......!
  • 现在知道了,我怀疑连接字符串可能是罪魁祸首。我会看看并报告。
  • @reallybadatmath:你有提到的错误。因此,使用Load 在循环中加载DataTable 是没有意义的,不使用sql 参数是危险的,使用SqldataReader.Read 和DataTable.Load 是不必要的,在需要列表时使用DataTable 是多余的.

标签: c# sql wcf ado.net sql-server-express


【解决方案1】:

您正在尝试通过DataTable.Load >循环加载DataTable。你只需要一次。您还在循环中使用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 注入。

【讨论】:

  • +1 因为我只需要一种快速简单的方法来执行此操作。但是 - 这并不影响这个答案 - 您需要注意转换错误或 DBNull 值。我只有 5 列要读取,因此重构为 result.Add(createNewMyObjectFromReader()) 并处理其中的每一列.... if (System.DBNull.value != reader["someColumn"])
【解决方案2】:

我会这样做:

 conn.Open();
 using (SqlDataReader reader = command.ExecuteReader())
 {
     dt.Load(reader);                  
 }

 foreach (var row in dt.AsEnumerable())
 {
     result.Add(row["Health Insurance NO"].ToString());
 }

【讨论】:

  • 您会循环加载表格吗? ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
相关资源
最近更新 更多