2013-11-09 3 views
0

как я буду препятствовать «уроку Title» от дублирования в базе данных при вводе данных дубликатов данных?C# как предотвратить дублирование данных в базе данных?

SqlConnection cnn = new SqlConnection(); 
    SqlCommand cmd = new SqlCommand(); 
    SqlDataAdapter da = new SqlDataAdapter(); 
    SqlCommandBuilder cb = new SqlCommandBuilder(da); 
    DataSet ds = new DataSet(); 
    cnn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Project1ConnectionString"].ConnectionString; 
    cnn.Open(); 

    cmd.CommandText = "select * from Lesson"; 
    cmd.Connection = cnn; 

    da.SelectCommand = cmd; 

    da.Fill(ds, "Lesson"); 


    DataRow drow = ds.Tables["Lesson"].NewRow(); 

    drow["TopicID"] = DropDownList1.Text; 
    drow["LessonTitle"] = TextBox1.Text; 
    drow["LessonDate"] = DateTime.Now; 
    ds.Tables["Lesson"].Rows.Add(drow); 
    da.Update(ds, "Lesson"); 
+1

При первом выборе и проверке, если строка уже существует, если нет, то вставить, если она существует не делать ничего. – Max

+3

Вы также можете предотвратить дублирование, используя уникальное ограничение на столбец таблицы, непосредственно в базе данных. Вот как это делается: http://technet.microsoft.com/en-us/library/ms190024.aspx –

+0

Можете ли вы привести пример? Я новичок в этом, спасибо человеку. – Nian

ответ

0

Вы можете создать функцию, чтобы проверить дубликат LessonTitle.

Объяснение: здесь я создал функцию под названием checkDuplicateTitle().

Эта функция принимает AllRows of LessonTable как DataRowCollection и LessonTitle для проверки в качестве входных данных.

он проверит LessonTitle каждой строки. , если данный LessonTitle соответствует существующим титрам из таблицы, тогда эта функция возвращает true else возвращает false.

Если возвращаемое значение истинно, мы проигнорируем обновление таблицы новой строкой, поскольку LessonTitle уже существует. В противном случае мы добавим его.

код, как показано ниже:

void UpdateLessonTable() 
{ 
    SqlConnection cnn = new SqlConnection(); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataAdapter da = new SqlDataAdapter(); 
     SqlCommandBuilder cb = new SqlCommandBuilder(da); 
     DataSet ds = new DataSet(); 
     cnn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Project1ConnectionString"].ConnectionString; 
     cnn.Open(); 

     cmd.CommandText = "select * from Lesson"; 
     cmd.Connection = cnn; 

     da.SelectCommand = cmd; 

     da.Fill(ds, "Lesson"); 

    if (!checkDuplicateTitle(ds.Tables["Lesson"].Rows, textBox1.Text.ToString())) 
     { 
     DataRow drow = ds.Tables["Lesson"].NewRow(); 

     drow["TopicID"] = DropDownList1.Text; 
     drow["LessonTitle"] = TextBox1.Text; 
     drow["LessonDate"] = DateTime.Now; 
     ds.Tables["Lesson"].Rows.Add(drow); 
     da.Update(ds, "Lesson"); 
     } 
     else 
     { 
     //you can display some warning here 
     // MessageBox.Show("Duplicate Lesson Title!"); 
     } 
} 

//function for checking duplicate LessonTitle 

bool checkDuplicateTitle(DataRowCollection rowTitle,String newTitle) 
     { 
      foreach (DataRow row in rowTitle) 
      { 
       if(row["LessonTitle"].Equals(newTitle)) 
       return true; 
      } 
      return false; 
     } 
+0

И как вы думаете, производительность этого будет в будущем, когда он должен получить всю таблицу из базы данных? Простое 'SELECT COUNT() WHERE LessonTitle = 'MyNewTitle' 'было бы достаточно, чтобы знать, есть ли запись с этим заголовком уже без загрузки всех клиентов. –

+0

@ Karl-JohanSjögren: Спасибо за ваш вопрос. да, хорошо писать таким образом, но я не хочу писать еще один запрос для проверки дубликатов, поэтому я взял существующий источник данных. И, кроме того, это просто идея для OP, как его реализовать. –

+0

Огромное вам спасибо, я многому научился этому. – Nian

4

Эта уникальность должна быть обеспечена базой данных. Добавить ограничение уникальности в таблицу:

CREATE UNIQUE INDEX UK_Lesson_Title ON Lesson (Title) 
Смежные вопросы