[ lonelyrider_44 @ 11.09.2009. 01:10 ] @
Code:

{
komanda.Connection = konekcija;
komanda.CommandText = "SELECT * FROM Proizvod INNER JOIN cjena_proizvoda INNER JOIN stavka_cjenovnika ON stavka_cjenovnika.sifraProizvoda = cjena_proizvoda.sifraProizvoda ON cjena_proizvoda.SifraProizvoda = proizvod.SifraProizvoda";

adPregled.SelectCommand = komanda;
dsPregled.Clear();
adPregled.Fill(dsPregled);

dataGridView1.DataSource = dsPregled.Tables[0];
}


SQL upit koji je ovde upotrebljen sam testirao u Query Analizer-u i radi, nema nikakvih greshaka. Medjutim, kada pokrenem program, pukne pri izvrshenju ovog koda, zaleci se da postoji greshka u FROM delu. Sve deluje ok, bar meni, ali opet ne radi. Malo sam trazio na netu, nekom je problem reshilo kad je imena tabela stavio u uglaste zagrade. Probao sam, ali i dalje ista greshka. Da li neko ima ideju shta bi mogao biti problem i kako ga reshiti ? Koristim VS 2005 Express, ako to ima neke veze. Takodje, kada spajam samo dve tabele, recimo proizvod sa cjena_proizvoda, onda ne pukne program, ali se desi neshto chudno. U gridu mi pokaze i sva polja iz drugih tabela sa kojima je su povezane te dve tabele koje sam naveo u upitu.
[ Dejan Carić @ 11.09.2009. 08:22 ] @
Za početak, navedi kriterijum po kome vezuješ tabele Proizvod i cjena_proizvoda.
Code:
SELECT * FROM Proizvod INNER JOIN cjena_proizvoda ON Proizvod.neko_polje = cjena_proizvoda.neko_polje ...
[ lonelyrider_44 @ 11.09.2009. 11:50 ] @
Kad sam dobio email o ovom odgovoru, prvo sam pomislio: nisam valjda napisao takvu glupost ? Medjutim, sad pregledam kod koji sam napisao, i ne vidim shta je to na shta mislish da sam izostavio. "neko_polje" je "sifraProizvoda". Chak i da si u pravu, rekoh da sql upit radi, proverio sam u sql serverovom query analizer-u. Poshto sam chachkao, menjao upit, da vidim kako ce raditi, bilo je moguce da cu izostaviti neshto od originalnog upita, ali koliko vidim, nisam izostavio. Poshto spajam vishe od dve tabele, koliko ja znam, kada je u pitanju INNER JOIN prvo se navode sve tabele, pa tek onda uslovi spajanja. Tako sam i napisao.
[ Dejan Carić @ 11.09.2009. 13:15 ] @
Citat:
lonelyrider_44: Poshto spajam vishe od dve tabele, koliko ja znam, kada je u pitanju INNER JOIN prvo se navode sve tabele, pa tek onda uslovi spajanja.

Ne :)
Jer ako tako uradiš, vrlo lako možeš dobiti exception.
Code:
The multi-part identifier ........ could not be bound.
Znači redosled je:
Code:

SELECT
    sta_se_selektuje
FROM
    prva_table
    INNER JOIN druga_tabela ON uslov(i)_spajanja
    INNER JOIN treca_tabela ON uslov(i)_spajanja
...

Da li si prošao kroz debbuger i video tačno koja se greška javlja?
[ lonelyrider_44 @ 11.09.2009. 15:24 ] @
"Syntax error in From clause". To me najvishe zbunjuje, shto se zali na sintaksu upita, a upit je testiran i radi, takav kakav jeste.
Za takvo formulisanje INNER JOIN-a sam mozda chuo, ali nisam nikad koristio tako da sam i zaboravio, ako sam i znao ikad. Nachin koji sam pomenuo mi se ipak chini nekako pregledniji u kodu. No dobro, to je vec stvar ukusa, i nije mi jasno ako su oba ispravna, zashto bi se tu javljala greshka ? Meni se chini da je ovo pomalo bug...

Probao sam da formulishem sql upit kako si predlozio i on sada izgleda ovako:

"SELECT * FROM Proizvod INNER JOIN cjena_proizvoda ON cjena_proizvoda.SifraProizvoda = proizvod.SifraProizvoda INNER JOIN stavka_cjenovnika ON stavka_cjenovnika.sifraProizvoda = cjena_proizvoda.sifraProizvoda";

I sada vishe nema greshke u from klauzi. Sada mu fali operator. :D
Poruka:
"Syntax error (missing operator) in query expression 'cjena_proizvoda.SifraProizvoda = proizvod.SifraProizvoda INNER JOIN stavka_cjenovnika ON stavka_cjenovnika.sifraProizvoda = cjena_proizvoda.sifraProizvoda'."

Inache, i sada kad sam promenio upit, testirao sam ga u sql serveru i daje rezultate bez ikakve greshke. Napravio sam drugi projekat, samo forma, datagrid i dugme za prikaz rezultata tog upita, i opet prijavljuje greshku.
[ Dejan Carić @ 11.09.2009. 18:08 ] @
Hmm...
A da okačiš .cs fajl pa da pogledamo?
[ lonelyrider_44 @ 11.09.2009. 18:37 ] @
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
OleDbCommand komanda = new OleDbCommand();
OleDbConnection konekcija = new OleDbConnection();

DataSet dsPregled = new DataSet();
OleDbDataAdapter adPregled = new OleDbDataAdapter();

private void Form1_Load(object sender, EventArgs e)
{
try
{
konekcija = new OleDbConnection();
konekcija.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Apoteka.mdb";
konekcija.Open();
komanda = new OleDbCommand();
komanda.CommandText = "SELECT * FROM JedinicaMjere,Proizvod,TipProizvoda,Cjena_Proizvoda,Firma WHERE TipProizvoda.SifraTipaProizvoda = Proizvod.SifraTipaProizvoda AND Proizvod.SifraJediniceMjere = JedinicaMjere.SifraJediniceMjere AND Cjena_Proizvoda.SifraProizvoda = Proizvod.SifraProizvoda AND Cjena_Proizvoda.SifraFirme = Firma.SifraFirme";

komanda.Connection = konekcija;

adPregled = new OleDbDataAdapter();
dsPregled = new DataSet();
adPregled.SelectCommand = komanda;
adPregled.Fill(dsPregled);
if (dsPregled.Tables[0].Rows.Count > 0)
{
int _rbSloga = 0;
// PostaviPodatke();
}
else
MessageBox.Show("Nema podataka u tabeli proizvod!");

dataGridView1.DataSource = dsPregled.Tables[0];

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}

private void button1_Click(object sender, EventArgs e)
{
komanda.Connection = konekcija;
//komanda.CommandText = "SELECT * FROM Proizvod INNER JOIN cjena_proizvoda INNER JOIN stavka_cjenovnika ON stavka_cjenovnika.sifraProizvoda = cjena_proizvoda.sifraProizvoda ON cjena_proizvoda.SifraProizvoda = proizvod.SifraProizvoda";
komanda.CommandText = "SELECT * FROM Proizvod INNER JOIN cjena_proizvoda ON cjena_proizvoda.SifraProizvoda = proizvod.SifraProizvoda INNER JOIN stavka_cjenovnika ON stavka_cjenovnika.sifraProizvoda = cjena_proizvoda.sifraProizvoda";

adPregled.SelectCommand = komanda;
dsPregled.Clear();
adPregled.Fill(dsPregled);

dataGridView1.DataSource = dsPregled.Tables[0];
}
}
}

A evo i link za ceo projekat, zajedno sa bazom.

http://rapidshare.com/files/27...5/WindowsApplication1.zip.html
[ Dejan Carić @ 11.09.2009. 19:45 ] @
1. Konekciju nisi zatvorio u FormLoad
2. OleDbCommand i OleDbConnection ne treba da su global, već ih kreiraš u svakoj funkciji.
3. Sve vreme pominješ sql server, a radiš sa access-om koji je priča za sebe
Code:

