Komunikace s MSSQL databází (VB.NET, C#)

Tomáš Jecha, MVP, MCSD       28.09.2007       C#, VB.NET, ADO.NET, Databáze       34164 zobrazení

Microsoft klade ve svých programovacích prostředích velký důraz na deklarativní přístup k datům. Určitě to v mnoha ohledech nesmírně usnadní práci, to je nepochybné. My se ale dnes podíváme o třošku níž. Ukážeme si, jak používat objekty ze jmeného prostoru System.Data.SqlClient sloužící ke komunikaci s Microsoft SQL Serverem (dále jen MSSQL). Ukázky kódu jsou tu jak pro Visual Basic, tak C#.

Co budeme potřebovat?

Protože budeme komunikovat s SQL serverem, použijeme SQL jazyk. A abych nenosil dříví do lesa, budu předpokládat, že jeho úplné základy umíte (založení databáze, příkazy SELECT, INSERT, DELETE, UPDATE - pokud ne, tak doporučuji přečíst článek Úvod do jazyka SQL).

K testování budeme používat Visual Studio 2005, ale vše by mělo fungovat i na verzi 2008. Jako server Microsoft SQL Server 2005 Express Edition s Microsoft SQL Server Management Studio Express k administraci a založení databáze (ke stáhnutí - Microsoft SQL Server Express With Advanced Services SP2), která je zdarma.

Založíme si ukázkovou databázi

Pokud máme již vše potřebné nainstalované, spustíme si SQL Management Studio a objeví se nám přihlašovací obrazovka:

 Připojení na MSSQL databázi   

Všimněte si položky Server name. Skládá se z jména nebo IP adresy fyzického serveru + jména instance SQL serveru (pokud si nainstalujete MSSQL Express, jeho defaultní jméno je SQLEXPRESS). Tečka je zástupný symbol pro počítač na kterém se zrovna pracuje (localhost), proto by fungovalo i localhost\SQLEXPRESS, či 127.0.0.1\SQLEXPRESS. Pro nás bude tento údaj brzy důležitý při vytváření připojení.

Další položka, které je dobré si povšimnou je způsob autentifikace. MSSQL podporuje dva: Windows Authentication (přihlašováním stejným účtem jako jsme přihlášení ve Windows) a SQL Authentication (přihlášení jménem a heslem - účet nemusí existovat ve Windows). A protože jsme přihlášení jako administrátoři (pokud nejste, tak to udělejte, jinak vás server do aministrace nepustí), použijeme Windowsí autentifikaci.

Když se nám otevře hlavní okno programu (úspěšně jsme se přihlásili), klepneme pravým tlačítkem na Databases a vybereme New Database:

 Založení nové databáze

Databázi pojmenujeme kamaradi a potvrdíme klepnutím na OK. Rozbalíme si větev databází a pravým tlačítkem vyvoláme kontextové menu, kde vybereme otevření okna pro vykonání nového databázového scriptu New Query:

 

Tady je kód na vytvoření tabulky a několika záznamů, který vložíme do hlavního okna a stiskneme F5 pro spuštění:

CREATE TABLE [dbo].[SeznamKamaradu] (
   [ID] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
   [DatumNarozeni] DATETIME,
   [Jmeno] NVARCHAR(100),
   [Prijmeni] NVARCHAR(100),
   [Mesto] NVARCHAR(100)
)

INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1988-7-2','Martin','Krejc','Praha')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1989-5-2','Eva','Slánská','Praha')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1989-7-14','Jakub','Petrovský','Liberec')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1987-5-24','Míša','Petrovská','Liberec')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1989-12-22','Martin','Petřválský','Liberec')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1986-1-12','Aneta','Lerchová','Hradec Králové')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1986-9-13','Petr','Žák','Praha')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1987-5-4','Lucie','Malá','Liberec')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1988-12-24','Adam','Rychnovský','Brno')
INSERT INTO [dbo].[SeznamKamaradu] ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1989-8-16','Markéta','Jelínková','Liberec')

Pokud se nezobrazí žádné chyby, máme založenou databázi s tabulkou SeznamKamaradu a několika ukázkovými záznamy.

Co je to Connection String?

Connection String (česky připojovací řetězec) slouží k popisu připojení do databáze. Určuje přihlašovací údaje, adresu serveru, způsob zabezpečení a řadu dalších nastavení... Pamatujete na přihlašovací okno MSSQL Server Management Studia?  Není to nic jiného než interaktivní a pohodlnější zadávání Connection Stringu. Stejně když klepnete na Connect, tak se ze zadaných údajů sestaví připojovací řetězec.

Nejdřív malé shrnutí: Máme databázový servertypu MSSQL (adresa: localhost\SQLEXPRESS), máme databázi (kamaradi) a pro přihlašování použijeme práva účtu se kterým jsme přihlášeni ve Windows (měl by to být administrátor). Náš connection string je:

Server=localhost\SQLEXPRESS;Initial Catalog=kamaradi;Trusted_Connection=yes;

Jednotlivé položky nastavení jsou oddělené středníkem (jméno1=hodnota1;jméno2=hodnota2;jméno3=hodnota3;  ... atd), jejich význam je následující:

  • Server=localhost\SQLEXPRESS - určuje cílový databázový stroj
  • Database=kamaradi - jméno databáze, do které se po přihlášení přejde
  • Trusted_Connection=yes - definuje, zda se má použít přihlašování přes účty ve Windows (pokud je nastaven na false, je nutné zadat i přihlašovací údaje: User Id=jméno;Password=heslo;)

Pokud máte zájem o podrobnější informace o připojovacích řetězcích, doporučuji tento web, který se jimi podrobně zabývá (bohužel in English): http://www.connectionstrings.com/?carrier=sqlserver2005 nebo konkrétněji podstránku přímo s popisem jednotlivých klíčových slov: http://www.connectionstrings.com/article.aspx?article=allsqlconnectionconnectionstringproperties

Pozor: Bohužel se nepodařilo 100% standartizovat připojovací řetězce pro všechny technologie a proto bývá často pro jednu věc více možných zápisů (například místo Server je možné napsat i Data Source, Address, Addr nebo Network Address) a tak se neleknětě pokud uvidíte někde zápis trochu jinak.

Založení projektu

Spustíme Visual Studio a založíme nový projekt typu Console Application. Protože by bylo dobré uchovávat Connection string pro celou aplikaci na jednom místě, vepíšeme ho do konfiguračního XML souboru app.config. Pokud jej v projektu ještě nemáte, přidejte nový soubor typu Application Configuration File a vložte do něj tuto definici:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="DatabazeKamaradu" value="Server=localhost\SQLEXPRESS;Initial Catalog=kamaradi;Trusted_Connection=yes;" />
  </appSettings>
</configuration>

V kódu aplikace pak můžeme přistupovat k řetězci takto:

VB.NET

Dim ConnectionString As String = System.Configuration.ConfigurationSettings.AppSettings("DatabazeKamaradu")

C#

string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["DatabazeKamaradu"];

Abych nemusel pokaždé psát celý kód, tak tady je jeho základ:

