Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Błąd (troche dziwny) wykonania SELECT

1,185 views
Skip to first unread message

Jędrek

unread,
Mar 10, 2008, 6:52:29 AM3/10/08
to
Witam, może LAME, ale siedze od dwóch dni i nie wiem gdzie szukać błędu:(
SELECT wygląda tak:
SELECT UPRAWNIENIA.*, FIRMY.NAZWA_SKR FROM UPRAWNIENIA INNER JOIN FIRMY ON
UPRAWNIENIA.ID_FIRMY = FIRMY.ID_FIRMY

Jak go wykonuję z pod menedzera SQL'a jest ok, ale jak wykonuję z kodu
(prubowałem ciąg SQL'a), a nawet jako procedurę z SQL'a to mam błąd treści:
--------------
dtSELECT
System.Data.ConstraintException: Nie można włączyć ograniczeń. Jeden lub
więcej wierszy zawiera wartości naruszające ograniczenia dotyczące wartości
niezerowych, unikatowości lub klucza obcego.
w System.Data.DataTable.EnableConstraints()
w System.Data.DataTable.set_EnforceConstraints(Boolean value)
w System.Data.DataTable.EndLoadData()
w System.Data.Common.DataAdapter.FillFromReader(DataSet dataset,
DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32
startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object
parentChapterValue)
w System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader
dataReader, Int32 startRecord, Int32 maxRecords)
w System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables,
IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
w System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption,
FillErrorEventHandler errorHandler)
w System.Data.DataTable.Load(IDataReader reader)
w SQL.SQL.dtSELECT(Int32 ID_UZYTKOWNIKA)
------------------------------
Początkowo SELECT był z warunkiem, ale go wyciołem, zdjołem z w tabelach z
kolumn warunek NULL (mogą być puste), poza indeksem, ale nie pomogło nadał
zwraca komunikat błędu:(
Nie wiem gdzie szukać przyczyn tego komunikatu dokładnie:

Nie można włączyć ograniczeń. Jeden lub więcej wierszy zawiera wartości
naruszające ograniczenia dotyczące wartości niezerowych, unikatowości lub
klucza obcego.

Może przynajmniej ktoś mnie nakieruje, czy to jest powód w kodzie, czy w
może w danych?
Ale jeśli nie mogę złożyć prostego INNER JOIN, to jakoś tego nie kumam :(
P.S. Może ważne - W DataTable są co prawda zwracane dane, ale z innych tabel
niż występują w select. Kwerenda zwraca dane z tabeli UZYTKOWNICY, a nie
FIRMY. Baza nie ma nałożonych powiązań miedzy tabelami.
Pozdrawiam i z góry dzięki za pomoc.
/Jędrek


Grzegorz Danowski

unread,
Mar 10, 2008, 7:17:35 AM3/10/08
to
Użytkownik "Jędrek" <andr...@o2.pl> napisał w wiadomości
news:fr349g$7p8$1...@nemesis.news.neostrada.pl...

> Witam, może LAME, ale siedze od dwóch dni i nie wiem gdzie szukać błędu:(
> SELECT wygląda tak:
> SELECT UPRAWNIENIA.*, FIRMY.NAZWA_SKR FROM UPRAWNIENIA INNER JOIN FIRMY ON
> UPRAWNIENIA.ID_FIRMY = FIRMY.ID_FIRMY
>
> Jak go wykonuję z pod menedzera SQL'a jest ok, ale jak wykonuję z kodu
> (prubowałem ciąg SQL'a), a nawet jako procedurę z SQL'a to mam błąd
> treści:
> --------------
> dtSELECT
> System.Data.ConstraintException: Nie można włączyć ograniczeń. Jeden lub
> więcej wierszy zawiera wartości naruszające ograniczenia dotyczące
> wartości niezerowych, unikatowości lub klucza obcego.
...

> Początkowo SELECT był z warunkiem, ale go wyciołem, zdjołem z w tabelach z
> kolumn warunek NULL (mogą być puste), poza indeksem, ale nie pomogło nadał
> zwraca komunikat błędu:(
> Nie wiem gdzie szukać przyczyn tego komunikatu dokładnie:

Spróbuj wykonać Preview dla tego DataAdaptera. Na jakim polu masz założony
indeks? Czy w bazie danych jest on także unikatowy? No i jeszcze raz sprawdź
czy rzeczywiście na wszystkich kolumnach masz AllowDbNull.
Pozdrawiam
Grzegorz


laz...@gmail.com

unread,
Mar 10, 2008, 7:28:55 AM3/10/08
to

jesli nie myle bledow to:

mozesz to rozwiazac na 2 sposoby

1. nie elegancki,

wylacz constrainty w dataSetcie:

Jak masz dataSeta

ds.EnforceConstraints = false;

2. elegancki, rozbija sie mu o to, ze constraity nie sa zgodne w
datasetcie oraz w bazie danych.
odswiez dataSeta [przeciagnij jeszcze raz tabele w designerze]

pozdr.
L.

Jędrek

unread,
Mar 10, 2008, 9:06:26 AM3/10/08
to
>> SELECT wygląda tak:
>> SELECT UPRAWNIENIA.*, FIRMY.NAZWA_SKR FROM UPRAWNIENIA INNER JOIN FIRMY
>> ON UPRAWNIENIA.ID_FIRMY = FIRMY.ID_FIRMY
>>
>> Jak go wykonuję z pod menedzera SQL'a jest ok, ale jak wykonuję z kodu
>> (prubowałem ciąg SQL'a), a nawet jako procedurę z SQL'a to mam błąd
>> treści:
>> --------------
>> dtSELECT
>> System.Data.ConstraintException: Nie można włączyć ograniczeń. Jeden lub
>> więcej wierszy zawiera wartości naruszające ograniczenia dotyczące
>> wartości niezerowych, unikatowości lub klucza obcego.
> ...
>> Początkowo SELECT był z warunkiem, ale go wyciołem, zdjołem z w tabelach
>> z kolumn warunek NULL (mogą być puste), poza indeksem, ale nie pomogło
>> nadał zwraca komunikat błędu:(
>> Nie wiem gdzie szukać przyczyn tego komunikatu dokładnie:
>
> Spróbuj wykonać Preview dla tego DataAdaptera. Na jakim polu masz założony
> indeks? Czy w bazie danych jest on także unikatowy? No i jeszcze raz
> sprawdź czy rzeczywiście na wszystkich kolumnach masz AllowDbNull.
> Pozdrawiam
> Grzegorz

W tabeli UPRAWNIENIA mam dwa indeksy obce ID_FIRMY i ID_UZYTKOWNIKA oraz
własny tabeli ID_UPRAWNIENIA.
Sprawdzałem i NULL'a nie mogę wstawić tylko w kluczu tabeli, pozostałe pola
mogą być NULL.
Klucze są unikatowe w karzdej z tabel natomiast w tabeli uprawnienia oba
klucze obce mogą występować wielokrotnie (to chyba nie jest błąd w
założeniach)

Nierozumiem tylko dlaczego ten sam SELECT z SQL Serwer Managment studio
express wykonuje się poprawnie, a z kodu nie?
Wywołanie procedury wykonuję tak:
--------
SqlConnection SQLCN = new SqlConnection();
SQLCN.ConnectionString = SConnect
SQLCN.Open();
SqlCmd.CommandType = CommandType.StoredProcedure;
SqlCmd.CommandText = "TEST";
SqlCmd.Parameters.Add("@ID_UZYTKOWNIKA",
SqlDbType.Int).Value=ID_UZYTKOWNIKA;
SqlDataReader SqlDr;
SqlDr = SqlCmd.ExecuteReader();
DT.Load(SqlDr);
SQLCN.Close();
--------
Może tu jest błąd, ale na prostych SELECT to działa.
A może wiersze, które uważam za niepowiazane z zapytaniem mogą generować
błąd jeśli zawierają niepoprawną informację?
Chyba jeszcze mi pozostaje testowanie na pustej bazie z FULL danymi...
Pozdrawiam
/Jędrek


Grzegorz Danowski

unread,
Mar 10, 2008, 3:53:25 PM3/10/08
to
Użytkownik "Jędrek" <andr...@o2.pl> napisał w wiadomości
news:fr3bqu$g0q$1...@atlantis.news.neostrada.pl...

>>> System.Data.ConstraintException: Nie można włączyć ograniczeń. Jeden lub
>>> więcej wierszy zawiera wartości naruszające ograniczenia dotyczące
>>> wartości niezerowych, unikatowości lub klucza obcego.
>> ...
>>> Początkowo SELECT był z warunkiem, ale go wyciołem, zdjołem z w tabelach
>>> z kolumn warunek NULL (mogą być puste), poza indeksem, ale nie pomogło
>>> nadał zwraca komunikat błędu:(
>>> Nie wiem gdzie szukać przyczyn tego komunikatu dokładnie:
>>
....

> Nierozumiem tylko dlaczego ten sam SELECT z SQL Serwer Managment studio
> express wykonuje się poprawnie, a z kodu nie?

AFAIR takie błędy też są wtedy jak długość pola w DataTable jest
niewystarczająca. Proponuję byś poszedł za radą laziers, a dla ułatwienia
zrób w bazie widok taki jak Twój selekt i potem przeciągnij go na Twój
DataSet. Alternatywnie można spróbować wyszukać binarnie jakiś felarny
rekord i naocznie przekonać się co w nim jest nie tak :).

Pozdrawiam
Grzegorz

Paweł Filipiak

unread,
Mar 11, 2008, 8:06:55 AM3/11/08
to
Jędrek wrote:
[...]

> System.Data.ConstraintException: Nie można włączyć ograniczeń. Jeden lub
> więcej wierszy zawiera wartości naruszające ograniczenia dotyczące wartości
> niezerowych, unikatowości lub klucza obcego.
[...]
Ten błąd nie jest zgłaszany przez bazę danych, ale przez samego
DataSeta, przy próbie jego wypełnienia. Projektując DataSeta uzyłeś
zapewne pewnych ograniczeń - np określiłeś które kolumny w DataTable nie
mogą być NULL, założyłeś klucze główne na DataTable lub też założyłeś
relacje pomiędzy DataTable.
W chwili, gdy wywołujesz metodę Fill i DataSet jest napełniany danymi
zwróconymi z bazy przez Twoje zapytanie, te ograniczenia muszą być
spełnione dla pobranych danych. Jakieś ograniczenie nie jest spełnione i
DS zgłasza wyjątek.
Musisz uważnie prześledzić projekt DataSeta (w designerze), a potem
przyjrzeć się danym zwróconym z bazy - czy wszystkie rekordy w kolumnach
oznaczonych jako "not null" w DS faktycznie mają niepuste wartości; czy
wszystkie relacje nadrzędny - podrzędny są spełnione, itd.
Niestety wyjątek nie precyzuje, o które dokładnie ograniczenie chodzi i
poszukiwanie błędu może zająć sporo czasu.
Jak już znajdziesz problem musisz zadecydować - czy projekt DS jest
błędny, bo źle modeluje dane, czy też zapytanie o dane jest błędne, bo
dostarcza danych nieodpowiadających modelowi.


--
pozdrawiam,
Paweł Filipiak

Jędrek

unread,
Mar 12, 2008, 2:43:10 AM3/12/08
to
Witam ponownie.
W końcu znalazłem luke, ale w moim myśleniu a nie działaniu zapytań serwera.
Błąd był w wykorzystaniu DataTable - moje niedopatrzenie.
Poprawione i działa.
Dzięki za sugestie gdzie szukać, bo sam bym się pewnie jeszcze z tydzień
bujał.
Pozdrawiam

Użytkownik "Jędrek" <andr...@o2.pl> napisał w wiadomości

news:fr349g$7p8$1...@nemesis.news.neostrada.pl...

0 new messages