Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem [MySQL] Hodnota

Dobrý den, dělám na jednom prográmku pro jednu společnost, potřeboval bych poradit, učim se stim ( u toho ).
Používám k tomu Microsoft Visual Basic 2010 Express včerně MySQL pluginu.

Dim penizee As String = "SELECT penize FROM statistiky Where username='" & login.Text & "'"

Potřeboval bych vědět jak udělám aby se mi vypsala hodnota peněz, STAV.
Zkoušel jsem :

Dim penizee As String = "SELECT penize FROM statistiky Where username='" & login.Text & "' and penize='" & penize.Text) & "'"

To nahoře mi došlo že je hloupost, a teď se v tom motám.
Nepotřebuji aby se mi peníze doplnili, ale aby se mi vypsali.
Má to vyhledat v Kolonce 'statistiky' v statistíkách jsou uživatelská jména + peníze.
Uživatelské jméno doplní 'login.Text' ale teď potřebuju aby mi to vypsalo u uživatelského jména ty peníze " ty jsou v druhém sloupečku ".
Zkoušel jsem to hodnotou ToString ale zamotal jsem se dotoho natolik že nevim co dělám.

Předmět Autor Datum
A co se ti nezdá na tom prvním dotazu? Teda kromě toho, že netušíš, co je SQL Injection.
Wikan 20.10.2012 18:59
Wikan
Ja tam zadnou chybu "nevidim", je to naprosto neprustrelne. Priste az neco takoveho uvidis tak premy…
AZOR 20.10.2012 22:05
AZOR
Když vidím, jak spolupracuje na řešení, tak stejně ten program nebude nikdy funkční.
Wikan 20.10.2012 22:08
Wikan
a co nám řiká historie? : Že přesto bude nasazen na produkci :-D - true story bro.
AZOR 20.10.2012 22:12
AZOR
Historie nám naopak říká, že spousta programů, přestože byly dokončené, nikdy v reálu pořádně nasaze…
Wikan 20.10.2012 22:16
Wikan
tak to zijeme oba uplně jinde, já vždycky byl ve firmě, kde to šlo do produkce s vesmírně dlouhým li…
AZOR 20.10.2012 22:22
AZOR
Dlouhý seznam bugů nezanamená, že by ten software byl horší než druhý, ale byl jenom lépe testovaný.
Wikan 20.10.2012 22:25
Wikan
Poradil jsem si, nakonec to mělo být takhle : "SELECT balance FROM iConomy WHERE username='" & log…
Dotazzzz 20.10.2012 22:23
Dotazzzz
Zatím máš jenom text dotazu. Takže se potřebuješ připojit k databázi, ten dotaz do ní poslat, přečís…
Wikan 20.10.2012 22:27
Wikan
Připojení k databázi mam , ( úspěšně ) Ten dotaz do ní poslat (jak je to myšleno) Přečíst výsledek a…
Dotazzzz 20.10.2012 22:28
Dotazzzz
Tak napiš celý kód. Těžko se můžeme napojit na něco, o čem nevíme, jak vypadá.
Wikan 20.10.2012 22:30
Wikan
Imports MySql.Data.MySqlClient Imports System.Data Imports MySql.Data Imports MySql Imports System.D…
Dotazzzz 20.10.2012 22:31
Dotazzzz
Dim penizee = "SELECT balance FROM iConomy WHERE username='" & login.Text & "' LIMIT 0,1" Dim cmd A…
Wikan 20.10.2012 22:41
Wikan
Proc je tam ten LIMIT? (ok, machrujete, protoze my v Oracle nic takového nemáme, ale dost bylo machr…
AZOR 21.10.2012 09:31
AZOR
Oracle nemá limit? A jak se dělá stránkování? Přes window funkce? Jinak samotný limit bez order by m…
Wikan 21.10.2012 11:12
Wikan
:-) Nemá a bude mít. Snad víš "od" které stránky - máš k dispozici hinty a "target" - všechny řádky…
AZOR 21.10.2012 11:41
AZOR
Přes window funkce? Jinak samotný limit bez order by moc smysl nemá, výsledkem může být skoro cokoli…
AZOR 21.10.2012 11:44
AZOR
Mně to říkat nemusíš, já MySQL nepoužívám. A moc nechápu její oblíbenost, když je v mnoha ohledech v… poslední
Wikan 21.10.2012 11:50
Wikan

