Saltar al contenido

Violación de la restricción PRIMARY KEY. No se puede insertar duplicado key en objeto

Mantén la atención ya que en este tutorial encontrarás la contestación que buscas.Este artículo ha sido probado por nuestros expertos para garantizar la calidad y veracidad de nuestro post.

Solución:

Recibí el mismo error en una base de datos restaurada cuando intenté insertar un nuevo registro usando EntityFramework. Resultó que Identity/Seed estaba arruinando las cosas.

El uso de un comando de reinicio lo arregló.

DBCC CHECKIDENT ('[Prices]', RESEED, 4747030);GO

¿Cuál es el valor que está pasando a la principal key (presumiblemente “pk_OrderID”)? Puede configurarlo para que se incremente automáticamente, y luego nunca debería haber un problema con la duplicación del valor: la base de datos se encargará de eso. Si necesita especificar un valor usted mismo, deberá escribir un código para determinar cuál es el valor máximo para ese campo y luego incrementarlo.

Si tiene una columna llamada “ID” o similar que no se muestra en la consulta, está bien siempre que esté configurada para autoincrementarse, pero probablemente no lo sea, o no debería recibir ese mensaje de error. Además, sería mejor escribir una consulta más fácil de ver y usar parámetros. Como infirió el muchacho de nueve años, está dejando su base de datos abierta a los ataques de inyección de SQL si simplemente ingresa los valores ingresados ​​​​por el usuario. Por ejemplo, podría tener un método como este:

internal static int GetItemIDForUnitAndItemCode(string qry, string unit, string itemCode)

    int itemId;
    using (SqlConnection sqlConn = new SqlConnection(ReportRunnerConstsAndUtils.CPSConnStr))
    
        using (SqlCommand cmd = new SqlCommand(qry, sqlConn))
        
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add("@Unit", SqlDbType.VarChar, 25).Value = unit;
            cmd.Parameters.Add("@ItemCode", SqlDbType.VarChar, 25).Value = itemCode;
            sqlConn.Open();
            itemId = Convert.ToInt32(cmd.ExecuteScalar());
        
    
    return itemId;

…que se llama así:

int itemId = SQLDBHelper.GetItemIDForUnitAndItemCode(GetItemIDForUnitAndItemCodeQuery, _unit, itemCode);

No es necesario, pero guardo la consulta por separado:

public static readonly String GetItemIDForUnitAndItemCodeQuery = "SELECT PoisonToe FROM Platypi WHERE Unit = @Unit AND ItemCode = @ItemCode";

Puede verificar que no está a punto de insertar un valor ya existente por (pseudocódigo):

bool alreadyExists = IDAlreadyExists(query, value) > 0;

La consulta es algo así como “SELECCIONAR CONTEO DE LA TABLA DONDE BLA = @CANDIDATEIDVAL” y el valor es el ID que potencialmente está a punto de insertar:

if (alreadyExists) // keep inc'ing and checking until false, then use that id value

Justin quiere saber si esto funcionará:

string exists = "SELECT 1 from AC_Shipping_Addresses where pk_OrderID = " _Order.OrderNumber; if (exists > 0)...

Lo que parece que funcionaría para mí es:

string existsQuery = string.format("SELECT 1 from AC_Shipping_Addresses where pk_OrderID = 0", _Order.OrderNumber); 
// Or, better yet:
string existsQuery = "SELECT COUNT(*) from AC_Shipping_Addresses where pk_OrderID = @OrderNumber"; 
// Now run that query after applying a value to the OrderNumber query param (use code similar to that above); then, if the result is > 0, there is such a record.

Bastante seguro de que pk_OrderID es el PK de AC_Shipping_Addresses

Y está intentando insertar un duplicado a través de _Order.OrderNumber

hacer un

select * from AC_Shipping_Addresses where pk_OrderID = 165863;

o selecciona contar

….

Bastante seguro de que obtendrá una fila devuelta.

Lo que le dice es que ya está usando pk_OrderID = 165863 y no puede tener otra fila con ese valor.

insert into table (pk, value) 
select 11 as pk, 'val' as value 
where not exists (select 1 from table where pk = 11) 

si no quieres insertar si hay una fila

Reseñas y valoraciones

Si crees que ha sido de provecho nuestro post, te agradeceríamos que lo compartas con el resto programadores de esta forma contrubuyes a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *