--
P i o t r P a k o s
email: ppakos@[NO_SPAM]tlen.pl
gsm: 888211926
gg: 21094
> Mam bazę danych w formacie MS Access (.mdb), jak uzyskać do niej
> dostęp z poziomu Visual C++ .NET?
Zarowno C++ jak i rodzina jezykow technologii .NET (C#, VB.NET)
posiada "bindings" do baz danych silinka JetEngine, a konkretnie
chodzi o ADODB i ADO.NET oraz DAO i ODBC w przypadku C/C++ (
DAO dla .NET chyba nie ma, ODBC OLEDB Provider dla .NET pewnie
sie znajdzie)
Ciao, Smyk
--
Fju fju - powiedział Ćwirek
W sumie, to nie ma specjalnego znaczenia czy baza jest obsługiwana za pomocą
Jeta, czy też MS SQL - jeśli korzystasz z ADO.NET i providera OleDb, to kod
będzie w dużej części identyczny, np. kod działający zarówno w Accessie jak
i SQL Serverze:
#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;
using namespace System::Data::OleDb;
__gc public class Testy
{
private:
OleDbConnection* con;
public:
Testy()
{
//zamiast odwoływać się do pliku udl, możesz wpisać
//connection string z ręki
con = new OleDbConnection("File name=E:\\myConnect.udl");
}
void TworzTab()
{
String *sql =
"Create Table MojaTabelka("
" IdRek Int Identity(1,1) Constraint Pk Primary Key,"
" Imie VarChar(20),"
" Nazwisko Varchar(30)"
")";
OleDbCommand* myCom = new OleDbCommand(sql, con);
con->Open();
try
{
myCom->ExecuteNonQuery();
}
catch(OleDbException* ex)
{
System::Console::WriteLine(ex->Message);
}
con->Close();
}
void DodRekTab()
{
String* sql = "Insert Into MojaTabelka (Imie, Nazwisko) "
"Values('Rafał', 'Posmyk')";
OleDbCommand* myCom = new OleDbCommand(sql, con);
con->Open();
myCom->ExecuteNonQuery();
myCom->CommandText = "Insert Into MojaTabelka (Imie, Nazwisko) "
"Values('Piotr', 'Pakos')";
myCom->ExecuteNonQuery();
myCom->CommandText = "Insert Into MojaTabelka (Imie, Nazwisko) "
"Values('Krzysztof', 'Naworyta')";
myCom->ExecuteNonQuery();
con->Close();
}
void PokazTab()
{
String *sql = "Select * From MojaTabelka";
OleDbCommand* myCom = new OleDbCommand(sql, con);
con->Open();
OleDbDataReader* myRead = myCom->ExecuteReader();
while(myRead->Read())
{
System::Console::WriteLine("{0}\t{1}\t{2}",
myRead->GetInt32(0).ToString(),
myRead->GetString(1),
myRead->GetString(2));
}
con->Close();
}
void KasTab()
{
String *sql = "Drop Table MojaTabelka";
OleDbCommand* myCom = new OleDbCommand(sql, con);
con->Open();
myCom->ExecuteNonQuery();
con->Close();
}
};
int _tmain()
{
Testy* t = new Testy();
t->TworzTab();
t->DodRekTab();
t->PokazTab();
t->KasTab();
Console::WriteLine("Koniec roboty");
Console::ReadLine();
return 0;
}
Na sieci znajdziesz sporo przykładów, zwłaszcza do c# (który zreszto wydaje
mi się dużo zgrabniejszy niż mc++) lub vb.net. W sumie to nie ma znaczenia w
jakim języku są napisane, bo korzystanie z bibliotek frameworkowych jest
niemal identyczne.
Pozdrawiam
Grzegorz
Czy mogę zamienić w powyższym przykładzie "myConnect.udl" plikiem
msaccessa .mdb?
Możesz zamienić na pełny connection string, np (Access):
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Development\Aplikacje
Access\Testy\MojaBaza.mdb;Persist Security Info=False
albo (serwer MsSQL):
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=Northwind;Data Source=GDNBOOK
itd.
Aby szybko utworzyć prawidłowy ConnectionString, to najlepiej i tak posłużyć
się udl:
1) nowy plik tekstowy, zmienić rozszerzenie na udl,
2) kliknąć go dwukrotnie - powinien się otworzyć "Microsoft Data Access" -
wybrać odpowiednie źródło, sprawdzić klikając na "Testuj połączenie",
3) po zamknięciu apletu z punktu 2. otworzyć plik udl w dowolnym edytorze,
np. notatniku, wordpadzie i skopiować zawartą tam ścieżkę.
Można też skorzystać z pomocy na sieci, np.:
http://www.connectionstrings.com/
Jednak moim zdaniem, na początku odwoływanie się do zewnętrznego pliku udl,
jest bardzo wygodne :-).
Pozdrawiam
Grzegorz