Ja tam zadnou chybu "nevidim", je to naprosto neprustrelne. Priste az neco takoveho uvidis tak premyslej a dojdes k zaveru, ze tam nic takového "neni" a zeptas se na název toho programu :-p jak vidim slovo penize a to SQL vim ze nechci nikoho upozornovat na chybu, radeji chci znat ten program ;-) vis jak ne..

Poradil jsem si, nakonec to mělo být takhle :

 "SELECT balance FROM iConomy WHERE username='" & login.Text & "' LIMIT 0,1"

Teď už jen potřebuji vědět jak to převést do labelu

Jedná se o Microsoft Visual Basic 2010 Express

pripojeno.wel_money.Text = penizee

(to je špatně)
Potřebuju teď nějak aby to přečetlo ten řádek a dosadilo do labelu.

Imports MySql.Data.MySqlClient
Imports System.Data
Imports MySql.Data
Imports MySql
Imports System.Data.SqlClient
Imports System.Text
Imports System.Security.Cryptography
Imports FreeLance.pripojeno

Public Class Prihlasit
    Function getMD5Salt(ByVal strToHash As String) As String
        Dim conn As New MySqlConnection()
        Dim cmd As New MySqlCommand()

        conn.ConnectionString = "(tajný)"
        Try
            conn.Open()

        Catch myerror As MySqlException
            MessageBox.Show("Error Connecting to Database: " & myerror.Message)
        End Try

        Dim strText As String = "SELECT password FROM OnlineLance_Players WHERE password='"
        Dim salt As String = "SELECT username FROM OnlineLance_Players Where username='" & login.Text
        Dim penizee As String = "SELECT balance FROM iConomy WHERE username='" & login.Text & "' LIMIT 0,1"
        Dim bytHashedData As Byte()
        Dim encoder As New UTF8Encoding()
        Dim md5Hasher As New MD5CryptoServiceProvider

        Dim passwordBytes As Byte() = encoder.GetBytes(strText)
        Dim saltBytes As Byte() = encoder.GetBytes(salt)

        Dim passwordAndSaltBytes As Byte() = _
        New Byte(passwordBytes.Length + saltBytes.Length - 1) {}

        For i As Integer = 0 To passwordBytes.Length - 1
            passwordAndSaltBytes(i) = passwordBytes(i)
        Next

        For i As Integer = 0 To saltBytes.Length - 1
            passwordAndSaltBytes(i + passwordBytes.Length) = saltBytes(i)
        Next

        bytHashedData = md5Hasher.ComputeHash(passwordAndSaltBytes)

        Dim hashValue As String
        hashValue = Convert.ToBase64String(bytHashedData)

        Return hashValue

    End Function

    Function getMD5Hash(ByVal strToHash As String) As String

        Dim md5Obj As New MD5CryptoServiceProvider

        Dim bytesToHash() As Byte = System.Text.Encoding.ASCII.GetBytes(strToHash)
        bytesToHash = md5Obj.ComputeHash(bytesToHash)
        Dim strResult As String = ""
        For Each b As Byte In bytesToHash
            strResult += b.ToString("x2")
        Next
        Return strResult

    End Function

    Private Sub btn_login_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_login.Click
        Dim conn As MySqlConnection
        conn = New MySqlConnection()
        conn.ConnectionString = "(tajný)"
        Try
            conn.Open()
        Catch myerror As MySqlException
            MessageBox.Show("Chyba při připojování k databázi.: " & myerror.Message)
        End Try
        Dim myAdapter As New MySqlDataAdapter
        Dim salt As String = "SELECT username FROM OnlineLance_Players Where username='" & login.Text
        Dim sqlquery = "SELECT username, password FROM OnlineLance_Players Where username='" & login.Text & "' and password='" & getMD5Hash(password.Text) & "'"
        Dim penizee = "SELECT balance FROM iConomy WHERE username='" & login.Text & "' LIMIT 0,1"
        Dim cmd As New MySqlCommand()
        cmd.Connection = conn
        cmd.CommandText = sqlquery
        myAdapter.SelectCommand = cmd
        Dim myData As MySqlDataReader
        myData = cmd.ExecuteReader()
        If myData.HasRows = 0 Then
            MessageBox.Show("Špatné Údaje !", "Jejda...", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else
            Dim frm1 = New pripojeno
            pripojeno.wel_money.Text = penizee
            pripojeno.Show()
            Me.Hide()
        End If
    End Sub


End Class

Proc je tam ten LIMIT? (ok, machrujete, protoze my v Oracle nic takového nemáme, ale dost bylo machrování v Oracle 12c v roce 2013 BUDE :-p i autoinkrement 8-) ). Kdyz tam ma mit na loginu nějaký constraint, pokud neni a bude tam limit - tak to nespadne (a mělo by), ze je tam něco špatně nebo se useři pořežou mezi sebou. Vo pacnem pripade to potlaci obrovskou chybu.

