Одновременно вставлять несколько строк в базу данных - PullRequest
1 голос
/ 31 августа 2011

В каждом опросе есть несколько вопросов (10), и у каждого вопроса есть свой рейтинг.На данный момент я могу вставить оценку по каждому вопросу по одному.Я пытаюсь создать одну форму, чтобы я мог добавить оценку к каждому вопросу одновременно.

Проблема, с которой я сталкиваюсь, заключается в том, что форма вводит оценку только для первого вопроса и запускаетво второй экземпляр: 'throw new ApplicationException ("Ошибка данных.");'

Каждый вопрос должен содержать выбранный идентификатор опроса, чтобы определить, к какому опросу он принадлежит.* ===== Код позади =====

        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 ]

2 голосов
/ 19 сентября 2012

Если ваша база данных поддерживает, вы можете использовать

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 голосов
/ 31 августа 2011

Этот код возвращает некоторые старые воспоминания, к сожалению, не очень хорошие. В любом случае, я думаю, проблема в том, что вы добавляете параметры несколько раз в один и тот же объект команды. Ваш первый запуск работает, потому что у вас есть правильное количество параметров. При подготовке ко второму запуску вы добавляете их снова, но в cmd все еще есть старые параметры. Если вы удалите вызовы .Add после первого раза, это должно сработать.

Вы должны изучить более современные способы обработки доступа к данным. Проверьте LINQ-to-SQL как минимум.

Я также добавлю несколько указателей дизайна. Исходя из данных, которые вы сохраняете, вы, вероятно, захотите заключить вставки в одну транзакцию, что довольно просто. Вам также следует избегать закрытия и повторного открытия связи между операторами (что в любом случае будет невозможно в полезной транзакции). Вам нужно только открыть соединение при первом вызове и закрыть после последнего. Наконец, вы должны поместить последнее закрытие перед перенаправлением, потому что перенаправление (строка) прервет поток.

1 голос
/ 31 августа 2011

Существует множество способов достичь своей цели, в этой статье есть несколько примеров:

Несколько способов сделать несколько вставок

0 голосов
/ 07 сентября 2011

Я делаю некоторую работу, похожую на ваш вопрос, но я использовал хранимую процедуру в самой базе данных. Что я делаю, это настраиваю основной шаблон анкеты. Например, в каждом опросе 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

У меня также есть ссылка на внешний ключ между заголовком и подробностями. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...