Domanda

Sto usando VS2008 C # Express e il database Northwind su un'applicazione Windows Form.

Ho usato il trascinamento per impostare l'associazione dei dettagli principali (ho usato gli ordini e i dettagli dell'ordine) per le due viste dati. A questo punto, tutto funziona come previsto. Per non restituire tutte le righe della tabella, voglio filtrare la tabella degli ordini in base a un filtro per la tabella degli ordini E anche su un campo nella tabella dei dettagli degli ordini. Nella configurazione guidata di TableAdapter, ho usato il generatore di query per aggiungere un nuovo FillByMyFilter che ha creato la seguente query:

SELEZIONA ordini. [ID ordine], Ordini. [ID cliente], Ordini. [ID dipendente], Ordini. [Nome nave], Ordini. [Indirizzo spedizione], Ordini. [Città nave], Ordini. [Nave Regione],                       Ordini. [Codice postale spedizione], Ordini. [Paese spedizione], Ordini. [Spedizione via], Ordini. [Data ordine], Ordini. [Data richiesta], Ordini. [Data spedizione],                       Orders.Freight DA ORDINI ISCRIVITI                       [Dettagli ordine] Ordini ON. [ID ordine] = [Dettagli ordine]. [ID ordine] DOVE (Ordini. [Nome nave] LIKE N'A% ') E ([Dettagli ordine] .Quantità & Lt; 20)

Ho ottenuto questo aggiungendo entrambe le tabelle ma non ho controllato nessuna delle caselle del campo nella tabella Dettagli ordine in modo che restituisse solo le colonne utilizzate nella query di riempimento originale. Sto solo cercando di filtrare il DataSet nella tabella principale a questo punto e non restituire un numero diverso di colonne. Le righe figlio dei Dettagli ordine dovrebbero comunque funzionare come il set di risultati non filtrato predefinito.

Ora il problema: quando faccio clic sul pulsante Esegui query funziona correttamente. Ricevo 53 righe dalla query sopra anziché dalla 1078 usando il Fill predefinito creato dal designer. Restituisce le stesse colonne della query di riempimento originale. Tuttavia, quando provo ad eseguire l'applicazione, visualizzo il seguente errore di vincolo:

" Impossibile abilitare i vincoli. Una o più righe contengono valori che violano vincoli non nulli, univoci o con chiave esterna. & Quot;

Cosa sto sbagliando?

AGGIORNAMENTO: Penso che sto ricevendo l'errore di vincolo a causa dell'INNER JOIN creato dalla procedura guidata. Se modifico la query per utilizzare LEFT JOIN, la procedura guidata la modifica in INNER JOIN.

La mia domanda è ancora come filtrare i record nella tabella Parent (ordini) in base ai criteri sia della tabella Parent che della tabella Child. Il mio prossimo test è provare a usare un proc memorizzato ma vorrei sapere usando solo il metodo FillBy personalizzato TableAdapter.

Saluti,

debug

È stato utile?

Soluzione 3

Grazie a tutti coloro che hanno pubblicato una risposta. Ecco come l'ho fatto usando la Procedura guidata TableAdapter e il set di dati digitato Northwind.

1) Fare clic con il tasto destro del mouse sulla tabella Parent nella finestra di progettazione xsd per aggiungere o configurare la query. 2) Fare clic sul & Quot; Avanti & Quot; pulsante nella procedura guidata fino a quando non vedi il " Query Builder " pulsante. Fare clic sul pulsante Generatore di query per accedere alla modalità Generatore di query. 3) Fare clic con il tasto destro del mouse e aggiungere la tabella figlio nel riquadro di progettazione. È necessario disporre di entrambe le tabelle e del vincolo predefinito che le collega. 4) Fare clic sulla colonna della tabella figlio che si desidera filtrare (questo segno di spunta verrà rimosso in seguito) per aggiungerlo al riquadro dei criteri in modo da poterlo filtrare. 5) Aggiungi il filtro per le colonne Parent e Child. In questo esempio, ho filtrato il nome della nave LIKE 'A%' e la quantità dell'ordine & Lt; 20.

Si noti che a questo punto è possibile testare la query facendo clic sul pulsante Esegui query. Utilizzando il Northwind DB per SQL 2008 compact edition ottengo 53 righe restituite. Se lo salvassi a questo punto, fallirebbe in fase di esecuzione a causa delle chiavi primarie duplicate nel set di risultati. Quindi i prossimi passi li elimineremo.

6) Nel riquadro dei criteri, deseleziona la colonna della tabella figlio che hai aggiunto in precedenza. Il filtro rimarrà e la stessa colonna verrà ora deselezionata anche nel riquadro di progettazione. Se esegui la query avrai comunque 53 righe ma senza la colonna della tabella figlio. 7) Fare clic con il pulsante destro del mouse sul riquadro di progettazione e aggiungere la quot &; Raggruppa per & Quot ;. A questo punto, quando si esegue questa query, non si dovrebbero avere duplicati nell'ID ordine. Ho restituito esattamente 29 righe. 8) Fare clic su OK, quindi & Quot; Avanti & Quot; fino a quando non si salva la nuova query FillBy. 9) Cambia il tuo codice sorgente per usare il tuo nuovo FillBy.

Quando ho eseguito l'applicazione, ho ottenuto la tabella padre filtrata con le stesse 29 righe restituite dal pulsante Esegui query. La tabella figlio ha funzionato come previsto e conteneva almeno una riga figlio che conteneva una quantità di & Lt; 20.

Per un'applicazione del mondo reale, penso che sarebbe meglio usare un proc memorizzato o LINQ. Ma questo problema mi ha fatto grattare la testa e quindi l'ho & Quot; l'ho adattato & Quot; solo perché è stata una sfida (almeno per me).

Altri suggerimenti

Questo articolo contiene alcuni suggerimenti per la risoluzione dei problemi per individuare la riga esatta che causa il problema:

DataSet hell - " Impossibile abilitare i vincoli. Una o più righe contengono valori .... & Quot;

Se guardi in Orders.Designer.cs (indovinando, mentre sto lavorando in VB), vedrai probabilmente un vincolo univoco definito su Ordini (per la chiave primaria).

Sospetto che il problema sia che, quando esegui la tua richiesta, ricevi uno o più singoli ordini che hanno > 1 OrderDetails.Quanity & Gt; 20 .... quindi, quell'ordine verrà restituito due volte nel set di risultati, violando la chiave primaria.

Prova: SELEZIONA * dagli ordini in cui [Nome nave] MI PIACE '% qualunque sia% AND OrderID in (seleziona OrderID da OrderDetails dove Quantità & Lt; 20)

Questo è probabilmente un modo molto inefficiente per farlo, in oracolo useresti EXISTS () invece di IN () ma non conosco l'equivalente del server sql.

Spero che tu abbia ottenuto una risposta, ma in caso contrario, pensaci.

Nel set di dati se le tabelle dati Order e OrderDetail hanno una relazione tra loro, funziona in qualche modo come un vincolo FK. Pertanto, nella tabella figlio (OrderDetail) non possono essere presenti record che non hanno un record parent (Order) con risposta cooresistente. Quindi ciò che può accadere è quando si aggiorna la Tabella dati ordine, con la query menzionata sopra, ci sono ancora righe figlio nella tabella OrderDetail che avranno aggiornamenti ai record Parent (Ordine) che non saranno più presenti dopo l'aggiornamento. Ciò detto, se si aggiorna la tabella dati ordine è necessario aggiornare anche la tabella dati OrderDetail o rimuovere la relazione tra le due tabelle dati.

Spero che questo aiuti ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top