C# + MySQL : Object reference not set to an instance of an o

Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

C# + MySQL : Object reference not set to an instance of an o

Pósturaf gnarr » Þri 02. Jan 2007 07:01

Ég er í vandræðum með að fá þetta til að virka hjá mér. Fer alltaf beint í catch með "System.NullReferenceException: Object reference not set to an sintance of an object."
Ég veit ekkert hvað ég er að gera vitlaust, en sami kóði virkar í console application ef ég set "Console.WriteLine" í staðin fyrir "lstGogn.Items.Add" og "MessageBox.Show".

Kóði: Velja allt

try
            {
                MySQLConnection con;
                con = new MySQLConnection(new MySQLConnectionString("localhost",
                                                                     "MySql",
                                                                     "******",
                                                                     "******").AsString);
                con.Open();

                string sql = "SELECT * FROM test1";

                MySQLCommand cmd = new MySQLCommand(sql, con);

                MySQLDataReader reader = cmd.ExecuteReaderEx();
                           
                while (reader.Read())
                {
                    lstGogn.Items.Add(reader[0].ToString());
                }

                reader.Close();
                con.Close();
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.ToString(),"Error!!! ");
            }


"Give what you can, take what you need."

Skjámynd

tms
Gúrú
Póstar: 529
Skráði sig: Mán 04. Ágú 2003 00:56
Reputation: 0
Hafðu samband:
Staða: Ótengdur

Pósturaf tms » Þri 02. Jan 2007 17:42

Þú labbar beint í gildruna sem er sú að setja hluti í try/catch blokk sem eiga alls ekki að vera þar. Það eina sem ætti að vera í try er þegar þú tengist serverinum og keyrir SQL skipunina.

Edit: ertu viss um að reader[0].ToString() sé gilt?



Skjámynd

Voffinn
Vaktari
Póstar: 2249
Skráði sig: Sun 22. Des 2002 17:41
Reputation: 0
Staða: Ótengdur

Pósturaf Voffinn » Þri 02. Jan 2007 18:00

tms skrifaði:Þú labbar beint í gildruna sem er sú að setja hluti í try/catch blokk sem eiga alls ekki að vera þar. Það eina sem ætti að vera í try er þegar þú tengist serverinum og keyrir SQL skipunina.

Edit: ertu viss um að reader[0].ToString() sé gilt?


Og hver er ástæðan fyrir því að þú vilt ekki hafa neitt annað í try blokkinni?



Skjámynd

tms
Gúrú
Póstar: 529
Skráði sig: Mán 04. Ágú 2003 00:56
Reputation: 0
Hafðu samband:
Staða: Ótengdur

Pósturaf tms » Þri 02. Jan 2007 20:02

Voffinn skrifaði:
tms skrifaði:Þú labbar beint í gildruna sem er sú að setja hluti í try/catch blokk sem eiga alls ekki að vera þar. Það eina sem ætti að vera í try er þegar þú tengist serverinum og keyrir SQL skipunina.

Edit: ertu viss um að reader[0].ToString() sé gilt?


Og hver er ástæðan fyrir því að þú vilt ekki hafa neitt annað í try blokkinni?


Vegna þess að
a) þegar maður gerir klaufavillur er þetta bara fyrir manni á mepan maður er að hanna forritið
b) ef forritið á að tengjast mysql gagnagrunni en getur ekki gert það, þá er tilgangur forritsins farinn (ef þú ert ekki með backup plan). Þá er mun betra að koma með gagnlega útskýringu á af hverju forritið gat ekki gert það sem það átti að gera frekar en "NullPointerException" eitthverstaðar í kóðanum.



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 03. Jan 2007 05:38

Betra?

Kóði: Velja allt

MySQLConnection con;
            con = new MySQLConnection(new MySQLConnectionString("localhost",
                                                                 "MySql",
                                                                 "******",
                                                                 "******").AsString);
            string sql = "SELECT * FROM test1";

            try
            {
                con.Open();
                MySQLCommand cmd = new MySQLCommand(sql, con);

                MySQLDataReader reader = cmd.ExecuteReaderEx();
                           
                while (reader.Read())
                {
                    lstGogn.Items.Add(reader[0].ToString());
                }
 
                reader.Close();
                con.Close();
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.ToString(),"Error!!! ");
            }


Skilar enþá nákvæmlega sömu villu :(

tms skrifaði:Edit: ertu viss um að reader[0].ToString() sé gilt?


Ég er ekki viss um að ég skilji spurninguna rétt. En

Kóði: Velja allt

Console.WriteLine(reader[0].ToString());
skilar gögnunum rétt.. ef það er það sem þú varst að spurja að.


"Give what you can, take what you need."

Skjámynd

tms
Gúrú
Póstar: 529
Skráði sig: Mán 04. Ágú 2003 00:56
Reputation: 0
Hafðu samband:
Staða: Ótengdur

Pósturaf tms » Mið 03. Jan 2007 06:19

Nú þá hlytur einfaldlega að vera eitthvað vitlaust við lstGogn.Items.Add(...);
Veit 0 um windows forms í C#, mæli með að þú kíkir bara í referencið hvort þú sért að gera rétt :P



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 03. Jan 2007 09:56

jæja.. fann hver villan var. ég var að láta forritið nota listboxið áður en það var búið að teikna það á formið.. :lol: Þurfti aðeins að breyta röðinni á kóðanum og allt virkar fínt :)


"Give what you can, take what you need."

Skjámynd

Stutturdreki
Of mikill frítími
Póstar: 1702
Skráði sig: Þri 27. Apr 2004 14:03
Reputation: 38
Staða: Ótengdur

Pósturaf Stutturdreki » Fim 11. Jan 2007 14:44

Oh.. loksins þegar einhver spyr um forritunar hjálp hérna inni missi ég af því. :(

En anyroad.. þú getur alveg populatað List dæmið áður en það er teiknað, þarft bara að 'new-a' hann fyrst.

Og varðandi kóða innann í try-catch þá er það talin góð venja að hafa sem minnstan kóða þar.

Svo má líka benda á að hafa fleirri try-catch blokkir, td. sér utan um open() og/eða grípa fleirri villur en bara generic Exception til að hafa nákvæmari villumeðhöndlun.

Btw.. svo er góð regla að gera 'close()' í finally {..} blok. Ef þú gerir Try, svo open, og svo kemur villan á eftir open þá er tenginunni aldrei lokað.. amk. ekki fyrr en löngu seinna. Það sem er inn í finally er alltaf gert, hvort sem try blokkinn kastaði villu eða ekki.




Stebet
spjallið.is
Póstar: 424
Skráði sig: Fös 25. Jún 2004 22:15
Reputation: 0
Staða: Ótengdur

Pósturaf Stebet » Fim 11. Jan 2007 19:54

Ennþá betra en að nota "finally" á eftir catch er að nota using() utan um allt sem útfærir IDisposable.

t.d.

Kóði: Velja allt

using(SqlConnection connection = new SqlConnection("connectionstringofdoom"))
{
    /* böns af kóða */
}

þá geturu verið viss um að um leið og kóðinn fer út úr "scopeinu" á using setningunni er kalla á .Dispose(). Ef um er að ræða SqlConnection er henni semsagt sjálfkrafa lokað, e fþú er tað nota Bitmap eða Image þá er GDI hlutunum sjálfkrafa skilað o.s.frv. Einstaklega þægileg leið til að vera alltaf viss um að resourcem sem IDisposable hlutir nota sér skilað.

Þetta hreinsar alltaf IDisposable hlutinn upp, sama þó forritið hafi rekist á Exception í miðju "using" scopeinu.