Przekazanie wartosci zwroconej przez zapytanie do parametru

0

Witam mam problem jak w temacie. Mam zapytanie ktore wybiera mi Gatunki muzyczne z bazy i grupuje.
Chciallbym wybrac konkretna kolumne z tego zapytania i uzyc tego polac do 2 zapytania wybierajacego konkretny juz gatunek przy uzycia parametru. Wyskakuje mni blad: Invalid attempt to read when no data is present. Prosze o pomoc w tej sprawie. Oto kod

protected void Page_Load(object sender, EventArgs e)
{
   
    DataSet myData = new DataSet();

    string ConnectionString = ConfigurationManager.
    ConnectionStrings["SqlConnectionString"].ConnectionString;
    SqlConnection myConnection = new SqlConnection(ConnectionString);

    string value = Request["indeks"];

    int indeks = Convert.ToInt32(value);

    SqlCommand myCommand = new SqlCommand(Zapytanie, myConnection);


    myConnection.Open();
    SqlDataReader myReader = myCommand.ExecuteReader();
    string ZapytanieWykonawca = "Select NazwaWykonawcy from Wykonawcy where Gatunek = @Gatunek";

  
    SqlCommand CommandWykonawca = new SqlCommand(ZapytanieWykonawca, myConnection);

 

    myCommand.Parameters.Add("@Gatunek", SqlDbType.Text);
    myCommand.Parameters["@Gatunek"].Value = Convert.ToString(myReader[indeks]);
  

    SqlDataAdapter myAdapter = new SqlDataAdapter();
    myAdapter.SelectCommand = CommandWykonawca;
    myAdapter.Fill(myData);

     wyswietl.DataSource = myData;
    wyswietl.DataBind();

    myReader.Close();
    myConnection.Close();
}

}

0

musisz przeczytac reader
myReader.Read()
po tym bedzie mogl przeczytac dane z pierwszego wiersza zwroconego przez query

0

po dodaniu do kodu:

  while (myReader.Read())
    {


        myCommand.Parameters.Add("@Gatunek", SqlDbType.Text);
        myCommand.Parameters["@Gatunek"].Value = Convert.ToString(myReader[indeks]);

    }

pojawia mi sie nastepny error: Index was outside the bounds of the array.

0

czy istnieje w ogole jakis posob zeby wyswietlic konkretna dane o konkretnym indeksie w tabeli? W moim przypadku numer indeksu znajduje sie pod zmienna indeks ktora pobieram na poprzedniej stronie.

0

o_O ok widze ze problem lezy w nieznajomosci co jest w readerze

zalozmy mamy tabele Person:
Id | Name | Surname
1 | Adam | Malinowski
2 | Beata | Kowalska
3 | Jan | Nowak
oraz tabele CosOPerson:
Id | PersonId | Num1 | Date1
1 | 1 | 1 | 2010-1-1
2 | 1 | 2 | null
3 | 2 | 1 | 2010-6-1
4 | 3 | 2 | 2010-6-10

query1: select * from Person where Id = @pid -- zalozmy ze @pid = 1
wiec to query wybiera 1 rekord
po wykonaniu pierwszego Read() na readerze mozemy czytac ten rekord
rekord ma 3 kolumny: Id, Name, Surname
wiec mozesz odwolac sie po nazwie kolumny reader["Id"], reader["Name"]
lub po indexie kolumny, w tym przypadku sa 3 kolumny, wiec index jest od 0 do 2
reader[0] to jest Id, reader[2] to jest Surname

query2: select Num1,Date1 from CosPerson where PersonId = @pid -- gdzie @pid = Convert.ToInt32(reader1["Id"])
dostajemy 2 rekordy
i kazdy ma 2 kolumny, bo tylko tyle wybralismy w select
po pierwszym read mamy dostep do danych pierwszego rekordu, kolumn Num1 i Date1 lub po indexie, odpowiednio 0 i 1

co ty zrobiles?
chciales pobrac z zapytania "Zapytanie" kolumne o indexie "indeks", zdaje sie ze "Zapytanie" nie zwraca az tyle kolumn

0

