FAQ C++/CLI et VC++.Net
FAQ C++/CLI et VC++.NetConsultez toutes les FAQ
Nombre d'auteurs : 29, nombre de questions : 248, création le 22 février 2013
- Qu'est-ce que ADO.NET ?
- Quelles classes utiliser pour me connecter à ma base de donnée ?
- Comment se connecter à une base de données ?
- Comment exécuter une requête SELECT ?
- Comment exécuter une requête non SELECT ?
- Comment exécuter une requête paramétrée ?
- Comment exécuter une requête dont le texte comprend une quote simple ?
- Comment puis-je exécuter une procédure stockée ?
- Comment écrire le contenu de ma table dans un fichier XML ?
Cette définition est tirée de MSDN
ADO.NET propose un accès cohérent à des sources de données telles que Microsoft SQL Server, ainsi qu'à des sources de données exposées via OLE DB et XML. Des applications grand public de partage de données peuvent utiliser ADO.NET pour se connecter à des sources de données et extraire, manipuler et mettre à jour des données.
Lien : Vue d'ensemble d'ADO.NET
Le .NET Framework dispose de plusieurs namespaces permettant de se connecter à divers SGBD.
- System::Data::SqlClient pour SQL Server
- System::Data::Odbc pour les SGBD fournissant un pilote ODBC
- Oracle::DataAcess (de ORACLE) pour ORACLE. Disponible en installant Oracle Data Provider .NET (ODP .NET)
- System::Data::Oracle::Client (de Microsoft) pour Oracle
- System::Data::OleDb pour tous les SGBD ayant un fournisseur OLE DB
Voici un exemple pour SQL Server :
using
namespace
System::Data::
SqlClient;
try
{
// Chaîne de connexion
String ^
connectString =
"database=test_paresco;server=am01;User ID=BACK;pwd=xxxxxx"
;
// Objet connection
SqlConnection ^
connection =
gcnew SqlConnection(connectString);
// Ouverture
connection->
Open();
// Fermeture
connection->
Close();
}
catch
(Exception ^
ex)
{
System::Diagnostics::Debug::
WriteLine(ex->
ToString());
}
On utilise les objets Command et DataReader.
Exemple avec SQL Server :
// Chaîne de connexion
String ^
connectString =
"database=test_paresco;server=am01;User ID=BACK;pwd=xxxxxx"
;
// Objet connection
SqlConnection ^
connection =
gcnew SqlConnection(connectString);
// Ouverture
connection->
Open();
// Objet Command
SqlCommand ^
command =
gcnew SqlCommand("SELECT * FROM usr_contract"
, connection);
// Objet DataReader
SqlDataReader ^
reader =
command->
ExecuteReader();
array<
Object ^>
^
row =
gcnew array<
Object ^>
(reader->
FieldCount);
while
(reader->
Read())
{
reader->
GetValues(row);
for
(int
i=
0
; i<
row->
GetLength(0
); i++
)
{
if
(row[i] !=
DBNull::
Value)
Console::
Write(row[i]);
else
Console::
Write("NULL"
);
if
(i<
row->
GetUpperBound(0
))
Console::
Write("|"
);
}
Console::
WriteLine();
}
// Fermeture reader
reader->
Close();
// Fermeture connection
connection->
Close();
On utilise la méthode ExecuteNonQuery de l'objet Command.
Exemple avec SqlServer :
// Chaîne de connexion
String ^
connectString =
"database=test_paresco;server=am01;User ID=BACK;pwd=xxxxxx"
;
// Objet connection
SqlConnection ^
connection =
gcnew SqlConnection(connectString);
// Ouverture
connection->
Open();
// Objet Command
SqlCommand ^
command =
gcnew SqlCommand("UPDATE usr_contract set ctr_n = ctr_n + 1"
, connection);
// Execution
int
affectedrows =
command->
ExecuteNonQuery();
Console::
WriteLine("Nombre de lignes affectées {0}"
, affectedrows);
// Fermeture connection
connection->
Close();
Il est possible de passer des paramètres à des requêtes SQL.
Exemple avec SQL Server :
using
namespace
System::Data::
SqlClient;
using
namespace
System::
Data;
// Chaîne de connexion
String ^
connectString =
"database=test_paresco;server=am01;User ID=BACK;pwd=xxxxxx"
;
// Objet connection
SqlConnection ^
connection =
gcnew SqlConnection(connectString);
// Ouverture
connection->
Open();
// Objet Command
SqlCommand ^
command =
gcnew SqlCommand("SELECT * FROM usr_contract WHERE "
+
"ctr_ref = @contract AND ctr_exg_ref = @exg"
,
connection);
// Paramètres
command->
Parameters->
Add(gcnew SqlParameter("@contract"
, SqlDbType::
VarChar, 5
));
command->
Parameters["@contract"
]->
Value =
"FTE"
;
command->
Parameters->
Add(gcnew SqlParameter("@exg"
, SqlDbType::
VarChar, 8
));
command->
Parameters["@exg"
]->
Value =
"SBF"
;
// Object datareader
SqlDataReader ^
reader =
command->
ExecuteReader();
array<
Object ^>
^
row =
gcnew array<
Object ^>
(reader->
FieldCount);
while
(reader->
Read())
{
reader->
GetValues(row);
for
(int
i=
0
; i<
row->
GetLength(0
); i++
)
{
if
(row[i] !=
DBNull::
Value)
Console::
Write(row[i]);
else
Console::
Write("NULL"
);
if
(i<
row->
GetUpperBound(0
))
Console::
Write("|"
);
}
Console::
WriteLine();
}
// Fermeture reader
reader->
Close();
// Fermeture base
connection->
Close();
Pour exécuter une requête contenant une quote simple, il faut utiliser les requêtes paramétrées.
On peut aussi faire plus simple en doublant les quotes avant d'exécuter la requête.
String ^
sql =
"SELECT * FROM pasta WHERE name = 'aujourd''hui'"
;
// Ou
String ^
name =
"aujourd'hui"
;
sql =
"SELECT * FROM pasta WHERE name = "
+
name->
Replace("'"
, "''"
);
Pour pouvoir exécuter une procédure stockée, vous devez utiliser un objet SqlCommand et indiquer à sa propriété CommandType que vous désirez utiliser une procédure stockée :
// Objet SqlCommand
SqlCommand ^
cmd =
gcnew SqlCommand();
// On indique que l'on souhaite utiliser une procédure stockée
cmd->
CommandType =
CommandType::
StoredProcedure;
// On donne le nom de cette procédure stockée
cmd->
CommandText =
"CustOrderHist"
;
En utilisant un DataSet et sa méthode WriteXml, vous avez la possibilité d'écrire le contenu d'une table dans un fichier XML.
// Création de la chaîne de connexion
String ^
_ConnectionString =
"Server=Srv1;Database=Northwind;User ID=sa;Password=asdasd"
;
// Création de la connexion
SqlConnection ^
_SqlConnection =
gcnew SqlConnection();
_SqlConnection->
ConnectionString =
_ConnectionString;
// Création du SqlDataAdapter
SqlDataAdapter ^
da =
gcnew SqlDataAdapter("Select * from Customers"
, _SqlConnection);
// Création d'un DataSet
DataSet ^
ds =
gcnew DataSet();
// Remplissage du DataSet avec le SqlDataAdapter
da->
Fill(ds, "Customers"
);
// Ecriture du fichier XML au moyen de la méthode WriteXml
ds->
WriteXml("C:
\\
TestXml.xml"
);
Voici, après traitement, le contenu du fichier TestXml.xml :
<?xml version="1.0" standalone="yes" ?>
- <NewDataSet>
- <myTable>
<CustomerID>
ALFKI</CustomerID>
<CompanyName>
Alfreds Futterkiste</CompanyName>
<ContactName>
Maria Anders</ContactName>
<ContactTitle>
Sales Representative</ContactTitle>
<Address>
Obere Str. 57</Address>
<City>
Berlin</City>
<PostalCode>
12209</PostalCode>
<Country>
Germany</Country>
<Phone>
030-0074321</Phone>
<Fax>
030-0076545</Fax>
</myTable>