如何在从SqlDataReader读取变量时定义变量(返回所有行)

时间:2014-06-02 19:27:28

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

我有一个表格,其中有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。我该怎么做呢?

4 个答案:

答案 0 :(得分:6)

好吧,如果你想使用14个不同的名字,你可以为问题定义14个字符串变量,为答案定义14个字符串变量。但是,如果您有自己的名单和其他收集课程,这是坦率的嘲笑。

例如

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

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先生的答案所示。

答案 1 :(得分:4)

在这里给出一个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是第四个答案。

答案 2 :(得分:1)

您要在此处执行的操作是返回一组对象,其中每个对象都具有QuestionAnswer属性。

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

答案 3 :(得分:0)

你想用动态做一些这种性质的东西。我没有测试过代码,但从概念上讲这应该可行。

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