【问题标题】:How to define variables while reading them from a SqlDataReader (returning all rows)如何在从 SqlDataReader 读取变量时定义变量(返回所有行)
【发布时间】:2014-06-02 19:27:28
【问题描述】:

我有一个包含 14 行的表,我想返回它并将每个单元格声明为变量。这是我尝试过的:

using (SqlConnection conn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["2012SSMS"].ConnectionString))
        {
            SqlCommand cmd1 = new SqlCommand(@"SELECT [Question], [Answer] 
            from [MyTable]", conn1);
            conn1.Open();
            using (SqlDataReader reader1 = cmd1.ExecuteReader())
            {
                while (reader1.HasRows)
                {
                    reader1.GetName(0);
                    reader1.GetName(1);

                    while(reader1.Read())
                    {
                        string Question(1) = reader1.GetString(0); //errors here
                        string Answer(1) = reader1.GetString(1); //and here
                    }
                    reader1.NextResult();
                }
            }
}

我希望将声明的变量返回为 Question1 - Question14Answer1 - Answer14。我该怎么做?

【问题讨论】:

  • 您正好有 14 个问题,每个问题的答案都在同一行?有没有可能有更多或更少的问题?
  • @Steve 在这个测试中没有
  • //我希望将声明的变量返回为 Question1 - Question14 和 Answer1 - Answer14。 // 这不是一个明智的愿望。太善变了。

标签: c# sql-server c#-4.0 sqldatareader


【解决方案1】:

好吧,如果您想使用 14 个不同的名称,您可以为问题定义 14 个字符串变量,为答案定义 14 个字符串变量。但坦率地说,当您拥有 Lists 和其他集合类时,这很可笑。

例如

为您的问题/答案定义一个类

public class QuestionAnswer
{
     public string Question {get;set;}
     public string Answer {get;set;}
}

然后修改您的代码以创建List<QuestionAnswer>

List<QuestionAnswer> listOfQuestionsAndAnswers = new List<QuestionAnswer>();
using (SqlConnection conn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["2012SSMS"].ConnectionString))
{
    SqlCommand cmd1 = new SqlCommand(@"SELECT [Question], [Answer] 
                                       from [MyTable]", conn1);
    conn1.Open();
    using (SqlDataReader reader1 = cmd1.ExecuteReader())
    {
           while(reader1.Read())
           {
               QuestionAnswer qa = new QuestionAnswer();
               qa.Question = reader1.GetString(0); 
               qa.Answer = reader1.GetString(1); 
               listOfQuestionsAndAnswers.Add(qa);
           }
    }
}

现在您可以使用以下语法在列表中使用任何问题

string aQuestion = listOfQuestionsAndAnswers[0].Question;
string anAnswer = listOfQuestionsAndAnswers[0].Answer;

最后,我真的建议您花点时间学习如何使用Dapper,如 Gravell 先生的回答所示。

【讨论】:

  • 我很高兴别人也想不出比QuestionAnswer更好的名字——命名很难!
  • 好吧,我什至没有尝试过,对我来说唯一更困难的是找到合适的按钮图标。
【解决方案2】:

我有在这里给出dapper 的答案...显示您正在编写多少不必要的代码

public class QuestionAnswer {
    public string Question {get;set;}
    public string Answer {get;set;}
}
...
var pairs = conn1.Query<QuestionAnswer>("select Question, Answer from MyTable")
       .ToList();

现在:pairs[0].Question 是第一个问题,pairs[3].Answer 是第四个答案。

【讨论】:

    【解决方案3】:

    您在这里要做的是返回一个对象集合,其中每个对象都有一个QuestionAnswer 属性。

    在循环的每次迭代中,您都可以创建一个您定义的自定义类型的新实例以保存这两个值,然后您可以将其添加到您选择的数据结构中。

    【讨论】:

      【解决方案4】:

      您想使用动态来做一些这种性质的事情。我还没有测试过代码,但从概念上讲这应该可以工作。

      public class DynamicDataRecord : DynamicObject 
      {
          private IDataRecord _dataRecordFromReader;
      
          public DynamicDataRecord(IDataRecord dataRecordFromReader) 
          { 
              _dataRecordFromReader = dataRecordFromReader; 
          }
      
          public override bool TryGetMember(GetMemberBinder binder, out dynamic result) 
          {
              result = _dataRecordFromReader[binder.Name];
              return result != null;
          }
      }
      

      然后在您遍历阅读器的地方,您可以执行以下操作

      List<DynamicDataRecord> records = new List<DynamicDataRecord>();
      using (SqlDataReader reader1 = cmd1.ExecuteReader()) 
      {
          foreach(var record in reader)
          {
              records.Add( new DynamicDataRecord(record));
          }
      }
      

      然后你应该能够做这样的事情。

      records[0].Question
      
      record[0].Answer
      

      【讨论】:

      • 行数据从哪里进入DynamicDataRecord
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      相关资源
      最近更新 更多