VB.NET

Imports System.Data.SqlClient
Module Module1
    Public Sub Main()
        Dim ConnectionString As String = System.Configuration.ConfigurationSettings.AppSettings("DatabazeKamaradu")

        ' > sem budeme vkládat funkční kód <

        Console.ReadKey() ' vyčká na stisknutí klávesy, ať hned nezmizí výpis
    End Sub
End Module

C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;

class Program
{
    static void Main(string[] args)
    {
        string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["DatabazeKamaradu"];

        // > sem budeme vkládat funkční kód <

        Console.ReadKey(); // vyčká na stisknutí klávesy, ať hned nezmizí výpis
    }
}

Připojení do databáze

Vše je nyní připravené a můžeme se pustit konečně na samotný kód komunikace se serverem. Budeme využívat objektů ze jmeného prostoru System.Data.SqlClient.

System.Data.SqlClient.SqlConnection reprezentuje spojení s databází. Předává se mu výše popisovaný připojovací řetězec. Ukážeme si jak se připojit, zjistit o serveru pár informací a zase se odpojit:

VB.NET

        Dim sqlConnection As New SqlConnection(ConnectionString) ' inicializace objektu spojení na databázi
        sqlConnection.Open() ' pomocí dat z ConnectionStringu spojení otevřeme
        Console.WriteLine(String.Format("Verze serveru: {0}", sqlConnection.ServerVersion)) ' zjištění verze serveru
        Console.WriteLine(String.Format("Identifikace serveru: {0}", sqlConnection.WorkstationId)) ' a ID počítače na kterém běží
        sqlConnection.Close() ' a zase uzavřeme

C#

        SqlConnection sqlConnection = new SqlConnection(ConnectionString); // inicializace objektu spojení na databázi
        sqlConnection.Open(); // pomocí dat z ConnectionStringu spojení otevřeme
        Console.WriteLine(String.Format("Verze serveru: {0}", sqlConnection.ServerVersion)); // zjištění verze serveru
        Console.WriteLine(String.Format("Identifikace serveru: {0}", sqlConnection.WorkstationId)); // a ID počítače na kterém běží
        sqlConnection.Close(); // a zase uzavřeme

Pokud jste provedli všechno správně, odměnou vám bude informace o verzi a názvu stanice serveru.

cns1

Pozor: Připojení na server se snažte mít otevřené na co nejkratší dobu. Jejich počet je totiž omezen a pokud ho přesáhnete, bude se čekat než se uzavře jiné. Proto je dobré nenechávat při vykonávání delších operací připojení otevřené.

Vykonání dotazu

Dostáváme se prakticky k nejdůležitějšímu objektu. A to System.Data.SqlClient.SqlCommand, který popisuje dotaz proti databázi. Obsahuje textový SQL dotaz a odkaz na připojení pomocí kterého se příkaz provede.

Teď si ukážeme jak je možné zjistit počet položek v tabulce SeznamKamaradu příkazem:

SELECT COUNT(*) FROM [SeznamKamaradu]

VB.NET

        Dim sqlConnection As New SqlConnection(ConnectionString) ' inicializace objektu spojení na databázi

        Dim sqlCommand As New SqlCommand("SELECT COUNT(*) FROM [SeznamKamaradu]", sqlConnection) ' vytvoření dotazu a předání připojení

        sqlConnection.Open() ' pomocí dat z ConnectionStringu spojení otevřeme
        Console.WriteLine(String.Format("Počet kamarádů: {0}", CInt(sqlCommand.ExecuteScalar()))) ' provedení příkazu
        sqlConnection.Close() ' a zase uzavřeme

C#

        SqlConnection sqlConnection = new SqlConnection(ConnectionString); // inicializace objektu spojení na databázi

        SqlCommand sqlCommand = new SqlCommand("SELECT COUNT(*) FROM [SeznamKamaradu]", sqlConnection); // vytvoření dotazu a předání připojení

        sqlConnection.Open(); // pomocí dat z ConnectionStringu spojení otevřeme
        Console.WriteLine(String.Format("Počet kamarádů: {0}", (int)(sqlCommand.ExecuteScalar()))); // provedení příkazu
        sqlConnection.Close(); // a zase uzavřeme

Pokud se příkaz provedl správně, výstup nám oznámí, že počet kamarádů v databázi je 10.

Druhy provedení dotazu

V předchozím příkladě jsme viděli použití příkazu SqlCommand.ExecuteScalar(). To je však jen jedna ze 4 variant:

  1. sqlCommand.ExecuteNonQuery() - vykoná příkaz, ale nevrátí výsledek, jen počet řádků, které se příkazem změnili (proto je vhodný převážně pro vkládání, mazaní a upravování záznamů)
  2. sqlCommand.ExecuteScalar() - vykoná příkaz a vrátí jen první hodnotu, která je na výstupu (ideální pro dotazy vracející jen jednu hodnotu - viz. předchozí příklad, co zobrazí počet záznamů v tabulce)
  3. sqlCommand.ExecuteReader() - po vykonání příkazu vrací objekt SqlDataReader díky kterému máme možnost číst více řádků i více sloupců (využívá se pro čtení dotazů, které vrací celé řádky)
  4. sqlCommand.ExecuteXmlReader() - funguje podobně jako ExecuteReader, jen vrací data ve formátu XML (konkrétně objektem XmlReader)

Čtení více řádků

V minulé kapitolce jsme si popsali k čemu jsou jednotlivé funkce na vykonání příkazů. Teď si přiblížíme ExecuteReader pro přečtení více řádků výstupu. V ukázce si necháme vypsat všechny jména a města z naší tabulky SeznamKamaradu. Použijete dotaz:

SELECT [Jmeno],[Mesto] FROM [SeznamKamaradu]

Zdrojový kód není o moc složitější než u minulého příkladu:

VB.NET

        Dim sqlConnection As New SqlConnection(ConnectionString) ' inicializace objektu spojení na databázi
        Dim sqlCommand As New SqlCommand("SELECT [Jmeno],[Mesto] FROM [SeznamKamaradu]", sqlConnection) ' vytvoření dotazu a předání připojení

        sqlConnection.Open() ' pomocí dat z ConnectionStringu spojení otevřeme
        Dim dataReader As SqlDataReader = sqlCommand.ExecuteReader() ' spuštění dotazu a vytvoření objektu na čtení řádků

        ' smyčka na čtení záznamů
        Do While dataReader.Read ' posun na další řádky, dokud jsou k dispozici
            Console.WriteLine(String.Format("Záznam: {0} ({1})", dataReader("Jmeno"), dataReader("Mesto"))) ' zobrazí záznam
        Loop

        dataReader.Close() ' nejdříve uzavřeme aktuální dotaz
        sqlConnection.Close() ' a pak i spojení

C#

        SqlConnection sqlConnection = new SqlConnection(ConnectionString); // inicializace objektu spojení na databázi
        SqlCommand sqlCommand = new SqlCommand("SELECT [Jmeno],[Mesto] FROM [SeznamKamaradu]", sqlConnection); // vytvoření dotazu a předání připojení

        sqlConnection.Open(); // pomocí dat z ConnectionStringu spojení otevřeme
        SqlDataReader dataReader = sqlCommand.ExecuteReader(); // spuštění dotazu a vytvoření objektu na čtení řádků

        // smyčka na čtení záznamů
        while (dataReader.Read()) // posun na další řádky, dokud jsou k dispozici
        {
            Console.WriteLine(String.Format("Záznam: {0} ({1})", dataReader["Jmeno"], dataReader["Mesto"])); // zobrazí záznam
        }

        dataReader.Close(); // nejdříve uzavřeme aktuální dotaz
        sqlConnection.Close(); // a pak i spojení

Výsledek je sice jen jednoduchý výpis, ale myslím, že na demostrační účely to stačí:

qry2

Pozor: Do objektu SqlDataReader není možné přistupovat jako do pole. Čtení se provádí po řádcích (na další se přejde příkazem Read). To proto, že řádky se čtou z databáze postupně. Celé je to z důvodu, aby se v případě velkého množství dat nemuselo všechno načítat do paměti. A nezapomeňte uzavřít po dokončení čtení SqlDataReader! Pokud to neuděláte, zůstane čtecí kanál otevřený a některé další operace můžou skončit s chybou.

Parametry

Dejme tomu, že chceme zobrazit všechny osoby, které jsou z jednoho určitého města. Dotaz je jednoduchý:

SELECT [Jmeno],[Mesto] FROM [SeznamKamaradu] WHERE [Mesto]='Město'

Pokud ale předem město neznáme a chceme aby si jej mohl uživatel sám zadat, nabízí se možnost SQL dotaz složit z řetězců. Například něco jako:

dotaz = "SELECT [Jmeno],[Mesto] FROM [SeznamKamaradu] WHERE [Mesto]='" + mesto + "'"

To je ale nepraktické a hlavně velmi nebezpečné. Případný útočník má totiž možnost ovlivnit přímo to, jak dotaz vypadá a tím pádem se mu otevírá řada cest jak uškodit. Co takhle kdyby zadal, že chce zobrazit lidi z města qry4 ? Celkový složený dotaz pak bude vypadat takhle:

qry3 

Tím se vytvoří složená podmínka, která bude vždy pravdivá (protože 'a' = 'a'). A tak se zobrazí uplně všichni z tabulky, což zajisté nechceme. Možná se to zdá nyní jako banalita, ale pokud by nastalo něco podobného u mazání záznamů, tak můžeme přijít úplně o všechny data v tabulce.

Jak to ale řešit?

Obecně existují 2 možnosti. První z nich je zdvojovat ukončovací znaky (v našem případě apostrof ' ). Bohužel již bylo dokázáno, že to není jediná slabina skládaných dotazů. A navíc se může celkem snadno stát, že na to zapomenete a tím otevřete útočníkovi virtuální dveře do své databáze. Naštěstí ale .NET a MSSQL nabízejí mnohem elegantnější a bezpečnější řešení. Je to používání parametrů. Díky nim můžete předat hodnotu přímo bez nutnosti ji začlenit do dotazovacího SQL řetězce. Takové proměnné označujeme znakem @. Ukážeme si jak se bude řešit výběr podle města pomocí parametrů:

SELECT [Jmeno],[Mesto] FROM [SeznamKamaradu] WHERE [Mesto]=@mesto

A zástupnou hodnotu pak přidáme do kolekce SqlCommand.Parameters. Toto řešení je naprosto bezpečné a celkem úhledné. Celý kód je zde:

VB.NET

        Dim sqlConnection As New SqlConnection(ConnectionString) ' inicializace objektu spojení na databázi
        Dim sqlCommand As New SqlCommand("SELECT [Jmeno],[Mesto] FROM [SeznamKamaradu] WHERE [Mesto]=@Mesto", sqlConnection) ' vytvoření dotazu a předání připojení

        Console.Write("Zadejte město: ") ' vyzvat k zadání
        sqlCommand.Parameters.AddWithValue("@Mesto", Console.ReadLine()) ' přidat parametr do dotazu

        sqlConnection.Open() ' pomocí dat z ConnectionStringu spojení otevřeme
        Dim dataReader As SqlDataReader = sqlCommand.ExecuteReader() ' spuštění dotazu a vytvoření objektu na čtení řádků

        ' smyčka na čtení záznamů
        Do While dataReader.Read ' posun na další řádky, dokud jsou k dispozici
            Console.WriteLine(String.Format("Záznam: {0} ({1})", dataReader("Jmeno"), dataReader("Mesto"))) ' zobrazí záznam
        Loop

        dataReader.Close() ' nejdříve uzavřeme aktuální dotaz
        sqlConnection.Close() ' a pak i spojení

C#

        SqlConnection sqlConnection = new SqlConnection(ConnectionString); // inicializace objektu spojení na databázi
        SqlCommand sqlCommand = new SqlCommand("SELECT [Jmeno],[Mesto] FROM [SeznamKamaradu] WHERE [Mesto]=@Mesto", sqlConnection); // vytvoření dotazu a předání připojení
        
        Console.Write("Zadejte město: "); // vyzvat k zadání
        sqlCommand.Parameters.AddWithValue("@Mesto", Console.ReadLine()); // přidat parametr do dotazu

        sqlConnection.Open(); // pomocí dat z ConnectionStringu spojení otevřeme
        SqlDataReader dataReader = sqlCommand.ExecuteReader(); // spuštění dotazu a vytvoření objektu na čtení řádků

        // smyčka na čtení záznamů
        while (dataReader.Read()) // posun na další řádky, dokud jsou k dispozici
        {
            Console.WriteLine(String.Format("Záznam: {0} ({1})", dataReader["Jmeno"], dataReader["Mesto"])); // zobrazí záznam
        }

        dataReader.Close(); // nejdříve uzavřeme aktuální dotaz
        sqlConnection.Close(); // a pak i spojení

Výsledný program by se měl při spuštění dotázat na město a pak vypsat všechny záznamy, které mu odpovídají. Možná města jsou: Praha, Liberec, Hradec Králové, Brno. Jen si dejte pozor na velikost písmen, pokud nenapíšete jméno města přesně, nenajde se z něj žádná odpovídající osoba.

qry5

Závěrem

To je pro dnešek asi všechno. Pokud máte jekékoliv dotazy, nestyďte se na ně zeptat v diskuzi. V příštím díle zkusím probram problematiku datových kolizí (zámky, izolace, transakce) a možná se dostane i na nejrůznější vychytávky MSSQL Serveru jako uložené procedury, triggery atp.

 

hodnocení článku

3 bodů / 3 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Mohlo by vás také zajímat

Co je to .NET Framework 4.5?

V tomto článku se snažím nastínit rozdíl mezi .NET 4 a .NET 4.5 z pohledu zpětné kompatibility.

Fulltext v prostředí Windows Azure

LINQ a Entity Framework - díl 3.: LINQ - Rozhraní Ienumerable, iqueryable a yield return

 

 

Nový příspěvek

 

Diskuse: Komunikace s MSSQL databází

Ahoj. Dělám projekt v programu Visual Web Developer 2005 a nevím si rady s jendím kodem jak by měl správně vypadat. Mám vytvořené tlačítko a DropDownList (ve kterém mám 5 jmen)+ tabulku (Databáze). Nyní potřebuji udělat to když vyberu v tom DropDownListu jednno jméno a kliknu na tlačítko tak aby se mi v tabulce objevily ,,příspěvky toho jména (Podle sloupce Učitel), ale bohužel mi to nefunguje. Zde mám kod který jse vymyslela. Prosím poraďte mi jakou chybu v kodu mám. Děkuji za každou radu

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)

SqlDataSource1.SelectCommand = "SELECT * FROM [Databáze]

WHERE učitel = ' " & DropDownList1.SelectedItem.ToString

& " '"

End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

dobrý den,

chápu dobře, že do "Do While" můžu místo:

Do While dataReader.Read ' posun na další řádky, dokud jsou k dispozici
            Console.WriteLine(String.Format("Záznam: {0} ({1})", dataReader("Jmeno"), dataReader("Mesto"))) ' zobrazí záznam
        Loop

napsat blablabla listview.itmes.add blabla a bude to fungovat?

proč se tedy ve většině "učebnic" (nebo spíš knih) používají jiné způsoby (adaptéry atp...)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím, fakt dobrý článok no potreboval by som pomôcť.

Pokiaľ sa k databáze pripájam cez sqlConnection tak ako to popisujete všetko je OK. Skúšal som k danej databáze pripojiť cez sqlDataSource – GridView. Tu nastane problém, nakoľko mi pôvodný kód pri sqlConnection.Open()vyhadzuje chybu: Nemožno otvoriť predvolenú databázu užívateľov. Prihlásenie zlyhalo. Aj keď fyzicky odstránim sqlDataSource – GridView chyba sa opakuje. Všetko sa vyrieši až pri reštarte PC. Neviem sa cez to dostať. Ako vyriešiť aby som sa mohol k databáze pripájať oboma spôsobmi naraz?

Vopred dík.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Tento článok mi velmi pomohol :-) Ďakujem

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

ze serial nepokracuje, tenhle clanek je hodne povedeny a moc mi pomohl.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tento článek nebyl zamýšlet jako seriál. Je to jen příručka jak použít komunikaci na nejnižší využitelné úrovni. Technologie, kterými pokračovat je celá řada.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Dobrý den, chtěl bych poprosit o radu: v MS Access jsem před několika roky vytvořil poměrně rozsáhlou databázovou aplikaci. Kvůli výkonu v provozu na síti jsem ji rozdělil na front-end (Access) umístěný na pracovních stanicích a back-end (MSSQL) běžící na serveru. Vzhledem k současnému rozšiřování aplikace chci front-end nebo alespoň některé jeho části přeprogramovat do vb.net, ale mám zkušenosti jen s VBA. Neporadil byste mi nějaké zdroje informací nejlépe na internetu, kde bych se mohl naučit resp. okoukat techniky ve windows application pro práci s databází tj. návrh formulářů podobných jako v Accessu, nastavení zdrojů dat a dalších vlastností prvků formulářů (např. seznamy, pole se seznamem, tabulky), správné techniky načtení dat do formulářů a naopak jejich uložení do databáze na serveru, uzamykání záznamů, transakce, vytvoření reportů navržených pro tisk, uživatelské účty, práva, zabezpečení, příp. vytvoření instalátoru aplikace a další potřebné praktické věci pro chod front-end aplikace. Předem děkuji.

Pavel

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

nemohl by prosím někdo popsat jak připojit databázi ve windows application,,děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravim,

trochu si ted nucene hraji s .Net a nejak se me nedari napojit se na databazi pod windowsAplication..

Nevite nekdo nejakej odkaz kde se to da nastudovat...napojeni, vkladani a zobrazeni dat.....diky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Připojování naleznete v tomto článku. Vkládání a úpravy už nejsou záležitostí jen .NET ale SQL obecně. Nebo jste snad měl na mysli jiný způsob zpracování dat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No ja mel takovou radost, kdyz jsem ten clanek objevil, ale potom jsem zjistil, ze je to vsechno pod ConsoleAplication.

Jenze ja bych to potreboval pod windowsAplication....

Tam je potreba namapovat dataset, datasource...atd....

to treba i mam, ale potom nevim jak vkladat data prez C#...

Nemuzu pridavat data, zobrazit je ....atd....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

zdravím,

ke komunikaci s win. app. nepotřebuješ používat dataset, taky s tím teď nuceně laboruju a v poho to používám bez něj. Vezmeš hodnoty z daného SQLDataReaderu pomocí metody Read() nebo jiných a místo na consoli ji vypíšeš do win...např. takto:

public TextBox tbSetsComment;
while (db.sqlReader.Read())
                {
                    TbSetsComment = (string)db.sqlReader["setComment"];
                }

nahlásit spamnahlásit spam 0 odpovědětodpovědět
/*Zasílám ti ukázku, jak se připojit ke vzdálenému serveru (zde je to xeon2). Zde vidíš ukázku připojení pomocí třídy Dataset. Ve winforms na ni můžeš navázat.
Milo*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace database
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection pripojeni = null;
            try
            {
               
                pripojeni = new SqlConnection(@"Server=xeon2\sqlexpress; database=bakalari; Integrated Security=yes ");
                pripojeni.Open();  
        
                //Zobrazení dat pomocí třídy DataSet - práce s odpojenými daty

                SqlDataAdapter SqlDataAdapter1 = new SqlDataAdapter(pripojeni.CreateCommand());
                Console.Write("Zadej přijmení učitele:");
                string jm = Console.ReadLine();
                SqlDataAdapter1.SelectCommand.CommandText = "SELECT * from ucitele where prijmeni like '" + jm + "%'";
                DataSet dataSet1 = new DataSet();
                SqlDataAdapter1.Fill(dataSet1, "ucitele");
                foreach (DataRow row in dataSet1.Tables["ucitele"].Rows)
                    {
                        Console.Write(row["jmeno"]+"   ");
                        Console.WriteLine(row["prijmeni"]);
                    }
                    dataSet1.Dispose();


                Console.ReadKey();
                pripojeni.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
            finally
            {
                try
                {
                    pripojeni.Close();
                }
                catch { }
            }
            {
            }

        }
    }
}

nahlásit spamnahlásit spam 0 odpovědětodpovědět

podařilo se ti připojit databázi ve winApl,, nemohl bys prosím popsat jak to udělat,, jsem uplný začátečník a nevim čeho se chytit,,děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Som zaciatocnik

Ako sa da odstranit chyba dole uvedena ?

Dim sqlConnection As New SqlConnection(ConnectionString) ' inicializace objektu spojení na databázi

type "SqlConnection" is not defined

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

je potřeba si naimportovat:

Imports System.Data.SqlClient

nebo to napsat celé:

Dim sqlConnection As New System.Data.SqlClient.SqlConnection(ConnectionString)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravim, dakujem chyba zmizla, ale objavila sa dalsia.

mam objednanu knihu Microsoft Visual Basic 2008 Express Edition -krok za krokom - hádam to vyrieši.

O čo mi vlastne ide vo VB06 som v pohode pracoval s databazami

cez prvok Data.

V Microsoft Visual Basic 2008 Express Edition je prvok DataSet

je to obdoba Data z VB06 ?

Vytvoril som si pokusne databasu z nazvom zakaznici a table Zakaznici s jednou polozkou Meno.Z DataSet vzniklo ZakazniciDataSet1.

Do textbox1 som cez application vložil do ZakazniciDataSet1 novu polozku Meno.

Chcem previest zapis cez textbox a opätovne načitanie do label,alebo pri viacerých zápisov načitanie v listbox.

DataGridView si nechavam na neskorsie preskumanie.

Viem , ze vyjadrujem sa dost neodborne, stare knihy nepomahaju,stare programy a rutiny som vymazal a pamäť po 3 rokoch nečinnosti je prazdna, takže začínam od začiatku.

Jedna sa mi o založenie database - niekolko zapisov mien a načitanie v listbox,ale len za použita programu Microsoft Visual Basic 2008 Express Edition, nie Microsoft SQL Server 2005- da sa to ? Potom by som sa určite rozbehol a dokončil program faktura, ktory som tu na na webe našiel.

Ešte ráz ďakujem

S pozdravom

Marcel

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Bodrý den, mám problém při tvorbě Query, postupuji jako Vy, dám New Query a vložím kód z této stránky, a při stisku F5 to nahlásí:Msg 262, Level 14, State 1, Line 1

CREATE TABLE permission denied in database 'TEST'.

Neví někdo proč?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím Tomáši,

jak mám využít connection string z automaticky vytvořeného config.app, jenž se vytvoří když pracuji s vizardem na připojení. Ten config.app je jiný, než uvádíte v článku. Vypadá takto:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="EvidenceMaterialu.My.MySettings.EvidenceMaterialConnectionString"
            connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Private\Databaze\EvidenceMaterial.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <system.diagnostics>
        <sources>
            <!-- This section defines the logging configuration for My.Application.Log -->
            <source name="DefaultSource" switchName="DefaultSwitch">
                <listeners>
                    <add name="FileLog"/>
                    <!-- Uncomment the below section to write to the Application Event Log -->
                    <!--<add name="EventLog"/>-->
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="DefaultSwitch" value="Information" />
        </switches>
        <sharedListeners>
            <add name="FileLog"
                 type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                 initializeData="FileLogWriter"/>
            <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
            <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
        </sharedListeners>
    </system.diagnostics>
</configuration>

No a já bych chtěl využít později v kódu tuhle uloženou proměnnou a neumím to odvodit - ten odkaz na

Dim ConnectionString As String = System.Configuration.ConfigurationSettings.AppSettings("DatabazeKamaradu")

bude jiný, ale jaký to netuším . Mohl by jste mi to trochu objasnit - pokud možno i principielně, neb bych tomu rád porozuměl. Díky.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím,

já jsem ukládal připojovací řetězec jinam. Je pravda, že by se měl asi spíš ukládat do sekce ConnectionString. Proto použijte kód:

Dim ConnString As String = ConfigurationManager.ConnectionStrings("EvidenceMaterialu.My.MySettings.EvidenceMaterialConnectionString").ConnectionString

Možná budete muset ale přidat referenci na System.Configuration.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky, funguje to. Tu referenci jsem musel přidat. Přiznám se, že jmenné prostory mi dávají strašně zabrat, jelikož neznám souvislosti a tak je to pro mne dost nepochopitelné. Ještě jednou díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diky za super clanek, je bych rad vedel, jak vlozit data do datagridu, ktery mam na formulari, kdyz provedu SQL dotaz. Diky za pomoc, pokud by se nekdo zajimal, muzu poslat projekt.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Presne toto mi chýbalo. Obidvom Vám ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Ahoj, v programování jsem začátečník a Tvůj "tutoriál" mi velmi pomohl s připojením DB. Zkoušel jsem přímo z kódu zapsat data do databáze.. Je to možné? Zkoušel jsem:


SqlCommand zapisuzivatele = new SqlCommand(INSERT INTO SeznamKamaradu ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1988-7-2','Adam','Vávra','Vlčice'),sqlConnection);

nechce to ale chodit...:-( Děkuju Adam

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ak Ti to beží, tak tu nad Tebou su dvaja, ktorým to pripojenie nefunguje. Prečo im neporadíš?

Inak, keď zapíšem celý ConnectionString, tak to fachčí

 Dim ConnectionString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\Data\kamaradi.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True"

Kde je zrada?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, protože výše popsaná chyba se týka jen konfiguračního manageru obstarávajícího načítání konfigurace. Pokud konfiguraci v souboru config nevyužijete a nadefinujete si připojovací řetězec přímo, pak vše chodí.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ďakujem za odpoveď! Je mi to jasné. Lenže, keď odporúčate použiť konfiguračný manager. Chcel by som zvládnuť aj toto. A bohužiaľ neviem prísť na to, že kde je chyba. Príjemný večer!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Textové hodnoty je nutné uzavírat mezi uvozovky, tedy:

SqlCommand zapisuzivatele = new SqlCommand("INSERT INTO SeznamKamaradu ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1988-7-2','Adam','Vávra','Vlčice'"),sqlConnection);
 

Ale jinak kód vypadá v pořádku. Jen bych možná ještě označil texty s diakritikou písmenem N, aby se zpracovávali jako UNICODE a nehrozilo tak rozházení háčků a čárek:

SqlCommand zapisuzivatele = new SqlCommand("INSERT INTO SeznamKamaradu ([DatumNarozeni],[Jmeno],[Prijmeni],[Mesto]) VALUES ('1988-7-2',N'Adam',N'Vávra',N'Vlčice'"),sqlConnection);
 
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím,

chtěl bych se zeptat, zda je možno z C# vytvořit tabulku databáze.

Použil jsem kód

SqlCommand vytvordatabazi = new SqlCommand("CREATE TABLE [NovaTabulka] ([Jmeno]NVARCHAR(100),[Prijmeni]NVARCHAR(100)", sqlConnection); 
vytvordatabazi.ExecuteNonQuery();

SqlCommand zapisuzivatele = new SqlCommand("INSERT INTO [NovaTabulka] ([Jmeno],[Prijmeni]) VALUES ('MojeJmeno','MojePrijmeni')", sqlConnection);
zapisuzivatele.ExecuteNonQuery();

Nebude chyba v části "vytvordatabazi.ExecuteNonQuery();" ???

Honza

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Mohl by mi někdo poradit čím to může být - objevuje se mi chybová hláška:

'ConfigurationManager' is not a member of 'Configuration'.

ConfigurationManager patří pod namespace System.Configuration nevím si rady???

Kod mám zapsaný takto(teprve začínám):

Imports System.Data.SqlClient
Imports System.Configuration

Module Module1
    Public Sub Main()
        Dim ConnectionString As String = System.Configuration.ConfigurationManager.AppSettings("DatabazeKamaradu")


        ' > sem budeme vkládat funkční kód <

        Console.ReadKey() ' vyčká na stisknutí klávesy, ať hned nezmizí výpis
    End Sub
End Module

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ten istý problém mám aj ja. Za prípadné usmernenie ďakujem.

Používam MVB 2008 EE.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V diskuzi o několik příspěvků nahoru jsme to už řešili. Zkuste přidat referenci na System.Configuration. Napište, jestli to pomohlo.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím,

chci začít pracovat s databázemi, ale mám jeden dotaz: je potřeba mít nainstalovaný SqlServer? Databázi nechci mít na localhostu (mám ji na mysql.ic.cz) a nevím, jestli je skutečně nutné tento nástroj mít. Pro můj projekt je zásadní číst a psát data do tabulek, ale ne pracovat s tabulkami a databázi mi ic povolí stejně jen jednu. Když se ale pokouším přistoupit k databázi, vyskočí mi chyba: 40 - Could not open a connection to SQL Server

Znamená to tedy, že SqlServer je nutností?

Dík za odpověď a omluvu za dost možná stupidní dotaz

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

databázi představuje server, takže ano, musíte mít nainstalovaný někde SQL Server. Je jedno jestli je to na localhostu nebo v internetu. Nezapomínejte, že SQL Server není jen jeden a tento článek pojednává jen o komunikaci s Microsoft SQL Serverem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji, až teď mi dochází, že problém bude jinde, zřejmě se snažím spojit s jiným než MS sql serverem, takže tady je chyba. Každopádně dík za odpověď, teĎ již vím, kam se zaměřit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podle adresy na kterou jste se chtěl připojit to vypadá, že máte k dispozici MySQL databázový server. Pro ten lze stáhnout také komunikační modul na stránkách společnosti Sun:

http://www.mysql.com/products/connector/...

Ovšem kód z článku s tím fungovat nebude.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Nastuduji si ten modul a pokusím se stvořit nějaký kód.

Velký dík.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den, našel jsem tyto zajímavé stránky a hledám jak postupovat. Dopusud používám databaze Accessu ve spojení s VB5,6 a VBA v Excelu, Protože mám problém ve VB.NET, zaujal mne popsaný postup ohledně SQL. A teď dotaz: Vytvořil jsem databázi v SSMS ve VB2008EE jsem vytvoři program na čtení DB. Podle Vašeho návodu to vše pracuje OK. Ale jak mohu databázi přenést na jiné PC, do jiné sítě ? Musí mít každý počítač kde má program pracovat, nainstalovaný SQL Server ? Asi ano a to server kde bude umístněna moje DB ? A podobně to bude s pro web, že ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den, instalovat SQL Servery není asi vhodné na každou stanici, pokud k tomu nemáte pádný důvod. Raději bych doporučil Sql Server Compact Edition (http://www.vbnet.cz/blog-clanek--39-sql_... ), který nepotřebuje databázový server. Druhá obvyklejší možnost je umístění databáze na místním serveru (k němu pak přistupujete po síti nebo přes nějakou serverovou aplikaci, která data poskytuje). Každý podnikový server by měl mít databázi. A co se týče webů, tam je naprosto běžná instalace databázového serveru vedle webový server.

K přenosu databází máme obecně 2 možnosti.

První je napsání (nebo vygenerování) SQL scriptu, který uvede po spuštění prázdnou databázi do požadovaného stavu. Musí obsahovat vytváření tabulek, klíčů, indexů, uložených procedur, trigerů a samozřjmně i vkládání dat.

Druhá možnost je vhodnější na plnější databáze a často je i jednodušší. Vytvoříme si v SSMS zálohu databáze (pravé tlačítko nad databází, položka Task => Back Up / Restore), tu přeneseme na druhý server a tam ji obdobným způsobem obnovíme. Nevýhodou je, že musíme mít přímý přístup k souborovému systému a zvlášť na webových serverem tomu tak často není (máme jen přístup na ftp a webové rozhraní pro databáze).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

zdravím, mám problém se zápisem do databáze zkrs vb. V kapitole máš jen příklad čtení. Zkoušel sem to hledat na iternetu ale vždy je to popsané velice zmatečně popřípadně jestli nevíš o ňáké literatůře kde je popsaná práce s sql databází pomocí vb-čka.

Předem Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vkládání dat není jiného než příkaz ve formátu:

INSERT INTO [JmenoTabulky]

([Sloupec1],[Sloupec2])

VALUES

(@hodnota1,@hodnota2)

Vy přikáz vyvoláte pomocí ExecuteNonQuery, protože neočekáváte žádnou návratovou hodnotu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Potřeboval bych v connectionString použít proměnnou pro zadání názvu a umístění databáze.

Současný stav:

    <connectionStrings>
        <add name="WinCom8.My.MySettings.WinCom8ConnectionString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\WinCom8.accdb"
            providerName="System.Data.OleDb" />
    </connectionStrings>

no a místo Data Source=|DataDirectory|\WinCom8.accdb bych potřeboval něco takového: Data Source="UmisteniDatabaze"

Nevím ani kde tu proměnnou naplnit. Bohužel s programováním začínám :-(

Předem děkuji za pomoc

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Dobrý večer.

Měl bych jeden dotaz, možná nevhodnej, ale už nevim.

Mám OleDB databázi, jedna tabulka jeden řádek.

Provedu spojení, přečtení atd. (v pohodě).

Provedu INSERT INTO nového řádku (v pohodě).

Provedu znovunačtení dat a data jsou všechny (podle count)

I array pole má všechny data.

Ukončim program a znovu spustim a mám pouze první řádek.

Další nové mi tam chybí.

Nemusim databázi nějak říct aby provedla fyzicky zápis dat?

Děkuji za skvělé články.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud nejde o nějaký speciální druh databáze jako XML, tak ne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není to žádná speciální databáze. Prostá Microsoft Aces, ale problém byl v uložení. Měl jsem ji uloženou v projektu. Při spuštění mi ji přesunul do Debug a tam s ní pracoval. Při dalším spuštění ji zase přepsal z toho zdrojovýho souboru a to bylo ono.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím, potřeboval bych vypsat celou strukturu všech databází na mém lokálním MsSQL serveru, ale vůbec nevím jak an to. Neznáte někdo způsob jak například dostat strukturu všech databází do Treeview nebo nějakýho Gridu. Díky za každou radu! Čau

nahlásit spamnahlásit spam 0 odpovědětodpovědět

K tomu slouží informační schémata:

http://msdn2.microsoft.com/en-us/library...

Postupně si nechce dotazy vypsat seznam databází, pak tabulek a sloupců. Bude to docela pracné, pokud chcete vypsat informace do podrobna, ale píše se to docela hezky.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za odpověď, jsem docela začátečník OOP a C# a tak se chci zeptat, jestli by si mi nemohl třeba napsat kód pro vypsání jen názvů databází do Treeviewu.Myslím, že když to uvidím, lépe to pochopím. Díky ještě jednou

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě něco, abyste mi rozuměl. Ten k´d bych uvítal opravdu mnoho, protože nevím, kde a jak ten dotaz mám vykonávat. Při načítání dat z databáze musím v ConnectionStringu zadat jméno databáze, se kterou budu pracovat a potom tím pádem asi už nemohu vypisovat všechny názvy databází, že? Mnohokrát díky za pomoc

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ahoj..

Zajímám se o to sámé ..

Jak na to ????

Prosím!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Ahojky Tome,

moc děkuji za výborné články k Express vývojovým produktům. Mám na tebe dotaz. Literatury k těmto tématům je velká spousta, můžeš prosím poradit knihy, které sám považuješ za dobře napsané ?

Dík za tipy.

Ivo

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím,

s tím ti asi neporadím. Nepreferuji učení z knížek. Alespoň ne co se týče programování, databází atp.

Ale pokud napíšeš co tě konkrétně zajímá, můžu se podívat po nějakých dobrých článcích (tedy jetli nevadí angličtina).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za promptní reakci. Zajímá mne vše kolem MS SQL Express, od instalace počínaje, přes možnosti services, zda existují nějaké doplňky pro usnadnění formulářů či sestav, nebo je nutné vše vlastním kódem vystavět od začátku ?

Dík za info.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusím to popsat v dalších článcích. Příště se budu zajímat o funkce T-SQL a článek potom o bezpečnost nebo návrh databází. Pokusím se v něm zahrnout tyto otázky.

Ale vzpomínám si, že pokud jde o MSSQL Server, tak mám přeci jen výbornou knížku. Až budu doma, pošlu její název.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tady je odkaz na tu knížku:

http://zonerpress.cz/pro-programatory/ve...

Nedá se podle toho naučit vše, chce to kolem toho taky lítat dost po netu, když se to člověk trochu naučí, tak poslouží i jako výborná příručka.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mám takovou otázku

mám projekt ASP.NET s databází, se zobrazením v browseru na PC

a navíc jedna z možností projektu je i verze pro PDA (na WIN)

Problém je s databází ...

A aby toho nebylo málo, tak je požadavek, aby se dala aplikace na PDA využívat offline

Hrozím se toho, jak to bude se synchronizací databáze

řešil někdo tzv. replikace? jde to vůbec na "fre" verzích SQL

Takže díky za jakoukoliv inspiraci, nakopnutí :-D

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím, článek je pěkný a pěkně polopatický. Já přeci jen už s DB pracuji běžně ale přesto si tam něco najdu. Tak jsem narazil na svůj odvěký problém - získání conect. stringu z app.config ze sekce <connectionStrings> (z <appSettings> je to hračka). ConfigurationManager chodí normálně v ASP.NET ve web.config ale ve VB.NET (VS2008 EE) není obsžen v System.Configuration ani kdybych spontálně defekoval. Dokonce jsem si všiml že v různých příkladech na webu všichni používají umístění do appSettings a asi k tomu mají důvod. Tak to je jedna věc co mi leží na osrdí.

Z trochu jiného soudku - zajímalo by mne jak je zajištěn přenos conn-stringu mezi webovým serverem a datovým SQL serverem umístěným na jiném místě v síti (funguje to sqěle ale UID i Pass se motají po drátech či v luftu), případně jak to mohu ovlivnit? Omlouvám se za ukecanost a díky za případnou odpověď.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Problém s connection stringem jsem popsal v diskuzi k tomuto článku již o kus výš. Pokud jde o přenášení hesla po síti, tak záleží na nastavení. Přesně vám to neřeknu, ale máte možnost Encrypt connection a ta zapříčiní bezpečně přenášet v SSL kanálu všechna data.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím, mám problém s kodem, který jsi použil jako ukázku odkazu na promennou v SQL dotazu.

mám kod:

string name = "setName";
sqlCmd = new SqlCommand("SELECT @Name FROM Configuration.Sets", join);
sqlCmd.Parameters.AddWithValue("@Name",name);

pokud chci potom vypsat výsledek, vyhodí mi to výjimku indexOutOfRange u db.sqlReader["setName"]...když vypíšu výsledek, je tam setName a ne hodnoty ze setName v DB. Pokud do SELECTu zadám hodnotu setName ručně všechno pracuje správně

if (db.sqlReader != null)
            {
                while (db.sqlReader.Read())
                {
                    Console.WriteLine("{0}", db.sqlReader[0]);
                    lbSets.Items.Add(db.sqlReader["setName"]);

                }

            }

Díky za rady, vůbec nevím, proč to je.

Použil bych i ten klasický postup, ale jak jsi upozornil, může to být rizikové.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím, mám problém. Udělal jsem vše jak se píše ale nejsem si jistý zda dobře.. spíš ne protože to nejde. Co jsem udělal:

1. Ve VWD2005 jsem do default.aspx.vb zadal zdrojaky, ktere jsou popsány výše

2. pustím a hodí to hlášku že tento příkaz je zastaralý

3. změním na nový a hláška zmizí

4. avšak nic to nikde nevypisuje.. jen čistá stránka

Jak dál? Potřebuju vypsat obsah databáze s různými podmínkami na své stránky a bohužel komponenty, které VWD2005 nabízí mnou požadované funkce nemají. Řešení je použít čistě VB a následně výsledek vypsat do objektů. Ale nedaří se :-( Prosím o radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Uvede kód, který nefunguje? Bez něj těžko poznám kde je chyba. A taky co přesně nejde s prvky v ASP.NET zobrazit? To, že to nefunguje nebo nejde nám moc neřekne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím autora článku. Jde mi o to, že soubor "app.config", který je potřeba vložit do projektu jako "Application Configuration File" neumím ve 2005Express studiu vložit - nenašel jsem tam ten typ. Vytvořil jsem ho tedy ručně a vložil přes vlastnosti projektu - Resources. Vše funguje tak jak má, jen studio hlásí v řákdu

Dim ConnectionString As String = System.Configuration.ConfigurationSettings.AppSettings("DatabazeKamaradu")

tuto chybu:

Warning 1 'Public Shared ReadOnly Property AppSettings() As System.Collections.Specialized.NameValueCollection' is obsolete: 'This method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings' C:\Private\Visual Studio 2005\Projects\Kamarádi\ConsoleApplication1\Module1.vb 4 42 ConsoleApplication1

Co mám špatně ?

Děkuji a moc Vám i kolegovi Hercegovi fandím.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím,

máte pravdu, v 2005 Express nejde vložit přímo soubor app.config. Nejjednodušší je asi vložit textový soubor a přejmenovat ho.

A ohledně toho warningu, nechal jsem se unést .NET 1.1 a použil jsem starší konstrukci. Je to moje chyba, omlouvám se. Pokud chcete aby warning zmizel, přidejte si do projektu referenci na System.Configuration a řádek změnte na:

Dim ConnectionString As String = System.Configuration.ConfigurationManager.AppSettings("DatabazeKamaradu")
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Pomalu mi začíná v lecčems svítat, ale převést zde uvedený postup do WindowsAplikace prostě nezvládám - poradí někdo?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Dobrý den,

někde na webu jsem viděl, že se k databázi připojují pomocí OleDB. Moc do toho nevidím (používají konstrukce DataSet, Data Adapter) - v čem je rozdíl a proč preferujete vámi popsaný způsob?

Děkuji za názor.

Honza

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

OleDB je řešení jak komunikovat s databázemi obecně. Já se ale přikláním k využití SqlClient, protože byl napsán na míru MSSQL Serveru a tím pádem dokáže jeho možnosti lépe a efektivněji využít.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím všechny,

už nějakou chvíli dělám aplikace ve VB .NET na propojování s databází MySQL a tento zpusob se mi nezdá jako špatný nápad. Obvzlášť pokuď potřebuji použít neboundovaný prvek na zobrazení dat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Mám otvoriť Visual Studio. Ktoré, prosím? Mám ho?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Buď Visual Studio verze 2005 nebo, pokud chcete 2008. Pokud nemáte zakoupenou plnou verzi, použijte Express edici, která je zdarma a pro tento způsob komunikace s databází 100% postačuje.

Zde jsou odkazy na downloady: http://www.vbnet.cz/clanek--25-linkarna....

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Komunikace s MSSQL databází

Zdravím vás a kromě pochvaly na celou sadu vašich článků mám dotaz: lze ve VB2005 Express pracovat i s jinými databázemi (třeba "velký MS SQL 2005 Server, Oracle)? Nebo je varianta Express omezena jen na práci s SQL 2005 Express?

Děkuji. Honza

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

to jestli je databáze nebo Visual Studio v edici Express nebo ne, je úplně jedno, všechno spolu komunikuje stejným způsobem. Express edice znamená (ve většině případů) jen absenci nástrojů, které využijí spíše jen opravdu velké firmy.

A pokud jde o připojení na jiné druhy databází (Oracle, MySQL), tak musíte hledat na internetu, každá slušná databáze má knihovny pro komunikaci volně ke stažení na svých stránkách.

Například pro Oracle je to zde: http://www.oracle.com/technology/softwar...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověď. Možná jsem měl ještě otázku doplnit o to, zda verze Express umí pracovat s databází, která není na stejném stroji jako VB2005Exp - např. přistupovat po síti na nějaký jiný MSSQL server. Ptám se proto, že ačkoliv mi váš upravený příklad lokálně funguje (s připojením na lokálni MSSQL 2005 Express), tak po síti se na plný MSSQL 2005 Server nepřipojím - hlásí mi to timeout (ale třeba z Management Studia databázi visím).

Imports System.Data.SqlClient
Module Module1

    Sub Main()
        Dim Connect As SqlConnection = New SqlConnection
        Connect.ConnectionString = "workstation id=mojePC;packet size=4096;user id=sa;data source=192.168.1.1;persist security info=True;initial catalog=test;password=psswd;"
        Dim sqlcommand As New SqlCommand("select * from dbo.tabulka", Connect)
        Connect.Open()

        Dim dataReader As SqlDataReader = sqlcommand.ExecuteReader() ' spuštění dotazu a vytvoření objektu na čtení řádků

        ' smyčka na čtení záznamů
        Do While dataReader.Read ' posun na další řádky, dokud jsou k dispozici
            Console.WriteLine(String.Format("Záznam: {0}", dataReader("Nazev"))) ' zobrazí záznam
        Loop

        Console.ReadKey()
        Connect.Close()

    End Sub

End Module

Děkuji. Zdraví Honza Rok

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Express nástroje nejsou omezené na připojování jen k lokálnímu stroji. Zkuste použít connection string bez té položky Workstation ID a pokud to stjeně nepůjde, klepněte ve Visual Studiu v záložce Server Explorer na Connect to database a průvodce Vám pomůže připojení vytvořit. Pak klepnete na Advanced a tam budete mít dole zobrazený požadovaný connection string.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za Vaše články.

Lze se z VB 2005 Express připojit na SQL Server Express,který není na lokálním stroji? Nemám v tom stále jasno,někde i tvrdí,že se to vůbec nelze v express verzi,jen lokálně,ale vidím,že to omezené není.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nějak se mi to stále nedaří. V Database Explorer vyberu Connect to database a zde se mi nabízí Microsoft SQL database file. V popisu je psáno: Use this selection to attach a database file to a local Microsoft SQL server instance ...

Z toho mi vyplývá, že se to na vzdálený databázový server ve verzi Express připojit nedá. Navíc mám dojem, že to nabízí připojení přímo k mdf souboru databáze, nikoliv k SQL instanci.

H.R.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://idealprogrammer.com/category/lang...

Zde se říká:

"The Visual Studio Express Editions include SQL Server 2005 Express Edition with them to allow you to design your applications around a local database. However, you can not make remote connections to databases not located on your machine. All full versions of Visual Studio 2005 do allow you to connect to remote databases."

Takže k db na jiném stroji se nepřipojím... :-((

h.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ve specifikacích SQL Server 2005 Express jsem nenašel informace o omezení připojení ze sítě. Tady je návod přímo od Microsftu jak vše povolit:

http://blogs.msdn.com/sqlexpress/archive...

Chyba je v tom, že Express edice má ze základu vzdálené připojení vypnuté.

Bohužel na internetu koluje řada chybných informací od lidí, kteří si to co píší ani neověří.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Asi jsem se špatně vyjádřil: nejde o to, že bych se k SQL 2005 Express nepřipojil vzdáleně - tohle mi funguje (třeba pomocí php skriptu se připojím).

Jde mi o to, že se z prostředí jazyka VB2005 EXPRESS nepřipojím na žádnou vzdálenou databázi (MS SQL 2005, MS SQL 2005 Express, MYSQL). VB2005 EXPRESS mi v Database Explorer nabízí jen připojení k MS SQL Database File, tzn., že v mém případě bych se mohl připojit na vzdálený soubor mdf, ale nikoliv na databázi. Připojení na soubor znamená mít přístup na nějaké sdílení, což není nejvhodnější.

Takže nevím, zda to pomocí VB2005 verze EXPRESS lze vůbec nějak vyřešit (a tudíž teď já dělám něco špatně) anebo to verze EXPRESS neumí vůbec a můsím použít třeba VB2005 Standard.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Metodou pokus-omyl jsem došel k tomu, že připojit se na vzdálenou databázi lze, jen ten conncetion string se musí napsat ručně. Naklikat z prostředí VB2005 Exp. to nejde, stejně jako nejde z prostředí pracovat s SQL 2005 Express (tvořit tabulky, psát dotazy).

H.R.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu, v Express verze nejsou v providerech přo přidání databáze všechny provideři. Proto musíte opravdu zapsat connection string ručně. Ale připojení funguje normálně. Pro administraci použijte Management Studio.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

OK. Hlavně už mám jasno. A s omezením Express nástrojů se smířím.

Hezký den.

H.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback