Parametry SQL dotazu   zodpovězená otázka

VB.NET, ADO.NET, Databáze

Dobrý den.

Mám následující SQL dotaz:

"SELECT * FROM Pohyby_stajaky WHERE Datum >= Datum_od AND Datum <= Datum_do Order By Cislo, Datum"

* položky "Datum_od" a "Datum_do" jsou proměnné obsahující datum začátku a konce období. Takto zapsaný dotaz samozřejmě nefunguje. Jak sdělit mySQL serveru, že se jedná o proměnné a ne o pole tabulky v databázi ? Díky za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevím, jestli to funguje u MySQL, ale u MSSQL to funguje takto:

Dim com As New SqlCommand("SELECT * FROM Pohyby_stajaky WHERE Datum >= @Datum_od AND Datum <= @Datum_do Order By Cislo, Datum", "váš connectionstring") 'Vytvoříme SqlCommand
com.Parameters.AddWithValue("Datum_od", Now) '1. parametr
com.Parameters.AddWithValue("Datum_do", Now.AddDays(20)) '2. parametr
Dim r As SqlDataReader
com.Connection.Open() 'Otevřeme připojení
r = com.ExecuteReader() 'Získáme data
com.Connection.Close() 'Zavřeme připojení

Získaná data potom můžete zpracovat způsobem popsaným na této adrese: http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Když to zkusím takhle, vrátí se mi prázdný recordset (takhle jsem to zkoušel už předtím, než jsem se zeptal na fóru):

        db = CreateObject("ADODB.Connection")
        db.Open("Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=access;User=kez;Password=kez;Option=3;")

        rs = CreateObject("ADODB.Recordset")
        rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        rs.Open("SELECT * FROM Pohyby_stajaky WHERE Datum >= @Datum_od and Datum <= @Datum_do Order By Cislo, Datum", db, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

znaky "_" na konci řádků je třeba si domyslet :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když zadám tohle, funguje to, vrátí se recordset se správnými daty...


        db = CreateObject("ADODB.Connection")
        db.Open("Driver={MySQL ODBC 5.1 Driver};Server=localhost;Port=3306;Database=access;User=kez;Password=kez;Option=3;")

        rs = CreateObject("ADODB.Recordset")
        rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        rs.Open("SELECT * FROM Ciselnik_firem WHERE Typ = 'Stájový registr' Order By Firma", db, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

... ale v momentě, kdy se do SQL dotazu snažím napasovat místo konkrétní hodnoty (třeba datumu) proměnnou, tak se žádná data nevrátí a recordset je prázdný...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

MySQL chápe celý příkaz SELECT jako řetězec, takže je třeba jej vygenerovat dynamicky. Viz násl. fragment kódu:

Dim SQLZdroj As String
Dim cnx As ADODB.Connection
Dim rsx As ADODB.Recordset
Dim AktDetail As Int
'.
AktDetail=14 'naplneni promenne nejakou hodnotou, zde pro priklad 14
'.
'dynamicke vygenerovani SQL dotazu
SQLZdroj = "select kat, startno, poradi from lidi where poradi is not null and kat = " & CStr(AktDetail) & " order by kat, startno"
Set cnx = New ADODB.Connection
rsx.Open(SQLZdroj, cnx, adOpenStatic, adLockReadOnly)
'.
'atd.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

že mě to nenapadlo hned. Díky, funguje to.

"SELECT * FROM Pohyby_stajaky WHERE Datum >= '" & Datum_od & "' AND Datum <= '" & Datum_do & "' Order By Cislo, Datum"
nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
"SELECT * FROM Pohyby_stajaky WHERE Datum >= '" & Datum_od & "' AND Datum <= '" & Datum_do & "' Order By Cislo, Datum"

- tenhle SQL dotaz funguje v mým případě pouze tehdy, když je do proměnných (alespoň v případě mySQL serveru) dosazena hodnota datumu ve formátu např. "20081201000000" -> 1.12.2008 00:00:00). Záleží ale na tom, v jakém formátu je datum uloženo v mySQL databázi (defaultně mySQL server vrací "číselnou verzi" datumu). A proto mi (mimo jiné) SQL dotaz nefungoval...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Takhle by se to právěže dělat nikdy nemělo, proto každá databáze včetně MySQL nějak parametry podporuje. Nevím, jak se to dělá v MySQL, tuto databázi moc neznám, ale určitě to umí a doporučuji to používat.

Rozhodně všem, kteří skládají SQL stringy doporučuji přečíst si tento článek na mém blogu: http://vbnet.cz/blog-clanek--203-proc_po...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

odkaz na blog je nefunční

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback