Esecuzione di Insert O Update (upsert) su sql server compact edition

c# entity-framework sql sql-server-ce upsert

Domanda

Ho un progetto c # che utilizza l'edizione compatta sqlserver e il framework di entità per l'accesso ai dati. Ho la necessità di inserire o aggiornare una grande quantità di righe, 5000+ o più per il db, quindi se la chiave esiste aggiorna il record se non lo inserisci. Non riesco a trovare un modo per farlo con l'edizione compatta e EF con prestazioni orribili, vale a dire prendendo 2 minuti più su un computer i7 di base. Ho provato a cercare il record per vedere se esiste, quindi inserendolo in caso contrario o aggiornandolo se lo fa, la ricerca è il killer su questo. Ho provato a compilare la query di ricerca e questo ha dato solo un piccolo miglioramento. Un'altra cosa che ho provato è inserire il record in un try catch e se fallisce l'aggiornamento, ma questo mi obbliga a salvare tutti i record per ottenere l'eccezione piuttosto che alla fine, che è un killer delle prestazioni. Ovviamente non posso usare stored procedure poiché è un'edizione compatta. Inoltre ho cercato di eseguire direttamente t-sql in qualche modo sul db, ma la mancanza di istruzioni di processo in compact sembra escluderlo. Ho cercato in tutto il mondo e fuori dalle idee. Volevo davvero usare il compatto se posso esprimere i benefici di implementazione e la capacità di impedire all'utente di scavare attorno al db. Qualsiasi suggerimento sarebbe apprezzato.

Grazie

Risposta accettata

Forse potresti ottenere il risultato che cerchi utilizzando semplici query. Diciamo che il tavolo che vuoi inserire o aggiornare è come questo

TABLE original
     id integer,
     value char(100)

per prima cosa puoi creare una tabella temporanea con i nuovi valori (puoi usare SELECT INTO o altri modi per crearla)

TABLE temp
    id integer,
    value char(100)

ora devi fare due cose, aggiornare le righe in originale e poi inserire i nuovi valori

UPDATE original 
SET original.value = temp.value
FROM original, temp
WHERE original.id = temp.id

INSERT INTO original 
SELECT * from temp 
WHERE temp.id not IN (select o.id from original o)

Risposta popolare

Quando usiamo SQL CE (e SQL 2005 Express per quella materia) chiamiamo sempre prima un aggiornamento e poi chiamiamo un insert se udate dà un conteggio delle righe pari a 0. Questo è molto semplice da implementare e non richiede il try expensice. . blocchi di controllo per il flusso di controllo.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché