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.