2015-10-29 2 views
-1

Что я должен добавить в этот код? Я должен избегать добавления повторяющихся записей в свой код. Заранее спасибоКак предотвратить дублирование записи?

protected void btnAdd_Click(object sender, EventArgs e) 
{ 
    con.Open(); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = con; 
    cmd.CommandText = "INSERT INTO Categories VALUES(@Category)"; 
    cmd.Parameters.AddWithValue("@Category", txtName.Text); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 
    Response.Redirect("/Admin/Categories/Add.aspx"); 
+1

Добавьте уникальное ограничение в столбец и проглотите исключение или добавьте логику 'if not exits' в ваш SQL-код вставки. Зависит от используемой БД - добавьте тег, чтобы идентифицировать его. –

ответ

0

Вы можете использовать ExecuteScalar(), чтобы вернуть значение из 1-й строки и 1-го столбца любого запроса. Сделайте выберите количество и проверить, если он возвращает 1.

using (SqlCommand sqlCommand = new SqlCommand("SELECT COUNT(*) from Categories where Category = @1", con)) 
{ 
    con.Open(); 
    sqlCommand.Parameters.AddWithValue("@1", txtName.Text); 
    int userCount = (int) sqlCommand.ExecuteScalar(); 
    if(userCount == 1) 
    { 
     //already exists 
    } 
    else 
    { 
     //proceed 
    } 
} 

Кроме того, при проектировании базы данных лучше, чтобы сделать его первичным ключом.

Как было предложено @Alex, используйте ниже запрос вместо того, что у вас есть,

cmd.CommandText = "IF NOT EXISTS(SELECT * FROM Categories WHERE [email protected]) INSERT INTO Categories VALUES(@1)"; 
+1

Обратите внимание, что кто-то может вставить значение между двумя вашими запросами. Я бы использовал ограничение UNIQUE для обеспечения целостности данных. – ken2k

+0

Спасибо. Я думал, что сделать его основным ключом позаботится об этом. – Partha

+0

count (*) довольно токсичен, чтобы проверять значение, так как требуется две поездки в db и игнорирование атомарности. –

0

Решение один: добавить ограничение на поле (столбец) Категория - или что-то ваше поле называется в базе данных и поймать исключение, когда оно уже существует в вашей базе данных.

Решение второе: проверьте внутри вашего запроса, существует ли значение.

Оба решения могут бросить исключение или один может использовать возвращаемое значение SqlCommand.ExecuteNonQuery(), который является количество затронутых строк, также:

protected void btnAdd_Click(object sender, EventArgs e) 
{ 
    con.Open(); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = con; 
    cmd.CommandText = "IF NOT EXISTS(SELECT Category FROM Categories WHERE [email protected]) INSERT INTO Categories VALUES(@Category)"; 
    cmd.Parameters.AddWithValue("@Category", txtName.Text); 
    int affectedRows = cmd.ExecuteNonQuery(); 
    con.Close(); 

    if (affectedRows == 1) //1 record was updated, thus we can conclude that the record was successfully inserted 
    { 
    Response.Redirect("/Admin/Categories/Add.aspx"); 
    //Perform other logic ... 
    } 

Помните, когда вы размещаете ограничение на поле Category, он будет бросить исключение до if (affectedRows == 1).

Смежные вопросы