<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Muráti Ákos honlapja &#187; ODP .NET</title>
	<atom:link href="http://murati.hu/tag/odp-net/feed/" rel="self" type="application/rss+xml" />
	<link>http://murati.hu</link>
	<description>Muráti Ákos személyes és szakmai oldala</description>
	<lastBuildDate>Wed, 11 Aug 2010 05:08:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OracleDataReader és DataGridView</title>
		<link>http://murati.hu/c6_oracle/odp-datareader-es-datagridview/</link>
		<comments>http://murati.hu/c6_oracle/odp-datareader-es-datagridview/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 07:16:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Oktatás]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[ODP .NET]]></category>

		<guid isPermaLink="false">http://murati.hu/?p=400</guid>
		<description><![CDATA[Gyakran felmerül a kérdés, hogy hogyan tudunk legegyszerűbben példányosítani objektumokat vagy kollekciókat egy adatbázislekérdezés eredményeiből és hogyan tudjuk ezeket táblázatosan megjeleníteni. A következő azt fogom bemutatni, hogy miként lehet egy tetszőleges query eredményét .NET objektumok kollekciójává tenni és hogyan jelenítsük meg azokat egy DataGridView controllal.
ODP driverrel lekérdezéseink eredményét, ahogy azt már előző bejegyzésemben is láthattuk, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a rel="lightbox[]" href="http://murati.hu/gallery/oracle_odp_samples/odp_winform_12.png"><img class="ngg-singlepic ngg-left" src="http://murati.hu/gallery/oracle_odp_samples/thumbs/thumbs_odp_winform_12.png" alt="ODP + WinForms Datagrid" /></a>Gyakran felmerül a kérdés, hogy hogyan tudunk legegyszerűbben példányosítani objektumokat vagy kollekciókat egy adatbázislekérdezés eredményeiből és hogyan tudjuk ezeket táblázatosan megjeleníteni. A következő azt fogom bemutatni, hogy miként lehet egy tetszőleges query eredményét .NET objektumok kollekciójává tenni és hogyan jelenítsük meg azokat egy DataGridView controllal.<span id="more-400"></span></p>
<p style="text-align: justify;">ODP driverrel lekérdezéseink eredményét, ahogy azt már előző bejegyzésemben is láthattuk, az <strong>OracleDataReader </strong>objektummal olvashatjuk végig. Ennek az olvasás utáni aktuális példánya tartalmazza az eredménymutató alatti éppen olvasott rekord mezőit. Látható, hogy egy eredménysor mezőinek átadásának legegyszerűbb módja, ha a példányosítani kívánt osztály konstruktorának  átadjuk az OracleDataReader aktuális példányát.</p>
<p style="text-align: justify;">Tegyük fel, hogy lekérdezésünk Lokáció adatokat fog eredményül adni, melynek első oszlopa egy number típusú ID, a többi pedig valamilyen szöveges érték lesz, amely tartalmazza az érintett rekord címét (STREET_ADDRESS), irányítószámát (POSTAL_CODE), stb..</p>
<p style="text-align: justify;">Ennek szellemében készítsük el  osztályunkat, amely prezentálni fogja eredményhalmazunk egy ilyen rekordját, melynek konstruktorra, épp a OracleDataReader típusú objektumot vesz át, amely kitölti az osztály megfelelő változóit az aktuális rekord oszlopai alapján. Fontos, hogy az egyes oszlopok értékeinek tárolásához használjunk publikus Property-ket, akár csak olvasható módon is. Ezek alkalmazása azért lényeges, mert e változók fogják jelölni a DataGridView táblázatunk egyes oszlopait. A rekord reprezentán osztály ezek után valahogy így nézhet ki:</p>
<pre>using System;
using Oracle.DataAccess.Client;

namespace odp_test_12
{
 class MyLocation
 {
 //Publikus property-k a DataGrid oszlopok megadásához
 public int ID { get; set; }
 public String Street { get; set; }
 public String PostalCode { get; set; }
 public String City { get; set; }
 public String State { get; set; }

 /* Téynleges LOCATIONS tábla Oszlopok:

 LOCATION_ID,
 STREET_ADDRESS,
 POSTAL_CODE,
 CITY,
 STATE_PROVINCE,
 COUNTRY_ID
 */

 //Konstruktor az adatok átvételére
 public MyLocation(OracleDataReader r)
 {
 //Indexelés a C-ben megszokottakhoz híven 0-tól kezdődik
 ID = r.GetInt32(0);
 Street = r["STREET_ADDRESS"].ToString();
 PostalCode = r["POSTAL_CODE"].ToString();
 City = r[3].ToString();
 State = r["STATE_PROVINCE"].ToString();
 }
 }
}</pre>
<p style="text-align: justify;">Ezután készítsük el Windows Formunkat. Vegyük fel a DataGridView objektumot ablakunkra, amit nevezzünk el dg_results-nak és tegyünk fel 3 gombot is a formra, melyek kötül az egyik a kapcsolat felépítéséért, a másik annak lezárásáért a harmadik pedig lekérdezésünk futtatásáért és az eredményhalmaz megjelenítéséért felel a dg_results vezérlőnkben.</p>
<p style="text-align: justify;">Kódolásnál az <strong>OracleConnection <em>conn </em></strong>változónkat deklarájuk Formunk osztályában globális objektumnak, hogy azt minden vezérlőből és eseményből elérhessük:</p>
<pre>public partial class Form1 : Form
{
OracleConnection conn;</pre>
<p>Ezután nincs más, mint elkészíteni ODP parancsainkat  az egyes  gomb oklenyomására. Dupla klikk a formon lévő gombra és írjuk meg a szokásos kapcslat-parancs-eredményolvasás kódrészleteket.</p>
<h4>Kapcsolódás gomb</h4>
<pre>private void bt_connect_Click(object sender, EventArgs e)
 {
 try
 {
 //Kapcsolat példányosítása a ConnectionString alapján:
 conn = new OracleConnection();
 conn.ConnectionString = tx_connstr.Text;

 //Kapcsolat megnyitása
 conn.Open();
 MessageBox.Show("Kapcsolat sikeresen felépítve:" + conn.ServiceName);

 }
 catch (Exception ex)
 {
 MessageBox.Show(ex.Message);
 }
 }
</pre>
<h4>Lekapcsolódás gomb</h4>
<pre>private void button2_Click(object sender, EventArgs e)
 {
 try
 {
 //Kapcsolat lezárása
 conn.Dispose();
 MessageBox.Show("Kapcsolat sikeresen lezárva:");
 }
 catch (Exception ex)
 {
 MessageBox.Show(ex.Message);
 }
 }</pre>
<h4>Lekérdezés futtatása</h4>
<p style="text-align: justify;">Ebben az esetben a már jól megszokott lekérdezés futtatáson kívül példányosítanunk kell az eredményhalmazt tároló listánkat is. Erre a célra használható a .NET ArrayList osztálya, mely a System.Collections névtérben található. Gombnyomásunk eseményének első sorába írjuk is be: ArrayList results = new ArrayList();</p>
<p style="text-align: justify;">Az eredményhalmaz végigolvasásakor szükségünk van az aktuális rekordok .NET példányaira, amiket ott helyben pédányosítunk az OracleDataReader instanciánkkal, majd beteszük azt az előbb kreált eredményhalmazba:</p>
<pre>MyLocation l = new MyLocation(dr);
results.Add(l);</pre>
<p style="text-align: justify;">Ezek után, ha minden jól ment az eredményhalmazunk a results ArrayListben található, melyek sorai az általun létrehozott MyLocation osztály egy-egy példánya. Innentől nincs más dolgunk, minthogy átadjuk ezt a változót a DataGridView-nak megjelenítésre az alábbi egyszerű utasítással:<br />
 dg_results.DataSource = results;</p>
<p style="text-align: justify;">Ennyi. A lekérdezés gomb futtatása ezek alapján valahogy így nézhet ki:</p>
<pre>private void bt_execute_Click(object sender, EventArgs e)
 {
 try
 {
 //Eredményhalmaz eltárolása
 ArrayList results = new ArrayList();

 //Kapcsolat, ha minden jól ment, már fel van építve
 //Új SQL utasítás kreálása
 OracleCommand cmd = new OracleCommand();
 cmd.Connection = conn;
 cmd.CommandText = tx_sqlquery.Text;

 //Szabad szöveges
 cmd.CommandType = CommandType.Text;

 //Eredményhalmaz kiolvasása DataReader-rel elöltesztelős ciklussal
 OracleDataReader dr = cmd.ExecuteReader();
 while (dr.Read())
 {
 MyLocation l = new MyLocation(dr);
 results.Add(l);
 }

 //Eredményhalmaz lezárása
 dr.Dispose();

 //Utasításpéldány felszabadítása
 cmd.Dispose();

 dg_results.DataSource = results;
 MessageBox.Show("Query lefutott: " + results.Count);

 }
 catch (Exception ex)
 {
 MessageBox.Show(ex.Message);
 }
 }</pre>
<p style="text-align: justify;">Ezek után, ha mindent jól csináltunk Connect-álás után és Execute gombok nyomogatására látnunk kell lekérdezésünk eredményét dg_result táblázatunkban valahogy így:</p>
<p>A teljes Visual Studio 2008 projekt letöltéséhez kattins ide:<a href="http://murati.hu/media/odp_test_12.zip">ODP Datagrid Project &#8211; Saját osztállyal</a></p>
]]></content:encoded>
			<wfw:commentRss>http://murati.hu/c6_oracle/odp-datareader-es-datagridview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

