candijen Ответов: 2

Как исправить эту проблему.


Я хочу, чтобы выбранные значения из списка чекбоксов под названием CheckBoxList1 были сохранены в базе данных вместе с остальными упомянутыми данными, но только первый отмеченный элемент будет сохранен в базе данных. Пожалуйста помочь.

protected void Button3_Click1(object sender, EventArgs e)
   {
       using (Stream fs = FileUpload1.PostedFile.InputStream)
       {
           using (BinaryReader br = new BinaryReader(fs))
           {

               byte[] bytes = br.ReadBytes((Int32)fs.Length);
               String strConnString = ConfigurationManager.ConnectionStrings["facultylogConnectionString"].ConnectionString;
               String strQuery = "Insert into Form (Name, Test_Number, Course_Name, Program, Exam_Month, Exam_Year, Course_Code, Semester, Paper, CLOs) VALUES(@Name, @Test_Number, @Course_Name, @Program, @Exam_Month, @Exam_Year, @Course_Code, @Semester, @Paper, @CLOs)";
               SqlConnection con = new SqlConnection(strConnString);
               SqlCommand cmd = new SqlCommand();
               cmd.CommandType = CommandType.Text;
               cmd.CommandText = strQuery;
               cmd.Connection = con;
               cmd.Parameters.AddWithValue("@Name", TextBox1.Text);
               cmd.Parameters.AddWithValue("@Test_Number", DropDownList3.SelectedValue);
               cmd.Parameters.AddWithValue("@Course_Name", DropDownList5.SelectedValue);
               cmd.Parameters.AddWithValue("@Program", DropDownList4.SelectedValue);
               cmd.Parameters.AddWithValue("@Exam_Month", TextBox5.Text);
               cmd.Parameters.AddWithValue("@Exam_Year", TextBox6.Text);
               cmd.Parameters.AddWithValue("@Course_Code", TextBox8.Text);
               cmd.Parameters.AddWithValue("@Semester", DropDownList2.SelectedValue);
               cmd.Parameters.AddWithValue("@Paper", bytes);


               for (int i = 0; i < CheckBoxList1.Items.Count - 1; i++)
               {
                   if (CheckBoxList1.Items[i].Selected)
                   {
                       string var = string.Empty;
                       var += CheckBoxList1.Items[i].Text.ToString() + ",";
                       cmd.Parameters.AddWithValue("@CLOs", var);

                   }

               }

               con.Open();
               cmd.ExecuteNonQuery();
               con.Close();

           } Label15.Visible = true;

       }
   }


Что я уже пробовал:

Попробовал приведенный выше код, но только первое выбранное значение сохраняется в базе данных.

2 Ответов

Рейтинг:
2

OriginalGriff

Хотя решение Гарта будет работать, это плохая конструкция БД для хранения значений, разделенных запятыми, в одном столбце базы данных.

Он дублирует информацию, тратит пространство для хранения, способствует ошибкам и делает данные очень трудными для дальнейшей работы.

Например, если курс "Basic" нужно будет переименовать в "Visual Basic" позже, вам нужно будет изменить его в каждой строке и быть чрезвычайно осторожным, чтобы не повлиять на "Basic Maths", когда вы это сделаете.
Хуже того, когда вам нужно изменить курс для человека - он переключается с "Visual Basic" на "C#", например, - это ужасно сложно сделать в SQL, потому что это обработка строк в лучшем случае маргинальна.
Вместо этого вы должны установить два стола:
Курсы

ID    INT, IDENTITY
Name  NVARCHAR

И
CoursesTaken
ID        INT, IDENTITY
UserID    INT, Form.ID
CourseID  INT, foreign key to Courses.ID

Затем SQL может делать то, что он делает лучше всего - обрабатывать отношения между данными, - и вы используете JOIN, когда хотите получить данные.
Это облегчает всю обработку и лишь немного усложняет первоначальную операцию вставки.


Рейтинг:
1

Garth J Lancaster

Подумайте о том, что такое 'string var = string.Пусто;' и cmd.Parameters.AddWithValue... делает внутри вашего цикла ... может быть ты имел в виду

string var = string.Empty;
for (int i = 0; i < CheckBoxList1.Items.Count - 1; i++)
{
  if (CheckBoxList1.Items[i].Selected)
  {
    var += CheckBoxList1.Items[i].Text.ToString() + ",";
  }
}
cmd.Parameters.AddWithValue("@CLOs", var);


candijen

Привет, по-прежнему только первый выбор появляется в базе данных вместе с " , " и больше ничего.