:-) Nemá a bude mít. Snad víš "od" které stránky - máš k dispozici hinty a "target" - všechny řádky (podle velikosti ale dejmetomu fullscan pro celou tabulku) a hint ALL_ROWS a nebo (ty první tak rychle jak je to možné ASAP a podle indexu) a hint FIRST_ROWS a pak nějaké fetchování kolik vlastně záznamu chceš.

select * from tabulka order by sloupec_a; // seřadí všechny záznamy a vrátí až to bude celé hotové
select /*+ FIRST_ROWS */ from tabulka order by sloupec_a; // vyhodí asap seřazené řádky z indexu a bleje výsledek hned jak ho má. a ty si pak fetchnes kolik chces a zbytek uz po nem neches.

FIRST_ROWS -- psat nemusis, muze to byt na urovni session, ci databáz napsané, ze je to interaktivni aplikace a ze pozadujes vracet radky jak nejrychleji je to mozne. By default je to ALL_ROWS - pozadujes vsechny radky a je ti jedno kdy je dostanes, chces maximalni propustnost, to je optimalizační target pro oracle - pro warhouses a batche. Drive existoval FIRST_ROWS(n), kde n je poct radku, ktere chces optimalizovat pro interaktvni fetchovani, zbytek byl pro batch.

To bylo z pohledu nejakeho rozumneho behu, jinak limit taky zvládám:

select ((select * from tabulka order by x) where rownum<100
minus
select ((select * from tabulka order by x) where rownum<90

tohle udělá select * from tabulka order by x limit 90,100

Zalezi na indexu, velikosti a co o tom vis. Odectem mnozin co jsem ukázal to taky zvládneš. Obecně si to muzes vynutit (nevim jak interně dělá LIMIT mysql) stejně jako to dělá mysql, tech moznosti jak dosáhnout výsledku LIMIT 90,100.

Přes window funkce? Jinak samotný limit bez order by moc smysl nemá, výsledkem může být skoro cokoliv.

Ano výsledkem muže mít skoro cokoliv. Libi se mi tva věta, protože z ni plyne to co bych od Oracle čekal: NEDOVOLÍ KLAUZULI LIMIT POKUD NEBUDE ORDER BY. To bych od oracle totiž čekal. Ne jako agregační funkce, která nemá smysl a MYSQL ji povoluje, ačkoliv Oracle končí vybovou chybou: skupinová funkce, která neni jednskupinová (nebo tak nějak). MYSQL vrací chybný a náhodný výsledek.

Zpět do poradny Odpovědět na původní otázku Nahoru