pewnie że istnieje i jest takich sposobów dużo, chociażby where indeks = ...
a sposób ktróry Ty wykorzystałeś... wygląda na to że indeks który pobrałeś nie równa się wielkości pobranych wierszy z drugiego zapytania.
Domyślam się że w pierwszym pobierasz identyfikator
a w drugim używasz tego identyfikatora jako indeksu tablicy, co jest błędem.
pobrany indeks może być 11000, a drugie zapytanie zwróci np 2000 wyników co prawda o indeksach od 10000 do 12000, ale to dalej tylko 2000.

0

skoro ten sposob jest zly to bylbym wdzieczny za kilka porad. Moze naswietle ogole caly problem.
Projekt ktory wykonuje to system ekspertowy ktory pomaga okreslic preferencje muzyczne uzytkownika i wybiera dla niego konkretne zespoly. na podstawie 12 zadawanych pytan. Wnioskowanie polega na wpisywaniu do tablicy wartosci 0 albo 1 pomnozonych przez odpowiedniega wage pytania , wiersze odpowiadaja za gatunki muzyczne. ideks o najwiekszej sumie na wierszach to jest index ktory chce wyswietlic. Tzn. Chce wyswietlic Wykonawce ktory reprezentuje gatunek o id rownej temu maksymalnemu indeksowi.
Jezeli ktos ma inny pomysl niz ten moj to prosze o pomoc

0

rozumiem ze masz tablice 12 elementow (tyle co pytan) liczb double/int (bo 0 lub 1 pomnozone przez wage)
np.
1
4
5
6
2
11
9
8
4
5
2
3

szosty element ma najwieksza wartosc (11) wiec wybierasz gatunek muzyczny o id/indeksie 6
select W.* from
(select * from Gatunek where Id=6) as G
inner join Wykonawca W on G.Id = W.GatunekId
to wybiera wszystkich wykonwacow z gatunku o id 6
jesli chcesz tylko jednego to jakis warunek musisz sobie dodac, np. pierwszy top 1

readerem czytasz te wiersze, zaluzmy ze masz dla tab. Wykonawca kolumny: Id, NazwaZespolu, GatunekId, RokPowstania, LiczbaPlyt

SqlDataReader r = comm.ExecuteReader();
while(r.Read())
{
link.HRef = "/zespol.aspx?id=" + r["Id"];
labelTitle.Text = (string)r["NazwaZespolu"];
labelRok.Text = Convert.ToString(r["RokPowstania"]);
int lPlyt = r["LiczbaPlyt"] != DBNull.Value ? (int)r["LiczbaPlyt"] : 0;
if (lPlyt > 0)
labelLPlyt.Text = lPlyt.ToString();
else
labelLPlyt.Text = "zespol nie wydal jeszcze zadnej plyty";
}
r.Close();

p.s. w sam algorytm nie wnikam

0

