Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno C# práce s class

Zdravím všechny. Mám dotaz ke classům v C#. Pracuji na kódu v ASP.NET na vyčítání dat z Excelovské xls tabulky. Dostal jsem se do fáze, kdy mám tohle:

    public class doba
    {
        public static string getText()
        {
            String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + (HttpContext.Current.Server.MapPath("data.xls")) + ";Extended Properties=\"Excel 8.0;HDR=No\"";
            OleDbConnection objConn = new OleDbConnection(sConnectionString);

            objConn.Open();

            OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [List1$B7:B7]", objConn);
            object nazev = objCmdSelect.ExecuteScalar();

            return nazev.ToString();

            objConn.Close();

        }
    }

Toto lze načíst klasicky takto:

this.Label1.Text = Objekt.doba.getText();

Problém spočívá v tom, že bych potřeboval načíst data do tabulky, tedy např. A1:C5. A to mi bohužel tímto způsobem nefunguje. Tu tabulku potřebuji dokonce složit tak, že její zápatí je zvlášť a záhlaví též. Jak na to?

Předmět Autor Datum
Keď chceš celý riadok a nie len jednu hodnotu, tak použiješ objCmdSelect.ExecuteReader alebo cez Dat…
los 24.04.2012 20:50
los
Odkazovat na MSDN je zbytečné. Už je to několikátý "stejný" problém a nepřijde mi, že by projevil ně…
Wikan 24.04.2012 21:01
Wikan
Panebože já mám kód na vyčítání do tabulky hotov a plně funkční, jen mi nefunguje v classu... To je…
Isair 24.04.2012 21:59
Isair
Co znamená nefunguje?
Wikan 24.04.2012 22:00
Wikan
Problém je nejspíš v tomhle: public static string getText()...asi tam musí být něco co bude jako dat…
Isair 24.04.2012 22:01
Isair
V php by celý problém zabral chvíli, to asp je opravdu komplikované...
Isair 24.04.2012 22:02
Isair
Ako vtip dobré. ;-) Tak to sprav v PHP, keď si myslíš, že je to jednoduchšie.
los 24.04.2012 22:14
los
Jen se snažím zjistit, jak to udělat. Pokud radit nechcete tak neraďte. Chybí mi poslední kus a sice…
Isair 24.04.2012 22:18
Isair
Pokud vím, tak už jsi tu jednou měl kód s DataTable. Proč nepoužiješ ten?
Wikan 24.04.2012 22:19
Wikan
Kód který mi funguje na určitý výběr mi nefunguje v classu... já si to pak potřebuji vytáhnout do Gr…
Isair 24.04.2012 22:27
Isair
Tak znova. Co znamená nefunguje?
Wikan 24.04.2012 22:28
Wikan
Naprosto funkční kód: using System; using System.Collections.Generic; using System.Linq; using Syst…
Isair 24.04.2012 22:44
Isair
V tej metóde getText vrátiš napr. objDataset1.Tables[0].DefaultView (na poslednom riadku pomocou prí…
los 24.04.2012 23:05
los
Aj by som poradil, ak by si špecifikoval svoj problém ako programátor a nie ako manažér. Keď dáš pro…
los 24.04.2012 22:54
los
Mne vždycky srazí dolu sebevědomí, když vím co všechno Los ví, ale pak jsi vzpomenu že jste na nás d… poslední
AZOR 24.04.2012 23:19
AZOR

Keď chceš celý riadok a nie len jednu hodnotu, tak použiješ objCmdSelect.ExecuteReader alebo cez DataAdapter vytvoríš DataTable - príklady sú na MSDN.

Predpokladám, že ti je jasné, že volanie objConn.Close() sa nikdy nezavolá (píše ti to aj varovanie). Aby si správne uvoľňoval prostriedky, tak by si mal používať using. Taktiež nedodržiavaš štandardné názvové konvencie - meno triedy by malo začínať veľkým písmenom, malé prvé písmeno názvu metód patrí do Javy a nie do C#, maďarská notácia sa tiež už nenosí.

Jen se snažím zjistit, jak to udělat. Pokud radit nechcete tak neraďte. Chybí mi poslední kus a sice to, co píši v duótazu. Kód co tam mám nefunguje, pokud dám nějaký rozsah - např A1:A2, protože to logicky již není text. Dále také nevím, jak to pak načíst...

Naprosto funkční kód:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OleDb;
using System.Data;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
            "Data Source=" + Server.MapPath("data.xls") + ";" +
            "Extended Properties=Excel 8.0;";

        OleDbConnection objConn = new OleDbConnection(sConnectionString);

        
        objConn.Open();
		OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [List1$A1:B7]", objConn);
		object nazev = objCmdSelect.ExecuteScalar();
        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();

        objAdapter1.SelectCommand = objCmdSelect;

        DataSet objDataset1 = new DataSet();

        objAdapter1.Fill(objDataset1, "XLData");

        GridView1.DataSource = objDataset1.Tables[0].DefaultView;
        GridView1.DataBind();

        objConn.Close();
    }
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
}

Jak ho tedy mám rozchodit zde?

    public class vyber
    {
        public static string getText()
        {
            String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                        "Data Source=" + Server.MapPath("data.xls") + ";" +
                        "Extended Properties=Excel 8.0;";

            OleDbConnection objConn = new OleDbConnection(sConnectionString);


            objConn.Open();
            OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [List1$A1:B7]", objConn);
            object nazev = objCmdSelect.ExecuteScalar();
            OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();

            objAdapter1.SelectCommand = objCmdSelect;

            DataSet objDataset1 = new DataSet();

            objAdapter1.Fill(objDataset1, "XLData");

            GridView1.DataSource = objDataset1.Tables[0].DefaultView;
            GridView1.DataBind();

            objConn.Close();

        }
    }

Respoktive co returnovat? a jak to pak vyčíst do togo GridViewu? Nepředpokládám že to lze v tom classu jak to tu mám na ukázku

V tej metóde getText vrátiš napr. objDataset1.Tables[0].DefaultView (na poslednom riadku pomocou príkazu return). Tie 2 riadky s nastavením GridView1.DataSource a zavolaním metódy DataBind vymažeš. Návratový typ metódy upravíš na DataView.

V Page_Load budeš mať potom len tie 2 vymazané riadky z predchádzajúceho kroku. Pri nastavení DataSource využiješ tú statickú metódu getText.

Aj by som poradil, ak by si špecifikoval svoj problém ako programátor a nie ako manažér. Keď dáš program skompilovať, napíše ti presne, v čom je problém. Ak ho nevieš vyriešiť sám, tak to chybové hlásenie skopíruješ a dáš ho sem. Dopíšeš nejaký vysvetľujúci text, napr. že na ktorom riadku je tá chyba a určite sa nájde niekto, kto ti napíše, ako to opraviť.

Píšeš, že panebože kód na načítanie tabuľky máš hotový a plne funkčný. Prečo si potom v príklade použil kód na načítanie skaláru? Veď panebože keď chceš načítať tabuľku, tak použiješ kód na načítanie tabuľky. A áno, návratovou hodnotou potom nebude string, ale napr. DataTable.

Osobne by som použil DataReader, konkrétne tú metódu ExecuteReader, o ktorej som písal. V cykle by som si prečítané dáta naplnil do nejakých pomocných objektov. Ale to som tuším už raz písal aj s ukážkou. Ale keď už si sa dopracoval k funkčnému kódu pre načítanie do DataTable, tak už to radšej neprerábaj, lebo by si na tom stratil ďalší týždeň.

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