我正在尝试使用表单和数据库在c#中创建测验。我目前正在努力将输入的文本与数据库中的正确答案进行比较。 例如:如果我在答案的文本框中输入“ A”,而数据库中存储的正确答案是“ A”,则会在分数上加一个。
我为此使用的代码(无效)如下:
SqlConnection con = new SqlConnection(conn);
SqlCommand cmd = new SqlCommand("select Answer from Questions where QuestionID=3", con);
cmd.Parameters.AddWithValue("@Answer", InputAnswerTxt.Text);
con.Open();
SqlDataAdapter adpt = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adpt.Fill(ds);
using (SqlDataReader re = cmd.ExecuteReader())
{
if (re.Read())
{
string AnswerSelection = (string)re["Answer"];
SetScore = SetScore++;
}
MessageBox.Show("Your score is : " + SetScore);
}
con.Close();
任何建议都是有帮助的!如果您需要更多了解代码的嵌入位置,请告诉我。
答案 0 :(得分:0)
如果您可以提供数据库架构,则可能会有所帮助。由于您的答案在内存中(而不在DB中),因此您可能不需要将其作为参数附加到SQL命令。您应该能够将所需问题的答案(看起来像问题ID = 3)下拉出来,然后将InputAnswerTxt.Text与数据库返回的内容进行比较。如果它们彼此相等,那么就加分。
我需要发布更多代码(例如其中定义了一些变量的IE和DB模式等),以提供进一步的建议。
答案 1 :(得分:0)
我假设您的测验问题的数量最多为100而不是1000000 + s。因此,与其在每次收到答案时都去数据库,不如从一开始就抓住所有问题ID及其正确答案,并将其存储在dictionary
中。然后检查字典的正确性并更新分数。
下面是一个粗略的准则,它不是一个完全有效的代码,但是应该可以给您一个足够好的主意,希望您可以在注释中提出。
因此,在您的constructor
中,您可以打电话检索所有答案。如下所示:
private Dictionary<string, string> _correctAnswerLookup;
public Form1()
{
InitializeComponent();
_correctAnswerLookup = GetCorrectAnswerByQuestionLookup();
}
private Dictionary<string, string> GetCorrectAnswerByQuestionLookup()
{
Dictionary<string, string> correctAnswerLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("select QuestionId, Answer from Questions", connection);
try
{
connection.Open();
var reader = cmd.ExecuteReader();
while (reader.Read())
{
string questionId = (string)reader["QuestionId"];
string answer = (string)reader["Answer"];
if (!correctAnswerLookup.ContainsKey(questionId))
{
correctAnswerLookup.Add(questionId, answer);
}
}
}
catch (Exception e)
{
// your exception handling
}
}
return correctAnswerLookup;
}
在收到答案的事件上,您只需检查查询并更新分数即可。自己处理有关验证和null检查等的细微问题。
private void OnAnswerSubmitted()
{
string currentQuestionId = ""; // however you get this in your UI.
string selectedAnswer = "";
if (_correctAnswerLookup[currentQuestionId] == selectedAnswer)
{
scoreCounter++;
}
lblScoreCounter.Text = scoreCounter.ToString();
}