private void button1_Click(object sender, EventArgs e)
{
    // diskutabilno
    dsPregled.Clear();

    using (konekcija = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Apoteka.mdb"))
    {
        komanda = konekcija.CreateCommand();
        komanda.CommandText = "SELECT * FROM (PROIZVOD INNER JOIN STAVKA_CJENOVNIKA ON PROIZVOD.[SIFRAPROIZVODA] = STAVKA_CJENOVNIKA.[SIFRAPROIZVODA]) INNER JOIN CJENA_PROIZVODA ON PROIZVOD.[SIFRAPROIZVODA] = CJENA_PROIZVODA.[SIFRAPROIZVODA];";

        adPregled.SelectCommand = komanda;
        adPregled.Fill(dsPregled);
    }
}
[ nikitaGradov @ 12.09.2009. 10:50 ] @
komanda.CommandText = "SELECT * FROM Proizvod INNER JOIN Cjena_proizvoda ON Cjena_proizvoda.SifraProizvoda=Proizvod.SifraProizvoda INNER JOIN Stavka_cjenovnika ON Stavka_cjenovnika.sifraProizvoda=Cjena_proizvoda.SifraProizvoda";

Po tvom gornjem upitu, postoji veza izmedju tabela: Stavka_cjenovnika i Cjena_proizvoda. Ako sam ja dobro vidio dijagram relacija za tvoju bazu bazu, ove dvije tabele nisu ni u kakvoj relaciji ! U relaciji su Proizvod i Cjena_proizvoda, Cjena_proizvoda i Cjenovnik, ali, kao sto rekoh, Cjena_proizvoda i Stavka_cjenovnika nisu ni u kakvoj relaciji (pogledaj dijagram relacija ...).
[ nikitaGradov @ 12.09.2009. 10:56 ] @
Jos nesto:

OleDbCommand komanda;// = new OleDbCommand();
OleDbConnection konekcija;// = new OleDbConnection();

DataSet dsPregled;// = new DataSet();
OleDbDataAdapter adPregled;// = new OleDbDataAdapter();

private void Form1_Load(object sender, EventArgs e)
{
try
{
konekcija = new OleDbConnection();
konekcija.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Apoteka.mdb";
konekcija.Open();
komanda = new OleDbCommand();
komanda.CommandText = "SELECT * FROM JedinicaMjere,Proizvod,TipProizvoda,Cjena_Proizvoda,Firma WHERE TipProizvoda.SifraTipaProizvoda = Proizvod.SifraTipaProizvoda AND Proizvod.SifraJediniceMjere = JedinicaMjere.SifraJediniceMjere AND Cjena_Proizvoda.SifraProizvoda = Proizvod.SifraProizvoda AND Cjena_Proizvoda.SifraFirme = Firma.SifraFirme";

komanda.Connection = konekcija;

adPregled = new OleDbDataAdapter();
dsPregled = new DataSet();
adPregled.SelectCommand = komanda;

Nema potrebe da na dva mjesta pises da je komanda = new OleDbCommand() ili konekcija = new OleDbConnection() i slicno. Za ovu svrhu je najbolje koristiti operator using. Onda je 'zivotni vijek' objekta, koji se koristi u okviru using bloka, iskljucivo u okviru tog bloka (sto znaci da ce po izlasku iz using bloka, metod Dispose() za taj objekat biti sigurno pozvan).
[ nikitaGradov @ 12.09.2009. 11:12 ] @
komanda.CommandText = @"SELECT PROIZVOD.SIFRAPROIZVODA, PROIZVOD.SIFRATIPAPROIZVODA, PROIZVOD.SIFRAJEDINICEMJERE, PROIZVOD.NAZIVPROIZVODA, PROIZVOD.PDV, PROIZVOD.MARZA, PROIZVOD.ROKVAZENJA, PROIZVOD.KOLICINAZALIHE, CJENA_PROIZVODA.SIFRAPROIZVODA AS Expr1, CJENA_PROIZVODA.SIFRAFIRME, CJENA_PROIZVODA.NABAVNACIJENA, STAVKA_CJENOVNIKA.SIFRAPROIZVODA AS Expr2, STAVKA_CJENOVNIKA.SIFRACJENOVNIKA, STAVKA_CJENOVNIKA.CIJENA_PROIZVODA
FROM ((PROIZVOD INNER JOIN CJENA_PROIZVODA ON CJENA_PROIZVODA.SIFRAPROIZVODA = PROIZVOD.SIFRAPROIZVODA) INNER JOIN
STAVKA_CJENOVNIKA ON STAVKA_CJENOVNIKA.SIFRAPROIZVODA = CJENA_PROIZVODA.SIFRAPROIZVODA)";


Ovo je upit koji generise sam Studio kad kreiras new query (sa upitom iz tvog koda) - ubaci i probaj, ovo radi ...
[ mish_ns @ 02.10.2009. 12:33 ] @
Pozdrav svima...
Interesuje me kako u C# selektovati max vrednost nekog polja iz access tabele, pomocu SQL upita.

Probao sam ovako ali ne ide:

Code:

OleDbCommand objCommand1 = new OleDbCommand("SELECT Max [ID] FROM potrosaci",objConnection);


Ili prvu vrednost nekog polja ( TOP (1) ).

[ dusty @ 02.10.2009. 18:27 ] @
MAX() je funkcija, stoga met'i zagradu oko [ID]. Mogao bi da korisits try...catch blokove, cudo jedno koliko poruke sa greskama mogu da pomognu.
[ mish_ns @ 03.10.2009. 08:39 ] @
Hmmm... probao sam i to, nesto nece, ali sam se na kraju snasao sa TOP...

E sad imam drugi problem sa UPDATE-om.

Code:

OleDbCommand objCommand = new OleDbCommand("UPDATE potrosaci SET [polje1]='" +parametar1+ "',
[polje2]='" +parametar2+ "'WHERE [polje3]='" +parametar3+ "'", objConnection);
objCommand.ExecuteNonQuery();


na objCommand mi javlja gresku:

Data type mismatch in criteria expression.

E sad parametar 1 i 2 su stringovi, a pripadajuca polja u access-u Text.
parametar 3 je integer, a pripadajuce polje Number.
[ sallle @ 03.10.2009. 13:06 ] @
stavi taj param3 da bude bez jednostrukih apostrofa
[ mish_ns @ 03.10.2009. 13:30 ] @
Ha sallle, to je to...HVALA
[ draey @ 14.01.2010. 19:51 ] @
Jel mozhe nov link sa projektom taj stari ne radi !
Hvala