Síða 1 af 1

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

Sent: Þri 02. Jan 2007 07:01
af gnarr
É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!!! ");
            }

Sent: Þri 02. Jan 2007 17:42
af tms
Þú 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?

Sent: Þri 02. Jan 2007 18:00
af Voffinn
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?

Sent: Þri 02. Jan 2007 20:02
af tms
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.

Sent: Mið 03. Jan 2007 05:38
af gnarr
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ð.

Sent: Mið 03. Jan 2007 06:19
af tms
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

Sent: Mið 03. Jan 2007 09:56
af gnarr
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 :)

Sent: Fim 11. Jan 2007 14:44
af Stutturdreki
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.

Sent: Fim 11. Jan 2007 19:54
af Stebet
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.