每项调查都有多个问题(10),每个问题都有自己的评分。目前我只能为每个问题插入一个评级。我正在尝试创建一个表单,以便我可以同时为每个问题添加评级。
我遇到的问题是表单只输入第一个问题的评级,并在第二个实例处遇到错误:'throw new ApplicationException(“Data error。”);'
每个问题都需要保留所选的调查ID,以确定它属于哪个调查。
===== Code Behind =====
protected void AddRatingBTN_Click(object sender, EventArgs e)
{
if (DropDownListSurvey.SelectedValue == "Select")
{
//Label1.Text = "hi";
return;
}
string connectionString = WebConfigurationManager.ConnectionStrings["DBConnectionString1"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("InsertRating", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@Rating_ID", SqlDbType.Int, 7));
cmd.Parameters["@Rating_ID"].Direction = ParameterDirection.Output;
cmd.Parameters.Add(new SqlParameter("@Question_ID", SqlDbType.Int));
cmd.Parameters["@Question_ID"].Value = 1000;
cmd.Parameters.Add(new SqlParameter("@Survey_ID", SqlDbType.Int));
cmd.Parameters["@Survey_ID"].Value = Convert.ToInt32(DropDownListSurvey.SelectedValue.ToString());
cmd.Parameters.Add(new SqlParameter("@Score", SqlDbType.Char, 5));
cmd.Parameters["@Score"].Value = Question_1.Text;
try
{
con.Open();
cmd.ExecuteNonQuery();
// txtRating_ID.Text = Convert.ToString(cmd.Parameters["@Rating_ID"].Value);
}
catch (SqlException err)
{
// Replace the error with something less specific.
// You could also log the error now.
throw new ApplicationException("Data error.");
}
finally
{
con.Close();
}
cmd.Parameters.Add(new SqlParameter("@Rating_ID", SqlDbType.Int, 7));
cmd.Parameters["@Rating_ID"].Direction = ParameterDirection.Output;
cmd.Parameters.Add(new SqlParameter("@Question_ID", SqlDbType.Int));
cmd.Parameters["@Question_ID"].Value = 1001;
cmd.Parameters.Add(new SqlParameter("@Score", SqlDbType.Char, 5));
cmd.Parameters["@Score"].Value = Question_2.Text;
try
{
con.Open();
cmd.ExecuteNonQuery();
// txtRating_ID.Text = Convert.ToString(cmd.Parameters["@Rating_ID"].Value);
}
catch (SqlException err)
{
// Replace the error with something less specific.
// You could also log the error now.
throw new ApplicationException("Data error.");
}
finally
{
con.Close();
}
cmd.Parameters.Add(new SqlParameter("@Rating_ID", SqlDbType.Int, 7));
cmd.Parameters["@Rating_ID"].Direction = ParameterDirection.Output;
cmd.Parameters.Add(new SqlParameter("@Question_ID", SqlDbType.Int));
cmd.Parameters["@Question_ID"].Value = 1002;
cmd.Parameters.Add(new SqlParameter("@Score", SqlDbType.Char, 5));
cmd.Parameters["@Score"].Value = Question_3.Text;
try
{
con.Open();
cmd.ExecuteNonQuery();
// txtRating_ID.Text = Convert.ToString(cmd.Parameters["@Rating_ID"].Value);
}
catch (SqlException err)
{
// Replace the error with something less specific.
// You could also log the error now.
throw new ApplicationException("Data error.");
}
finally
{
Response.Redirect(Request.RawUrl);
con.Close();
}
}
}
}
答案 0 :(得分:2)
这段代码带回了一些旧的记忆,遗憾的是并不是很好的记忆。无论如何,我认为问题在于你将参数多次添加到同一个命令对象中。您的第一次执行是有效的,因为您具有正确数量的参数。在第二次运行的准备中,您将再次添加它们,但cmd仍然具有旧参数。如果您在首次使用后删除.Add调用。
您应该研究更现代的数据访问处理方式。至少查看LINQ-to-SQL。
我还会添加一些设计指针。根据您要保存的数据,您可能希望将插入包装在单个事务中,这非常简单。您还应该避免关闭并重新打开语句之间的连接(无论如何,这在有用的事务中是不可能的)。您只需要在第一次调用时打开连接,在最后一次调用后关闭。最后,您应该在Redirect之前放置最后一个关闭,因为Redirect(string)将中止该线程。
答案 1 :(得分:2)
如果您的数据库支持,您可以使用
INSERT INTO tablename(field1,field2) VALUES(
SELECT value1, value2
UNION ALL
SELECT value1, value2
...
)
您可以考虑以下想法:
DbTransaction trans = null;
trans = Con.BeginTransaction();
cmd.Transaction = trans;
... // execute your individual insert statements
cmd.ExecuteNonQuery();
trans.Commit();
出现错误
trans.RollBack();
答案 2 :(得分:1)
有很多方法可以实现你的目标,本文有几个例子:
答案 3 :(得分:0)
我做了一些类似于你的问题的工作,但我在数据库本身使用了存储过程。我所做的是设置问卷主模板。例如,每个调查有20个问题,用户必须从每个问题的1到4中选择一个评级。所以我有两张桌子。
<强>表格强>
Header (SurveyID, ...)
Detail (SurveyID, LineID, AnswerID, ...)
然后我创建了一个存储过程。调用此过程时,它将使用
将数据从模板复制到事务表CREATE PROC ....
AS
BEGIN TRAN
INSERT INTO DETAIL
(...)
SELECT ... FROM Master_Detail
INSERT INTO HEADER
(...)
SELECT ... FROM Master_Header
COMMIT TRAN
我还在标题和细节之间有外键链接。希望这可以提供帮助。