我有一个表格,其中有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
- Question14
和Answer1
- Answer14
。我该怎么做呢?
答案 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)
您要在此处执行的操作是返回一组对象,其中每个对象都具有Question
和Answer
属性。
在循环的每次迭代中,您可以创建一个自定义类型的新实例,该实例已定义为保留这两个值,然后您可以将其添加到您选择的数据结构中。
答案 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