同时将多行插入数据库

时间:2011-08-31 00:44:24

标签: c# asp.net sql ms-access

每项调查都有多个问题(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();
            }
        }
    }
}

4 个答案:

答案 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)

有很多方法可以实现你的目标,本文有几个例子:

Multiple Ways to do Multiple Inserts

答案 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

我还在标题和细节之间有外键链接。希望这可以提供帮助。