Programové vytvoření Connection. Vytvoření připojení pomocí Server Explorer

Bylo zmíněno jen pár slov, že Poskytovatel
Poskytovatel dat zahrnuje objekt Connection ( Spojení).
V tomto článku se na tento objekt podíváme podrobněji, zjistíme jeho roli v
ADO.NET, základní vlastnosti a metody.
Účel objektu Spojení
podpora fyzické spojení mezi úložištěm dat a aplikací .NET.
Protože, jak již víme, ADO.NET má dva poskytovatele dat a
každý z nich má svou vlastní implementaci objektu Connection, budeme muset
zvažte obě odrůdy.

OLE DB .NET Data Provider zahrnuje OleDbConnection
(jmenný prostor System.Data.OleDB), A SQL Server Data .NET
Poskytovatel, resp. SqlConnection(jmenný prostor
System.Data.SqlClient
). I když rozdíly mezi nimi nejsou tak velké
radikální, měli byste je však mít na paměti při migraci aplikací na
jiné úložiště dat.

Jak již bylo zmíněno dříve, SqlClient pracuje s
ukládání dat přímo, takže při práci s Microsoft SQL Server 7.0 a
výše je vhodnější použít SQL Server .NET Data Provider a SqlConnection,
protože to zajistí, že aplikace běží efektivněji.

Jak vytvořit spojení?

Ti, kteří pracují v interaktivním vývojovém prostředí Visual
Studio .NET si už asi zvyklo, že má velkou sadu
„mistrů“, kteří usnadňují programátorovi práci svým výkonem
zatěžující rutinní práce. Výjimkou není ani tvorba Spojení.

Ti, kteří hlásají askezi .NET Framework (nebo jsou nuceni
spokojte se s tím chtě nechtě), mohou tuto sekci přeskočit a přejít na
následující, který popisuje vytvoření připojení programově.

Vytvoření připojení pomocí Server Explorer

V ceně Visual Studio.NET obsahuje velmi cenný nástroj -
Server Explorer, který umožňuje vytvářet připojení během vývoje
S různé služby, včetně protokolů, front zpráv atd., stejně jako
datových zdrojů, o které máme nyní největší zájem.

Zkusme vytvořit spojení s Server nápovědy Badatel. Pro
Chcete-li to provést, nejprve vytvořte projekt Windows aplikace. Poté se ujistěte, že panel
Server Explorer je k dispozici (pokud ne, můžete jej povolit prostřednictvím nabídky Zobrazit
-> Server Explorer). Vypadá to asi takto:


Stejné tlačítko je dostupné v nabídce Nástroje:


Po kliknutí na tlačítko se zobrazí okno „Vlastnosti komunikace“.
data“, dobře známé těm, kteří již mají zkušenosti s prací v ADO:


Zkusme vytvořit připojení k databázi Northwind, která
dodávané jako příklad s Microsoft Access různé verze a
je pravděpodobně přítomen na drtivé většině počítačů, na kterých
Microsoft Office nainstalován. Postup:


    přejděte na stránku „Poskytovatel dat“;


    vyberte řádek „Microsoft Jet“ ze seznamu „Poskytovatelé OLE DB“.
    4.0 OLE DB Provider"


Poznámka. Microsoft Jet je databázový stroj, který
Microsoft jej používá jako základ pro Access a také jako součást řady dalších
produktů (například pro skladování elektronická korespondence ve výměně
Server). Pomocí Microsoft Jet 4.0 OLE DB Provider můžete získat
přístup k datům uloženým v databázích vytvořených pomocí Accessu.



Kliknutím na tlačítko s třemi tečkami „…“ vyberte celou cestu k
databázový soubor (nebo v případě potřeby zadejte ručně); vypadá na mě takhle
takto: C:\Program Files\Microsoft Office\Office10\Samples\Borey.mdb;


pokud je databáze Northwind ve vašem systému chráněna heslem,
zadejte jej do příslušného pole; pokud chcete heslo pro přístup
databáze byla uložena na místě s jinými daty připojení, nastavte možnost
„Povolit uložení hesla“ (samozřejmě je to nežádoucí, pokud obsah
databáze by neměla být otevřena neoprávněnému přístupu);


    Chcete-li zkontrolovat funkčnost, klikněte na tlačítko „Zkontrolovat“.
    spojení"; pokud je vše provedeno správně, uvidíte výsledek:



Pokud z nějakého důvodu nelze připojení k databázi
být proveden, zobrazí se chybová zpráva podobná následující:


V tomto případě zkontrolujte, zda je zadaná cesta k souboru správná
databáze a možná objasnění hesla;


    pokud byla kontrola připojení k databázi úspěšná,
    klikněte na tlačítko „OK“ v okně „Vlastnosti datového spojení“;


    nové připojení se objeví na panelu Server Explorer s
    Databáze "Borey":



Pomocí Server Explorer můžeme nejen prozkoumávat
struktura tabulek, pohledů, uložených procedur a dalších databázových objektů, ale také
přístup k jejich obsahu. Například, dvojitým kliknutím levé tlačítko myši
na ikoně tabulky se otevře její obsah pro prohlížení a dokonce i úpravy
Prostředí Visual Studio .NET.


    Nyní zbývá pouze vytvořit objekt Connection, který to umožní
    náš program pro navázání spojení s databází Northwind; za to
    přetáhněte ikonu připojení z panelu Server Explorer do podoby našeho
    aplikací.


To je vše pro vytvoření objektu. Spojení
dokončeno! Pod přihláškou se objeví ikona:


Toto je objekt typu System.Data.OleDb.OleDbConnection,
které jsme se snažili získat. V případě potřeby lze název objektu změnit
pomocí panelu vlastností.

Věnujte zvláštní pozornost skutečnosti, že spojení bylo vytvořeno
prostřednictvím Server Explorer, není součástí aktuálního projektu, ale je uložen
spolu s nastavením prostředí Visual Studio .NET. Podle mého názoru má obojí
pozitivní a negativní stránky.

Pozitivní je, že spojení může
použít v různých projektech. Negativní je, že, protože
připojení není součástí projektu, tak když ho převedete na někoho jiného
nebo při pokračování v práci na jiném počítači informace o nastavení
spojení nebudou převedena.

Pojďme si tedy shrnout vykonanou práci. V důsledku našeho
akce na panelu Server Explorer, objevilo se připojení k databázi Northwind,
který byl umístěn na formuláři naší aplikace tažením myši.
Když ji vyberete myší, objeví se odpovídající ikona, vlastnosti objektu
Připojení jsou viditelné v panelu vlastností Kontrola kódu programu ukazuje, že mezi
existuje nový objekt formuláře
private System.Data.OleDb.OleDbConnection oleDbConnection1;
a v metodě InitializeComponent se objevily následující řádky:
this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection();

// oleDbConnection1

This.oleDbConnection1.ConnectionString =

