FillSchema com'è e come funziona?

mercoledì 04 marzo 2009 - 16.35

ysdemarc Profilo | Expert

Non so se scrivo nella sezione adatta..ma non ho compreso nel forum dove dovrei scrivere..

vengo al dunque io ho una query sql molto complessa e composta da altre sotto-queries..

supponendo che da sia il mio DbDataAdapter , dopo aver passato la string sql e fatto tutto sempre come al solito..

prima di leggere il mio DataTable faccio quest due righe:

da.FillSchema(ds,SchemaType.Source);
da.Fill (ds);

e nel da.Fill(ds) ottengo l'errore: "System.Data.CostraintException: Impossibile attivare i vincoli. Una o più righe contengono valori che violano non-null, unique o foreign-key".

se tolgo da.FillSchema(ds,SchemaType.Source); non ho problemi...

Non capisco però il perché dell'errore. Io non ho specificato alcun vincolo, e poi con SchemaType.Source non dovrebbe ignorare qualsiasi schema?

In pratica quello che mi fa questo lavoro passando la stringa sql è una classe usata anche da altri parti..vorrei evitare di di togliere la FillSchema poichè non so che danni andrei a causare..però magari vorrei capire come fare a capire quando non va utilizzata.

FillSchema com'è e come funziona? come risolvere?

ciao
Vincenzo
Programmatore sbilenco

Jeremy Profilo | Guru

Ciao Vincenzo.
Se non ho capito male.....con FillSchema imposti la struttura del DataTable esattamente come è la struttura della tabella nel Db a prescindere di quali campi includi o meno nella query.
A questo punto, l'errore che ricevi, avrebbe senso solo se nella query ometti alcuni dei campi presenti nella tabella del DB.

Facci sapere...
Ciao

ysdemarc Profilo | Expert

non riesco a capire quello che intendi.

la mia stringa sql è del formato così incasinata:

select campo1, campo2, SUM(campo3) AS campo3
from
(select a.campo1
, b.campo2
, (Select campo from tabella3 C where C.chiave3 = A.Chiave) AS Campo3
FROM tabella1 A
inner join tabella2 B
On A.chiave = B.Chiave) T
group by campo1, campo2

per l'esecuzione della query faccio così (riporto un sunto dalla classe):

OleDbConnection cn = new OleDbConnection(connString)
OleDbCommand cm = new OleDbCommand(sql,cn);
OleDbDataAdapter da = new OleDbDataAdapter(cm);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
cb.RefreshSchema();

DataSet ds = new DataSet();
da.FillSchema(ds,SchemaType.Source);
da.Fill (ds);
.....

come devo modificarle ste righe per evitare l'errore?..

per quale motivo ho l'errore ancora non l'ho capito


Vincenzo
Programmatore sbilenco

Jeremy Profilo | Guru

>come devo modificarle ste righe per evitare l'errore?..
Non lo so esattamente .... dovrei vedere la struttura della tabella che hai nel db.
Ma potrei suggerti una prova per vedere se quello che ti ho indicato io è vero oppure no....una specie di ricerca guasto.

Comincia con questa QueryString in modo tale da capire se l'errore dipende dalla query di select o meno:

SELECT * FROM TuaTabella

Se non ricevi più l'eccezione, vuol dire che, probabilmente, è come ti ho detto io....per maggiori informazioni, guarda qui:
http://msdn.microsoft.com/it-it/library/system.data.common.dataadapter.fillschema.aspx

Facci sapere...
Ciao

ysdemarc Profilo | Expert

...Al momento ho risolto

mettendo sta riga per ogni colonna nella stringa sql:

(CASE WHEN Campo IS NULL THEN '' ELSE Campo END) AS Campo

quello che dici tu non riesco a concepirlo..o meglio se un database ha dei vincoli, com'è possibile che facendo la select possa trovare righe che non rispettano quei vincoli?

...bo.. non ci capisco

cmq, queste tabelle con le rispettive colonne le utilizzo in altre form per la scelta da parte dell'utente..

forse il problema sta nelle sotto query.. però non capisco chi gli dice al dataAdapter che il campo deve essere not null, visto che in questo caso non c'è un vero e proprio schema..
Vincenzo
Programmatore sbilenco
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5