a co jezeli gatunki i wykonawce mam w jednej tabeli, a gatunki sie powtarzaja wiec wtedy ciezko jest okreslic jego id, poza tym tablice mam 2 wymairowa, ale to nie robi wieszkej roznicy. Majac juz wyznaczony maksymalny element tablicy przekazuje go do nastepnej strony Response.Redirect("wynikowa.aspx?="+indeks"
I teraz wiedzac ze Gatunek i NazwaWykonawcy sa w jednej tableli i Gatunki sie powtarzaja chcialbym wyswietlic nazwe wykonawcy. Tak sie sklada ze po zgrupowaniu Gatunkow mam 22 rekordy w tablicy z poprzedniej strony czyli indeks tablicy bedzie odpowiadal numeru porzadkowemu gatunku zgrupowanej tabeli grupowanej po gatunku.

0

czyli masz tablice:
Id | IndexGatunku | NazwaGatunku | Wykonawca | IloscPlyt | ...
1 | 1 | Pop | brytnej | 4
2 | 1 | Pop | madonna | 7
3 | 2 | Rock | Bon jovi | 9
4 | 4 | Metal | Ozzy | 10
???

czyli masz zgrupowane garunki:
1 | Pop
2 | Rock
4 | Metal

wyszlo ci ze masz <ort>wziasc </ort>gatunek z indeksem 1 (nie spod indeksu 1 w tablicy)

wiec teraz w sql bieresz select * from Tab where IndexGatunku = @mojIndeks
i dostajesz wszystkich wykonawcow

jesli zle cos znowu zrozumialem, to wpisz przyklad kilku rekordow z twojej tablicy i jakos jasniej i przykladowo opisz jak ten indeks liczysz

0

Moja tabela wyglada tak:

IdWykonawcy | Gatunek | NazwaWykonawcy
1 | 1 | Pop | brytnej
2 | 1 | Pop | madonna
3 | 2 | Rock | Bon jovia

indeks wybieram w ten sposob:
sumuje kazdy wiersz
for (int i = 0; i <=s-1; i++)
{

            Response.Write("<br/>");

            for (int j = 0; j <12; j++)
            {


                suma = suma + tablica[i, j];
                if (j == 11)
                {
                    lista.Add(suma);
                    suma = 0;


                }


            }
        }

nastepnie wpisuje sume do listy, obliczam maximum i indeks maximum

         double max = Convert.ToDouble(lista[0]);

        for (int m = 0; m < lista.Count; m++)
        {



            if (Convert.ToDouble(lista[m]) >= max)
            {
                max = Convert.ToDouble(lista[m]);

            }
        }


        
        indeks = lista.IndexOf(max);
        Response.Redirect("wynikowa.aspx?indeks=" + indeks); // przekazanie maks indeksu do strony

i na 2 stronie chce wyswietlic wykonawce z gatunku o tym indeksie, z tym ze w tablicy jest liczone od 0 , a ID jest od 1

0

podaj typ suma oraz tablica

0

tablica i suma to double

0
 double max = 0;
int index = 0;
for (int i = 0; i < s; i++)
{
  double suma = 0;
  for (int j = 0; j < 12; j++)
    suma += tablica[i, j];
  if (suma > max)
  {
    max = suma;
    index = i;
  }
}

Response.Redirect("wynikowa.aspx?indeks=" + (index+1));

pytanie co jesli wartosc suma w kilku wierszach bedzie taka sama?
ktory gatunek wybrac?
kod, ktory napisalem wybiera ostatni w tablicy, pytanie czy to wlasciwe podejscie
gwarantuje tez ze jesli wszystkie wiersze maja sume = 0 to wskazany zostanie index = 0 i po dodaniu jeden, bedzie przekazany do strony wynikowa indeks=1

0

do tego juz doszedlem, z tym ze ja zwiekszalem wartosc idneks o 1 przy wartosci parametru. Ale w dalszym ciagu nie wiem jak wyswietlic tego wykonawce z gatunkiem o id = indeks
a co do przypadku ze suma jest taka sama na kilku wierszach, dlatego wlasnie wprowadzilem wagi od 0,01 do 0,6

0

w dalszym ciagu nie wiem jak wyswietlic tego wykonawce z gatunkiem o id = indeks

select * from Wykonawcy where GatunekId = @indeks
albo nadal nie rozumie co i jak jest w tabeli w bazie, bo kopiujac moj przyklad danych masz 3 naglowki kolumn, a danych 4 kolumny
czy indeks to nie id gatunku? pytanie co bedzie jesli masz kilku wyk. dla jednego gatunku?

0

no wlasnie o tym mowie. Mam kilku wykonawcow przypisanych do jednego gatunku. Ale chccialem to rozbic na 2 zapytania. Wpierwszym zapytaniu select gatunek from Wykonawcy group by gatunek. I mam wtedy wszystkiegatunki ktore sie nie powtarzaja. A w kolejnym zapytaniu chcialbym pobrac ta wartosc z kolumny ktora jest przekazywana przed zmienna indeks i wyswietlic select nazwa wykonawcy from wykonawcy where gatunek = @gatunek. Parametr gatunek ma miec wartosc pobranego z pierwszego selectu

0

Moja tabela wyglada tak:

IdWykonawcy | Gatunek | NazwaWykonawcy
1 | Pop | brytnej
2 | Pop | madonna
3 | Rock | Bon jovia

caly problem polega wlasnie na tym ze kilku wykonawcow jest przpisanych do jednego gatunku

chcialem to zrobic z podzapytaniem ale sie nieda
select NazwaWykonawcy from Wykonawcy where Gatunek = (select Gatunek from wyknawcy where IdWykonawcy = @IdWykonawcy)

0

A w kolejnym zapytaniu chcialbym pobrac ta wartosc z kolumny ktora jest przekazywana przed zmienna indeks i wyswietlic select nazwa wykonawcy from wykonawcy where gatunek = @gatunek.

wymiekam
rozumiem ze indeks wskazuje gatunek na liscie?
czyli @gatunek = listaGatunkow[indeks], tak?

jesli tak to twoja koncepcja dla mnie nie trzyma sie kupy :/ pobranie listy gatunkow po grupowaniu z tabeli z wykonawcami to jakas mega lipa, bo nie masz pewnosci w jakiej beda kolejnosci, jesli lista wykonawcow bedzie sie zmieniac
to moze opisz jak zdobywasz dane do tej tablicy z wartosciami ktore sie sumuje, a powiem ci jak powinno to wszystko wygladac zeby to mialo rece i nogi

0

wiem w jakiej kolejnosci. Bo gatunki sa wyswietlane alfabetycznie. Stad znam kolejnosc wyswietlania gatunkow. Wiedzac ze maksymalny element w tablicy(ta z ktorej wyznamasz maksymalna sume wierszy) czyli indeks wynosi np 4, wiem ze gatunek o ktory mi chodzi jest na 5 miejscu po wyswietleniu select gatunek form wykonawcy group by gatunek. I wlasnie wykonawce o takim gatunku chce wyswietlic

0
declare @Wyk table (Id int identity(1,1), Gatunek nvarchar(50), Wykonawca nvarchar(50))

insert into @Wyk values ('Pop', 'Brity')
insert into @Wyk values ('Rock', 'Blondie')
insert into @Wyk values ('Klasyczna', 'Chopin')
insert into @Wyk values ('Rock', 'Bon Jovi')
insert into @Wyk values ('HipHop', 'Liroy')
insert into @Wyk values ('RnB', 'smety 1')
insert into @Wyk values ('Metal', 'Ozzy')
insert into @Wyk values ('Metal', 'Metallica')
insert into @Wyk values ('Pop', 'Krysia Aguilera')

select * from @Wyk
select Row_number() over (order by Gatunek) as GatunekIndex, Gatunek from @Wyk group by Gatunek

declare @index int
set @index = 4


select Gatunek from
	(select Row_number() over (order by Gatunek) as GatunekIndex, Gatunek from @Wyk group by Gatunek) as G
where GatunekIndex = @index

select * from @Wyk
where Gatunek = (
	select Gatunek from
		(select Row_number() over (order by Gatunek) as GatunekIndex, Gatunek from @Wyk group by Gatunek) as G
	where GatunekIndex = @index
)

oczywiscie wybiera to wszystkich wykonawcow z danego gatunku, a nie jednego, bo nie znam kryteriow wyboru jednego, tego konkretnego
oczywiscie w zapytaniu jest kilka selectow wiecej zeby pokazac jaka czesc co wybiera, ciebie interesuje ostatni select
wiec jak wybierasz tego konkretnego wykonawce z danego gatunku?

0

a nie mozna by tego zrobic w ten sposob:
w gridview wyswietlam gatunek, to mi dziala. I zrobic to teraz w ten sposob zeby zawartosc gridview, tzn data source przypisac do pramatru do 2 zapytania, czyli:

I zapytanie:

string ZapytanieWykonawca = "Select Gatunek from Wykonawcy where IdWykonawcy = @IdWykonawcy";

    SqlCommand CommandWykonawca = new SqlCommand(ZapytanieWykonawca, myConnection);


    CommandWykonawca.Parameters.Add("@IdWykonawcy", SqlDbType.Int);
    CommandWykonawca.Parameters["@IdWykonawcy"].Value = indeks+1;
 

II zapytanie

string Zapytanie = "select NazwaWykonawcy from Wykonawcy where Gatunek = @Gatunek";

    SqlCommand myCommand = new SqlCommand(Zapytanie, myConnection);

    CommandWykonawca.Parameters.Add("@Gatunek", SqlDbType.Int);
    CommandWykonawca.Parameters["@Gatunek"].Value = GridViewl.DataSource;
    SqlDataAdapter myAdapter = new SqlDataAdapter();
    myAdapter.SelectCommand = myCommand;
    myAdapter.Fill(myData);

tylko nie do konca wiem jak to mozna przekazac do tego parametru :/

0

Udalo mi sie to zrobic :) Stworzylem po prostu tablice stringow z gatunkami :D
Dzieki za pomoc. Zamykam temat

1 użytkowników online, w tym zalogowanych: 0, gości: 1