Премини към съдържанието
D101149

Прочитане и извеждане на данни от MySQL таблица

Препоръчан отговор


Здравейте! Накратко работя над една програма работеща с протокола InSim, който пък от своя страна осигурява връзкам между програмата и игра с коли за коята става на въпрос. InSim позволява да правя връзка с играта и да изпращам и получавам пакети от данни. Протоколът InSim описва как всеки от тези пакети е форматиран и всеки език за програмиране, който може да създаде мрежова връзка и да изпрати и получи низове от двоични данни, може да се свърже с него.

Накратко за това става на въпрос. Направил съм програмата да работи с SQL Database обаче се затруднявам в извеждане на два реда например:
В SQL таблица на име: Cars има 2 автомобила на името на един играч, например:
CarID|Player|Car|
1       |Ivan |BMW|
2      |Ivan   |Audi|
Когато тръгна да ги извеждам с командата ми излиза само първият ред. само първата кола, втората не мога да я изкарам.. На какво може да се дължи проблема, нещо не го правя както трябва..

Реално в играта получвам този надпис: Car:BMW Car Owner: Ivan, нямам още един ред отдолу под този да пише и другата кола... 

А целият код е този:

MySqlConnection mysqlvruzka = new MySqlConnection("Server=localhost;Database=IGRI;Uid=root;Pwd='nqmaparola678900';");
                                            mysqlbaglan.Open();
                                            MySqlCommand mda = new MySqlCommand("SELECT * FROM cars WHERE Car_Owner='" + Conn.Username + "' UNION SELECT * FROM cars WHERE Car_Owner='" + Conn.Username + "'", mysqlvruzka);
                                            MySqlDataReader mdr = mda.ExecuteReader();
                                                if (mdr.Read())
                                                {
                                                    Conn.CarOwner = mdr[1].ToString();
                                                    Conn.CarType = mdr[2].ToString();
                                                    mysqlvruzka.Close();
                                                    byte LocationX = 70;
                                                    byte ButtonID1 = 120;
                                                insim.Send("Car:" + Conn.CarType + "Car Owner:" + Conn.CarOwner, H = 6, W = 85, T = LocationX, L = 46, ClickID = ButtonID1,);
                                                   LocationX += 4;
                                                    ButtonID1++;
                                                }

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 1 час, D101149 написа:

Здравейте! Накратко работя над една програма работеща с протокола InSim, който пък от своя страна осигурява връзкам между програмата и игра с коли за коята става на въпрос. InSim позволява да правя връзка с играта и да изпращам и получавам пакети от данни. Протоколът InSim описва как всеки от тези пакети е форматиран и всеки език за програмиране, който може да създаде мрежова връзка и да изпрати и получи низове от двоични данни, може да се свърже с него.

Накратко за това става на въпрос. Направил съм програмата да работи с SQL Database обаче се затруднявам в извеждане на два реда например:
В SQL таблица на име: Cars има 2 автомобила на името на един играч, например:
CarID|Player|Car|
1       |Ivan |BMW|
2      |Ivan   |Audi|
Когато тръгна да ги извеждам с командата ми излиза само първият ред. само първата кола, втората не мога да я изкарам.. На какво може да се дължи проблема, нещо не го правя както трябва..

Реално в играта получвам този надпис: Car:BMW Car Owner: Ivan, нямам още един ред отдолу под този да пише и другата кола... 

А целият код е този:


MySqlConnection mysqlvruzka = new MySqlConnection("Server=localhost;Database=IGRI;Uid=root;Pwd='nqmaparola678900';");
                                            mysqlbaglan.Open();
                                            MySqlCommand mda = new MySqlCommand("SELECT * FROM cars WHERE Car_Owner='" + Conn.Username + "' UNION SELECT * FROM cars WHERE Car_Owner='" + Conn.Username + "'", mysqlvruzka);
                                            MySqlDataReader mdr = mda.ExecuteReader();
                                                if (mdr.Read())
                                                {
                                                    Conn.CarOwner = mdr[1].ToString();
                                                    Conn.CarType = mdr[2].ToString();
                                                    mysqlvruzka.Close();
                                                    byte LocationX = 70;
                                                    byte ButtonID1 = 120;
                                                insim.Send("Car:" + Conn.CarType + "Car Owner:" + Conn.CarOwner, H = 6, W = 85, T = LocationX, L = 46, ClickID = ButtonID1,);
                                                   LocationX += 4;
                                                    ButtonID1++;
                                                }

 