Zdroj=C:\Program Files\Microsoft Office\Office10\Samples\Borey.mdb;Mode=Share
Odepřít žádné;Rozšířené vlastnosti="""";Jet OLEDB:System database="""";Jet
OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine
Typ=5;Jet OLEDB:Režim zamykání databáze=1;Jet OLEDB:Globální částečná hromadná
Operace=2;Jet OLEDB:Globální hromadné transakce=1;Jet OLEDB:Nová databáze
Password="""";Jet OLEDB:Vytvořit systémovou databázi=False;Jet OLEDB:Šifrovat
Database=False;Jet OLEDB:Nekopírujte národní prostředí na Compact=False;Jet OLEDB:Compact
Bez opravy repliky=nepravda;Jet OLEDB:SFP=nepravda";
Vidíme to kromě vytvoření objektu OleDbConnection,
jeho majetek ConnectionString přiřazená hodnota v
v podobě poměrně dlouhé řady. Co znamená tento design?
Podíváme se na to trochu později, ale zatím se na to podívejme alternativní způsoby stvoření
objekt Spojení.

Poznámka. Pro úplnost je vhodné zmínit, že kromě
Panel Průzkumník serveru, S připojením lze pracovat také prostřednictvím odkazů
do referencí databáze z panelu Průzkumník řešení sady Visual Studio
.SÍŤ. Tím se však nebudeme podrobně zabývat, protože tato otázka
spíše se týká provozu IDE než funkce připojení ADO.NET.

Programové vytvoření Connection

Samozřejmě jako téměř každý objekt ve Visual Studiu
.NET konkretizace objektu vytvořeného voláním "master" Spojení
lze vytvořit i programově. Tato metoda je zvláště užitečná, když
vytváření konzolových aplikací .NET, protože "průvodce" vytvoří instanci
Spojení
při tažení do formuláře žádosti a nedostatek
samotná forma činí tento přístup nevhodným.
Těžko bude pro čtenáře překvapením, že vytvořit
Spojení
musíte zavolat konstruktor. Obě odrůdy Spojení
mají dvě přetížené varianty konstruktoru: s prázdným seznamem parametrů () a
pouze s jedním parametrem ( ConnectionString), který nastavuje
spojovací řetězec (a opět odkládáme vysvětlení, co to je).

Příklad tvorba softwaru Spojení:

Public SqlConnection cnnTest = new SqlConnection();
(samozřejmě se předpokládá, že program již dříve
jmenný prostor byl deklarován jako používaný System.Data.SqlClient).

Vlastnosti připojení

Abychom předešli případným nedorozuměním, rád bych nejprve poznamenal, že
Při zvažování vlastností, metod a událostí zvažuji nejprve ty
které jsou nativní pro danou třídu (to platí pro Spojení
a bude se týkat tříd probíraných v následujících článcích). Kromě nich,
třídy mají vlastnosti, metody a události zděděné od svých rodičů
třídy. Pokud zděděné členy třídy přímo nesouvisí
k našemu hlavnímu tématu, a to práci s databázemi pomocí
ADO.NET, nebudu je zvažovat, abych nezahltil článek
nedůležité detaily. Zároveň mějte na paměti, že tyto třídy mohou
mají další členy kromě těch, které jsem zmínil.

Pro ovládání připojení ke zdroji dat z programu
objekt Spojení, má samozřejmě sadu vlastností a metod.
Podívejme se blíže na vlastnosti obou objektových implementací.

JménoPopisTypPřístupOLE DBSQLVýchozí hodnota
ConnectionStringSpojovací řetězecSystem.StringRW+ +
ConnectionTimeoutČasový limit připojení v sekundáchSystem.Int32R+ + 15 sec
DatabázeNázev aktuální databáze (nebo té, která bude použita při otevírání připojení)System.StringR+ +
DataSourceNázev databázového serveru (SQL) nebo specifikace datového souboruSystem.StringR+ +
PacketSizeVelikost síťový balíček v bajtechSystem.Int32R- + 8192
PoskytovatelJméno poskytovatele OLE DBSystem.StringR+ -
ServerVerzeVerze databázového serveruSystem.StringR+ +
StátBitový vzor hodnot ConnectionStateConnectionStateR+ + ZAVŘENO
ID pracovní staniceŘetězec identifikující klientaSystem.StringR- + Název klientského počítače

Poznámky:


    Ve sloupci „Přístup“ znamená RW zápis a čtení, R – pouze
    čtení.


    Sloupce „OLE DB“ a „SQL“ označují dostupnost této nemovitosti
    Pro OleDbConnection A SqlConnection,
    respektive. „+“ – vlastnost je podporována, „-“ – není podporována.


    Ve sloupci „Výchozí hodnota“ je u vlastností typu pomlčka „–“.
    System.String
    znamená prázdný řetězec.


    Jsou uvedeny pouze vlastní vlastnosti objektu, s výjimkou
    vlastnosti zděděné z Component.


Ti, kteří znají klasické ADO, budou pravděpodobně překvapeni,
poznamenat, že všechny vlastnosti kromě ConnectionString, od této chvíle
pouze pro čtení. Ano, to je pravda. Všechny parametry připojení
v ADO.NET jsou nastaveny výhradně přes připojovací řetězec. Možná tohle
a k lepšímu, protože pokušení pokusit se je změnit během
spuštění programu, což často vede k výjimečnou situaci na
otevřené spojení.

Vezměte prosím na vědomí malý rozdíl ve vlastnostech OleDbConnection
A SqlConnection. I když jejich základní sada je stále stejná
některé jsou specifické pro poskytovatele. SqlConnection
unikátní vlastnosti PacketSize A ID pracovní stanice,
A OleDbConnection– majetek Poskytovatel. Tento
může negativně ovlivnit přenositelnost programů na jinou platformu.

Měli byste se vyhnout nastavení vlastnosti ConnectionTimeout
nulová hodnota, protože odpovídá nekonečnému časovému limitu a může
způsobit zamrznutí aplikace.

Hodnota nemovitosti Databáze se může změnit podle
během spouštění aplikace, pokud změní aktuální databázi (příp
relevantní SQL příkaz, nebo voláním metody Změnit databázi).

Hodnota nemovitosti PacketSize Může být
specifikované v rozsahu od 512 do 32767 bajtů. Při přeposílání velké objemy data
Zvýšení velikosti dávky může zlepšit výkon, protože snižuje
počet požadovaných operací čtení/zápisu paketů.

Vlastnictví Stát může přebírat hodnoty
převody ConnectionState. Tyto hodnoty jsou:

V daný čas pouze z tohoto souboru hodnot OTEVŘENO
A ZAVŘENO.

Připojovací řetězec

Konečně nastal čas mluvit o tom, co to je
představuje připojovací řetězec. Tento termín již byl zmíněn. Však
Téma je poměrně složité a je třeba se jím zabývat podrobněji.

Vlastnictví ConnectionString je možná,
hlavní majetek Spojení. Všechny ostatní nemovitosti jsou jako my
dříve, jsou pouze pro čtení a přenášejí hodnotu jednoho z
parametry zadané v připojovacím řetězci.

Připojovací řetězec je textový řetězec
speciální typ. Skládá se z párů klíč=hodnota oddělených
symbol středníku (;).

„Klíč“ nerozlišuje velká a malá písmena a lze jej zadat jako
nahoře a dál malá písmena; "hodnota" v obecný případ závisí na
rejstřík.

Je přijatelné opakovat „klíč“ několikrát v řadě. V tomhle
V tomto případě je použit poslední výskyt, ostatní jsou ignorovány. To je chyba
opakování není.

Obsah řetězce je specifický pro konkrétního poskytovatele.
Obvykle k vytvoření platného řetězce během návrhu programu
Může být užitečné použít následující trik: vytvořte připojení pomocí
Server Explorer (již víme, jak to udělat) a poté zkopírovat připojovací řetězec z
jeho vlastnosti.

Hodnota nemovitosti ConnectionString Může
požádat jen když uzavřené spojení ! Po instalaci Spojení
analyzuje řetězec a nastaví hodnoty zbývajících vlastností podle
její obsah. Úplná analýza obsahu připojovacího řetězce
provádí pouze v okamžiku otevření Spojení. Pokud v
Pokud narazíte na nepodporovaný název klíče nebo neplatnou hodnotu,
byla vyvolána odpovídající výjimka ( OleDbException nebo
SqlDbException
).

Objekt Spojení implementuje rozhraní IDbConnection,
tak k přístupu obecné vlastnosti lze deklarovat oba poskytovatele
typ proměnné IDbConnection. Tím se to trochu zjemní
problém neúplné kompatibility dvou poskytovatelů dat.

Způsoby připojení

Naštěstí metody SqlConnection A OleDbConnection
úplně stejný.

Nejdůležitější možná jsou OTEVŘENO A
Blízko
. Ostatní je mohou volat buď explicitně, nebo implicitně.
komponenty ADO.NET. Pokud metoda OTEVŘENO volané komponentami
DataAdapter
nebo DataCommand(na které se podíváme
v následujících článcích), pak odejdou Spojení v počátečním
stavu, tzn. Li Spojení bylo otevřeno, pak nic
se změní, a pokud je zavřeno, volající komponenta jej otevře a provede
požadovanou operaci a poté se zavře. Takže programátor může
ignorovat vedlejší účinky těchto složek.

Otevřené připojení se automaticky neuzavře, když
zničení předmětu Spojení
! To je třeba mít na paměti
otevřené spojení spotřebovává zdroje jako pracovní stanice, takže
server zdroje dat. Proto byste měli učinit pravidlo explicitně zavřít
spojení přes hovor Blízko a udělejte to, jak nejlépe umíte
dříve, jakmile již připojení nebude vyžadováno. Při uzavírání spojení
Blízko
vrátí zpět všechny čekající transakce.

Zahájit transakci- přetížená funkce,
vrácení objektu transakce (různé pro různé poskytovatele). mysli,
Nyní je předčasné diskutovat o otázce provádění transakcí
V teoretickém kurzu jsme ještě neuvažovali, co to je.

CreateCommand vytvoří objekt Datacommand,
na které jsme se ještě nepodívali. Takže se zatím musíme spokojit
s tímto skromným popisem. Význam této operace bude objasněn později.

Bazén připojení

Chcete-li využívat zdroje hospodárněji, ADO.NET pracuje s
přípojný bazén. SQL Server .NET Data Provider má svůj vlastní fond
připojení a zprostředkovatel dat OLE DB .NET používá fond OLE DB. Spravujte bazén
možné s příslušnými parametry připojovacího řetězce, ale podrobným zvážením
Tato problematika je nad rámec článku.

Pro začátek stačí vědět, že pool připojení je druh
uložení přípojek připravených k použití. Výchozí fond připojení
povoleno a při uzavření spojení přes Blízko opravdu je
Ve skutečnosti není fyzicky uzavřen, ale umístěn v bazénu. Pokud při pokusu o otevření
nové připojení přes OTEVŘENO ukazuje se, co je připraveno
připojení je ve fondu, nevytváří se, ale je jednoduše předáno aplikaci z fondu.
Vzhledem k tomu, že navázání spojení trvá určitou dobu, což pro vzdálené
server může být poměrně významný, využití fondu může být významné
urychlit aplikaci.

Mechanismus pro práci s poolem připojení je zcela transparentní
programátor a zakázat fond nebo explicitně spravovat jeho parametry
Připojovací řetězec pravděpodobně nebude potřeba pro každodenní práci.

Spojení událostí

Těchto událostí není mnoho, jsou jen dvě a shodují se
obě možnosti Spojení.

StateChange nastává při změně stavu
Připojení, tzn. když jeho majetek Stát změní hodnotu z
OTEVŘENO
na ZAVŘENO nebo naopak. Handler k tomu
událost obdrží argument typu StateChangeEventArgs, který
má dvě vlastnosti: Původní stav (výchozí stav
připojení) a Aktuální stav(jeho současný stav). Obojí
vlastnosti mohou nabývat jedné z hodnot výčtu ConnectionState,
které jsme již uvažovali dříve při studiu nemovitosti Stát.

InfoMessage nastane, když zdroj dat
vrátí varovnou nebo informační zprávu. Obě možnosti připojení
vrátit sbírku chyb, textový popis chyby a název objektu, ve kterém
došlo k chybě. OleDbConnection.InfoMessage
další majetek ErrorCode, který identifikuje
zdroj chyb podle standardu ANSI SQL.

Výsledky

Pojďme si tedy shrnout, co jsme se v tomto článku dozvěděli.

Předně podle mě velmi důležitý fakt o kterém
by nemělo být zapomenuto. Existují dvě implementace Spojení- Pro
OLE DB a MS SQL Server. Tyto implementace jsou velmi podobné, ale ne totožné.
Proto na počáteční fázi vývoj, musíte se rozhodnout, co obětovat -
účinnost nebo snášenlivost, jak to může být v budoucnu nezbytné
redesign programu.

Objekt Spojení nutné založit
spojení se zdrojem dat. Jiné objekty použití Spojení
k výměně informací se zdrojem dat, z nichž některé vyžadují
takže spojení je explicitně otevřené, ostatní jsou schopni řídit jeho stav
na vlastní pěst.

Pokud se vyvíjí typická aplikace na základě dialogu,
Spojení můžete vytvořit buď ručně, nebo použít služby
speciální mistr. Během vývoje konzolová aplikace není na výběr
- pouze tvorba softwarové připojení ručně, protože při práci mistra
připojení se odtáhne na formulář žádosti.

Hlavní majetek Spojení- Tohle ConnectionString,
Zde se nastavují všechny parametry potřebné k navázání spojení.
Všechny ostatní vlastnosti kromě Stát, jsou deriváty a
vrátit hodnoty jednotlivých parametrů připojení, ale lze je změnit
pouze přes ConnectionString.

Nastavte správnou hodnotu ConnectionString
úkol není snadný. Mistr může poskytnout neocenitelnou pomoc při jeho formování.
navazování spojení, i když je plánováno navázání samotného spojení
programově.

Jakékoli změny parametrů připojení lze provádět pouze
když je zavřeno. Výjimkou je aktuální databáze, která
lze změnit, když je spojení otevřené, voláním metody Změnit databázi.

Když se změní stav připojení, vyvolá se událost StateChange,
a po obdržení varování popř informační zpráva- událost InfoMessage.

Závěr

A nakonec, abych upevnil znalosti, které jsme získali o připojení ADO.NET, dám
malý program, který je schopen otevírat a zavírat spojení s
vzdělávací základna data (tlačítka "Otevřít".
A
"Blízko" ), a také ukazují stav a vlastnosti připojení
(tlačítko "Zobrazit". ). Program lze zkompilovat a spustit v prostředí
Visual Studio .NET nebo .NET Framework.

Při spouštění programu na počítači věnujte pozornost
k následujícím bodům, které jsou podle mého názoru nejzřetelnější:


    Při pokusu o otevření již otevřeného připojení dojde k chybě. Proto při otevírání
    připojení v pochybných případech, případně zkontrolujte jeho stav (vlastnost
    Stát
    ), nebo zachytit výjimku InvalidOperationException.
    ADO.NET je mnohem tolerantnější k uzavření soukromého připojení a dochází k chybám
    není zapojen žádný runtime.


    Ne všechny vlastnosti Spojení dostupné, když je spojení uzavřeno, v
    což můžete ověřit stisknutím tlačítka
    s uzavřeným spojením. Je však nepravděpodobné, že by vlastnosti někdo potřeboval
    uzavřené spojení.


Ukázkový kód programu pro tento článek:

Použití systému;

Použití System.Windows.Forms;

Použití System.Data;

Jmenný prostor ConnSample

{
public class frmConnSample: System.Windows.Forms.Form

{
private System.Windows.Forms.Button btnExit;
private System.Windows.Forms.Button btnOpen;
private System.Windows.Forms.Button btnClose;
private System.Windows.Forms.Label lblConnState;
private System.Windows.Forms.TextBox txtConnstate;
private System.Data.OleDb.OleDbConnection oleDbCnn1;
soukromé System.Windows.Forms.Button btnShow;
private System.Windows.Forms.ListBox lstConnProps;
private System.ComponentModel.Container komponenty = null;

Veřejné frmConnSample()
{
InitializeComponent();
}

Chráněné přepsání void Dispose (bool likvidace
{
pokud (likvidace)
{
if (komponenty != null)
{
komponenty.Dispose();
}
}
základ.Dispose(likvidace);
}

#region Kód generovaný Návrhářem formulářů Windows
private void InitializeComponent()
{
this.btnExit = nový

this.oleDbCnn1 = nový
System.Data.OleDb.OleDbConnection();
this.btnOtevřít = nové
System.Windows.Forms.Button();
this.btnClose = nový
System.Windows.Forms.Button();
this.lblConnState = nový
System.Windows.Forms.Label();
this.txtConnstate = nový
System.Windows.Forms.TextBox();
this.btnShow = nový
System.Windows.Forms.Button();
this.lstConnProps = nový
System.Windows.Forms.ListBox();
this.SuspendLayout();
// btnExit
this.btnExit.Location = nové
System.Drawing.Point(296, 232);
this.btnExit.Name = "btnExit";
this.btnExit.TabIndex = 0;
this.btnExit.Text = "Konec";
this.btnExit.Click += new
System.EventHandler(this.btnExit_Click);
// oleDbCnn1
// připojovací řetězec; opravit to
podle umístění souborů ve vašem počítači
this.oleDbCnn1.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";ID uživatele=Admin;Data
Zdroj=C:\Program Files\Microsoft Office\Office10\Samples\Borey.mdb";
// přidání obsluhy události StateChange
this.oleDbCnn1.StateChange += nové
System.Data.StateChangeEventHandler(this.ShowConnState);
//btnOtevřít
this.btnOpen.Location = nové
System.Drawing.Point(16, 232);
this.btnOpen.Name = "btnOpen";
this.btnOpen.TabIndex = 2;
this.btnOpen.Text = "Otevřít";
this.btnOtevřít.Click += new
System.EventHandler(this.btnOpen_Click);
//btnZavřít
this.btnClose.Location = new
System.Drawing.Point(104, 232);
this.btnClose.Name = "btnClose";
this.btnClose.TabIndex = 3;
this.btnClose.Text = "Zavřít";
this.btnClose.Click += new
System.EventHandler(this.btnClose_Click);
//lblConnState
this.lblConnState.Location = nové
System.Drawing.Point(16, 200);
this.lblConnState.Name = "lblConnState";
this.lblConnState.Size = nové
System.Drawing.Size(96, 16);
this.lblConnState.TabIndex = 4;
this.lblConnState.Text = "Stav připojení:";
// txtConnstate
this.txtConnstate.Location = nový
System.Drawing.Point(112, 200);
this.txtConnstate.Name = "txtConnstate";
this.txtConnstate.TabIndex = 5;
this.txtConnstate.Text = "";
//btnShow
this.btnShow.Location = nové
System.Drawing.Point(296, 200);
this.btnShow.Name = "btnShow";
this.btnShow.TabIndex = 6;
this.btnShow.Text = "Zobrazit";
this.btnShow.Click += new
System.EventHandler(this.btnShow_Click);
//lstConnProps
this.lstConnProps.Location = nové
System.Drawing.Point(16, 16);
this.lstConnProps.Name = "lstConnProps";
this.lstConnProps.Size = nové
System.Drawing.Size(344, 173);
this.lstConnProps.TabIndex = 7;
// frmConnSample
this.AutoScaleBaseSize = nové
System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(384,
266);
this.Controls.AddRange(new
System.Windows.Forms.Control

{
this.lstConnProps,
this.btnShow,
this.txtConnstate,
this.lblConnState,
this.btnClose,
this.btnOtevřít,
this.btnExit
});
this.FormBorderStyle =
System.Windows.Forms.FormBorderStyle.Fixed3D;
this.MaximizeBox = false; this.MinimizeBox =
falešný; this.Name = "frmConnSample";
this.Text = "Ukázka připojení";
this.ResumeLayout(false);
}
#endregion


statické void Main()
{
Application.Run(new frmConnSample());
}

Private void btnExit_Click(odesílatel objektu, System.EventArgs
E)
{
Application.Exit();
}

Private void btnOpen_Click(odesílatel objektu, System.EventArgs
E)
{
pokus
{
oleDbCnn1.Open();
}
catch (InvalidOperationException err) // pokus
otevřít již otevřené spojení
{
MessageBox.Show("Připojení je
již otevřeno!!!", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (System.Data.OleDb.OleDbException err)
{
MessageBox.Show("Chyba při otevírání
Connection!!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Private void btnClose_Click(odesílatel objektu, System.EventArgs
E)
{
oleDbCnn1.Close();
}

Private void btnShow_Click(odesílatel objektu, System.EventArgs
E)
{
pokus
{
lstConnProps.Items.Clear();

LstConnProps.Items.Add("ConnectionString = " + oleDbCnn1.ConnectionString);

LstConnProps.Items.Add("ConnectionTimeout = " +
oleDbCnn1.ConnectionTimeout.ToString());
lstConnProps.Items.Add("Databáze = "
+ oleDbCnn1.Databáze);
lstConnProps.Items.Add("DataSource =
" + oleDbCnn1.DataSource);
lstConnProps.Items.Add("Provider = "
+ oleDbCnn1.Provider);

LstConnProps.Items.Add("ServerVersion = " + oleDbCnn1.ServerVersion);
lstConnProps.Items.Add("State = " +
oleDbCnn1.State);
}
catch (System.InvalidOperationException err)
{
MessageBox.Show("Nelze získat nějaké
vlastnosti uzavřené spojení!!!", "Varování", MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
}

// indikátor aktuálního stavu připojení
private void ShowConnState(odesílatel objektu,
StateChangeEventArgs e)
{
txtConnstate.Text = oleDbCnn1.State.ToString();
}
}
}

Občas mají programátoři spalující touhu něco z databáze přečíst. Programátoři jsou nervózní a podráždění, ztrácejí spánek a zběsile ukazují prsty na klávesnici. V zájmu obecného dobra a světového míru uvažujte jednoduchá práce s databází z C# pomocí ADO.NET a OLE DB. Ačkoli tento mechanismus podporuje různé základny data jako Oracle, tady a teď budeme používat MS SQL Server.

Dva hlavní úkoly při práci s databází

2. Provedení příkazu SQL, který něco na serveru provede (vložení, aktualizace, odstranění, volání funkce nebo uložené procedury

3. Sekvenční čtení z výběru řádek po řádku. Používá se hlavně ve webových aplikacích v desktopových aplikacích je snazší stáhnout celý výběr najednou; BERAN, úspora při čtení pouze nezbytných řádků je zanedbatelná.

4. Vzácný případ. Automatická aktualizace tabulky v databázi na základě změn v DataTable (obvykle upravovaných přes vizuální rozhraní). V skutečný život data se obvykle načítají složitý dotaz s hromadou spojení nebo zobrazení, tak automatická synchronizace nesedí.

Hlavní třídy používané pro tyto účely: OleDbConnection - připojení k databázi, vytvořené pomocí řetězce obsahujícího parametry připojení, open, close, OleDbCommand - vytvořené pomocí instance připojení a příkazu sql, pokud potřebujete provést aktualizaci nebo získat jediná hodnota, pak stačí třída, OleDbDataAdapter - vytvořený pomocí OleDbCommand, specializuje se na jednorázové čtení sad řádků v DataTable, umí automaticky vytvářet sloupce DataTable na základě výběru, přenášet změny z DataTable do tabulky v databáze, OleDbDataReader - sekvenční čtení řádků v DataTable po jednom (funguje interně OleDbDataAdapter), DataTable / DataSet - hlavní kontejner pro data. Výčet OleDbType ukládá datové typy databáze.

Použití System.Data; pomocí System.Data.OleDb; // připojovací řetězec, použitý systém Uživatelé Windows (Integrované zabezpečení=SSPI;) string connString = "Poskytovatel=SQLOLEDB.1;Integrované zabezpečení=SSPI;Přetrvávající informace o zabezpečení=Nepravda;Počáteční katalog=název databáze;Zdroj dat=název serveru"; // připojení pomocí ověřování MS SQL Server // connString = "Poskytovatel=SQLOLEDB.1;Trvalé informace o zabezpečení=Nepravda;Počáteční katalog=název databáze;Časový limit připojení=20;Zdroj dat=název_serveru;Uid=jméno uživatele;Pwd=heslo uživatele;" OleDbConnection dbConn = new OleDbConnection(connString); dbConn.Open(); someDataTable = new DataTable(); OleDbDataAdapter dbAdapter = new OleDbDataAdapter("vyberte COLUMN1, COLUMN2 z TEST_TABLE ORDER BY COLUMN2", dbConn); // vnitřní struktura prázdný stůl budou vytvořeny automaticky na základě načtených dat, pokud již byla zadána struktura tabulky (např. přes typizovaný DataSet), pak se data zapíší do sloupců se shodnými názvy nebo budou přidány nové sloupce dbAdapter.Fill(someDataTable ); // alternativní možnost k vyplnění tabulky v DataSet // dbAdapter.Fill(someDataSet, "someDataTable"); dbConn.Close();

2. Provedení příkazu SQL, který něco na serveru provede (vložení, aktualizace, odstranění, volání funkce nebo uložené procedury.

Za zmínku stojí zejména problémy s daty. Implementace dat v .Netu je extrémně pokřivená - zpočátku data nemohou být prázdná, ale v reálném životě jsou prázdná neustále. Nejvíce správné rozhodnutí- použijte speciální třídu data, která opravuje chyby programátorů Microsoftu. Lazier vývojáři uchovávají všechna data v kódu jako řetězce a převádějí je na DateTime pouze v případě potřeby, například při zápisu do databáze nebo DataTable. DateTime s možností Null nepomůže, protože prázdné datum v rozhraní by mělo vypadat prázdný řádek a při zápisu do databáze jako DBNull.Value - ani banální null v kódu není převedena na tyto hodnoty bez dalšího tance s tamburínou.

První možnost zahrnuje jednoduché sloučení řetězce dotazu. Považováno za špatný postup a zvláště nebezpečný ve webových aplikacích, protože je zranitelný vůči útokům hackerů. Problém s prázdnými daty se tak snadno nevyřeší. Navíc se při práci s daty objeví dodatečný problém - různé formáty datové řetězce v závislosti na regionálním nastavení .Net Framework, vývojovém prostředí a serveru SQL. Může to vypadat neskutečně – stejný dotaz funguje v SQL Managment Studio, ale při spuštění z kódu se zhroutí. Částečně uloženo speciálním formátem datového řetězce To se však často provádí v malých programech pro vnitřní použití, jehož existence vnější svět nikdy nebude vědět.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (" + intVariable", " + stringVariable" , " + dateTimeVariable.ToString("yyyyMMdd") +"); dbCommand.ExecuteNonQuery();

Správná volba zahrnuje vytvoření příkazu se sadou silně zadaných parametrů. Vezměte si, že předchozí odstavec neexistoval.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (?, ?, ?)"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; dbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar).Value = stringVariable; if (stringDate == "") ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.DateTime).Value = DBNull.Value; ) else ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbTypeal.eVu.D Convert.ToDateTime(stringDate) dbCommand.ExecuteNonQuery();

Uložená procedura se volá úplně stejným způsobem, z důvodu rozmanitosti existuje další možnost zápisu hodnot do parametrů (nesouvisí konkrétně s uloženou procedurou):

OleDbCommand someDbComm = new OleDbCommand("someStoredProcedure", this.dbConn); someDbComm.CommandType = CommandType.StoredProcedure; someDbComm.Parameters.Add("@parameter1", OleDbType.VarChar); someDbComm.Parameters.Add("@parameter2", OleDbType.VarChar); someDbComm.Parameters.Value = "Každý problém má vždy řešení - jednoduché, pohodlné a samozřejmě špatné"; someDbComm.Parameters.Value = "Henry Louis Mencken"; someDbComm.ExecuteNonQuery(); !}

Rozšířená verze popisu parametru udávající velikost pole a vazbu na konkrétní sloupec tabulky.

DbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar, 100, "VARCHAR_COLUMN").Value = stringVariable;

Pokud nepotřebujeme vázat parametr příkazu na konkrétní pole DataTable, pak je nejlepší velikost neuvádět vůbec, například pokud je řetězec menší než zadaná délka Varchar, pak dobrý framework .Net přidá mezery do řetězce až do zadané délky, čímž dojde k poškození dat přenášených na server.

Hodnotu jednoho pole čte metoda ExecuteScalar().

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "VYBRAT TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; int vysledek = Convert.ToInt32(dbCommand.ExecuteScalar());

Zvláště je třeba poznamenat, že ExecuteScalar vrací Object a pokud požadavek nevrátil vůbec nic, pak bude výsledek null a převod na normální datový typ se nezdaří s chybou. Pokud nastane situace, kdy nedostaneme žádnou odpověď, pak musíme udělat toto:

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "VYBRAT TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; objekt vysledekObj = dbCommand.ExecuteScalar() int vysledek = -1; // výchozí hodnota znamená prázdný výsledek if(resultObj != null) ( result = Convert.ToInt32(dbCommand.ExecuteScalar()); )

3. Sekvenční čtení z vybraného výběru řádek po řádku
Čtení jednoho řádku (několik se čte ve smyčce);

OleDbCommand dbCommand = new OleDbCommand(vyberte PERSON_ID, JMÉNO, PŘÍJMENÍ z TEST_TABLE, dbConn); OleDbDataReader dbReader = dbCommand.ExecuteReader(); dbReader.Read(); název řetězce = Convert.ToString(dbReader["NAME"]); string prijmeni = Convert.ToString(dbReader["PRIJMENÍ"]); dbReader.Close();

4. Vzácný případ. Automatická aktualizace tabulky v databázi na základě změn v DataTable (obvykle upravována přes vizuální rozhraní).

Pro každý DbAdapter musíte napsat čtyři příkazy možný případ- vybrat, vložit, aktualizovat, odstranit.

DbAdapter.InsertCommand = new OleDbCommand("insert into TEST_TABLE (NAME, FAMIL, AGE) values ​​​​(?, ?, ?)", dbConnection); dbAdapter.InsertCommand.Parameters.Add("NAME", OleDbType.VarChar, 100, "NAME"); dbAdapter.InsertCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); // pro datové typy s konstantní délkou je délka zadaná v příkazu ignorována dbAdapter.InsertCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); // přidání aktualizačního příkazu dbAdapter.UpdateCommand = new OleDbCommand("update TEST_TABLE set NAME = ?, FAMIL = ?, AGE = ? kde ID = ?, dbConnection); dbAdapter.UpdateCommand.Parameters.Add("NAME", OleDbType.VarChar,100, "NAME"); dbAdapter.UpdateCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); dbAdapter.UpdateCommand.Parameters.Add("VĚK", OleDbType.Integer, 100, "VĚK"); dbAdapter.UpdateCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); // přidání příkazu delete dbAdapter.DeleteCommand = new OleDbCommand("delete from TEST_TABLE where ID = ?", dbConnection); dbAdapter.DeleteCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); try ( // přenese všechny změny z DataTable do tabulky v databázi dbAdapter.Update(table); ) catch ( Chyba výjimky) ( MessageBox.Show("Chyba při ukládání dat!" + chyba.Zpráva); return; ) MessageBox.Show("Změny uloženy!");




Nahoru