我正在开展一个项目,要求我创建一个评估门户(调查),用户登录并回答20个问题及其所有评分问题(非常不同意,不同意,同意和非常同意)。
我在每个页面都使用ASP.net和C#以及单选按钮列表。
我能够使用会话创建登录页面。
我想在单独的页面中显示每个问题但是当我这样做时,我开始遇到将调查回复保存到数据库的问题。每个问题的结果都显示在数据库的单独行中。更具体地说,每个用户在数据库中都有20行数据。
我的问题是如何让每个用户在数据库的同一行或行中做出响应?
非常感谢任何帮助。
由于
以下是我的登录页面:
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Student;Integrated Security=True");
con.Open();
SqlCommand cmd = new SqlCommand("select s.First_Name, s.Last_Name,c.Class_Title, c.Course_ID, c.Instructor_Last, c.Instructor_First, c.Term, c.Section_ID, c.Course_Number,e.Instructor_ID from Student S Join Student_Course e ON (s.Student_ID = e.Student_ID) Join Course c ON(c.Course_ID = e.Course_ID) where UserName =@username and Password=@password",con);
cmd.Parameters.AddWithValue("@username", txtUserName.Text);
cmd.Parameters.AddWithValue("@password", txtPassword.Text);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
Session["USER_ID"] = dt;
Response.Redirect("Successful_Login.aspx");
}
这是我成功登录的页面 此页面根据他们的登录信息获取用户信息,我使用gridview根据他们的登录信息向学生展示课程,然后他们可以点击他们想要评分的课程并开始调查。
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt = (DataTable)Session["USER_ID"];
lblName.Text = dt.Rows[0][0].ToString() + " " + dt.Rows[0][1].ToString();//your cloumn name;
DataTable dt2 = (DataTable)Session["USER_ID"];
GridView1.DataSource = dt2;
GridView1.DataBind();
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
string instructorName = GridView1.SelectedRow.Cells[4].Text + ", " + GridView1.SelectedRow.Cells[5].Text;
string courseSession= GridView1.SelectedRow.Cells[7].Text + "-" + GridView1.SelectedRow.Cells[8].Text;
string term = GridView1.SelectedRow.Cells[6].Text;
Session["USER_ID"] = instructorName;
Session["USER_ID2"] = courseSession;
Session["USER_ID3"] = term;
Response.Redirect("Q1.aspx");
}
这是第一个问题(Q1) 当用户单击下一个按钮转到下一个问题时,我希望所有响应都转到数据库并进入下一页(Q2),我想在同一行中捕获所有结果。
protected void btnNext_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=Student;Integrated Security=True");
SqlCommand cmd = new SqlCommand("insert into Survey (Q1,Q1_Comments) values (@Q1,@Q1_Comments)", con);
cmd.Parameters.AddWithValue("Q1", radListQ1.SelectedValue);
cmd.Parameters.AddWithValue("Q1_Comments", txtQ1Comments.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
答案 0 :(得分:1)
对于starter,如果要在同一行中显示来自同一用户的所有20个响应,则应构建一个在数据库中包含更多列的表。 e.g。
Survey
-----------------------------------------------------
studentID | Q1 | Q1_comments | Q2 | Q2_comments | ...
对于第一个问题Q1,您仍然可以使用上面的原始insert
声明:
SqlCommand cmd = new SqlCommand("insert into Survey (Q1,Q1_Comments) values (@Q1,@Q1_Comments)", con);
cmd.Parameters.AddWithValue("Q1", radListQ1.SelectedValue);
cmd.Parameters.AddWithValue("Q1_Comments", txtQ1Comments.Text);
对于第二个问题及以后,您需要执行update
而不是插入数据库。 e.g。
SqlCommand cmd = new SqlCommand("UPDATE Survey SET (Q2=@Q2,Q2_comment=@Q2_Comments)", con);
cmd.Parameters.AddWithValue("Q2", radListQ2.SelectedValue);
cmd.Parameters.AddWithValue("Q2_Comments", txtQ2Comments.Text);
作为一点建议,您可能希望transaction
使用insert
,update
或delete
,并使用try ... catch ...
检测来围绕它们/处理潜在的错误。更多来自MSDN
希望这有帮助。
答案 1 :(得分:1)
我强烈建议您存储20行...但如果您坚持只使用一行..我建议使用UPDATE命令而不是INSERT ...
答案 2 :(得分:0)
只是提供完整的代码。这是Q1
<div id="store_header">
<div class="store_header_logo">
<a href="http://www.amazon.co.uk">
<img class="store_header_img" src="/images/tiles/amazon.png" title="Amazon"></img>
</a>
</div>
<div class="store_header_text">
Amazon Coupons & Deals
</div>
</div>
这是Q2
protected void btnNext_Click(object sender, EventArgs e)
{
if (Session["USER_ID"] != null )
{
SqlConnection con = new SqlConnection(@"Data Source=.;Initial Catalog=Student;Integrated Security=True");
SqlCommand cmd = new SqlCommand("insert into Survey (Q1,Q1_Comments) values (@Q1,@Q1_Comments)", con);
cmd.Parameters.AddWithValue("Q1", radListQ1.SelectedValue);
cmd.Parameters.AddWithValue("Q1_Comments", txtQ1Comments.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}