Здравейте !

Опитайте се следното: 

 if (mdr.Read())

да го замените с 

 while(mdr.Read())

Принципно, когато искате да изчетете всички данни от курсор, Ви е необходим поне един цикъл, който да обикаля през редовете на записите, получени от RDBMS-а на MySQL или която и да е друга база.

Понякога се налага и втори (вътрешен) цикъл, с който освен редовете, да обиколите и колоните, но в този пример, виждам, че вече получавате масив от данни, представляващ един кортеж/запис от резултатната таблица.

Поздрави !

P.S.

Следният ред:

mysqlvruzka.Close();

го изкарайте извън тялото на if/while-а - затварянето на връзката трябва да се направи, след като всичко от курсора се изчете - в противен случай, ако се опитате да изчетете курсор от затворена вече връзка, може да получите Exception.

Редактирано от soundtracker
Typos (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 3 часа, soundtracker написа:

....

Здравейте! Адски много ви благодаря за помощта, но сега ми извежда само вторият ред: Car: Audi Car Owner: Ivan 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Някой някакви идеи? Сега само вторият ред се вижда.. Реално не взема стойностите от 1 ред или поне не мога да го накарам... 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 1 час, D101149 написа:

Някой някакви идеи? Сега само вторият ред се вижда.. Реално не взема стойностите от 1 ред или поне не мога да го накарам... 

В края на данните, които се извеждат добави символа за нов ред. Възможно е да се извеждат на един и същи ред и да се припокриват.


Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 10 минути, TRN написа:

В края на данните, които се извеждат добави символа за нов ред. Възможно е да се извеждат на един и същи ред и да се припокриват.

Здрайвете! Благодаря за коментара ви, но мисля че протокола не поддържа този метод за нов ред. Точно това беше идеята на 

byte LocationX = 70;
                                                    byte ButtonID1 = 120;

защото 

 insim.Send("Car:" + Conn.CarType + "Car Owner:" + Conn.CarOwner, H = 6, W = 85, T = LocationX, L = 46, ClickID = ButtonID1,);
                                                   LocationX += 4;
                                                    ButtonID1++;

работи на друг принцип ако не се лъжа. LocationX = 70 (височината на написаното в кординатната система) и при всеки един ред добавя += 4; а всеки такъв ред си има и ClickID което е +1 на всеки еедин нов ред. Мисля че проблема е другаде :( 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Стигна до някъде, кодът е същият, но премахнах Union-а 

"SELECT * FROM cars WHERE Car_Owner='" + Conn.Username + "'";

го направих, но продължава да ми извежда последата кола добавена от мен например:

дори и в налиничието на 3 коли или може и повече винаги получвам последната кола. Това означава че на снимката може да видите има на първи ред UF1, на втори XFG и на трети XRG, до преди да закупя XRG Получавах надпис XFG, но след като закупих XRG вече само нея виждам. Явно чете последната добавена кола все.. 

TWtvPGSh.png

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 3 часа, D101149 написа:

дори и в налиничието на 3 коли или може и повече винаги получвам последната кола

Само предположение, дали след извикване на заявката курсора не се позиционира на последния запис. Ако има възможност преди да се направи цикъла за извеждане да се позиционира на първия запис.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Добре де тази щуротия на какъв език е?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 10 часа, mr mcwolf написа:

C#

Той няма ли си собствени протоколи за четене на бази данни а се мъчи с това?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 9 часа, petie1 написа:

Той няма ли си собствени протоколи за четене на бази данни а се мъчи с това?

Инсим е протокол само за връзка между играта и програмата, написана на c#. Всичко друго си е просто програма написана на c# :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 2 минути, D101149 написа:

Инсим е протокол само за връзка между играта и програмата, написана на c#. Всичко друго си е просто програма написана на c# :)

А пробва ли съветите

https://en.lfsmanual.net/wiki/InSim#Receiving_Data

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.