Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007
-
8 mars 2006 à 00:27
Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007
-
10 mars 2006 à 18:11
Salut tout le monde
Afin d'importer des données d'un SGBD à un autre (SQL Serveur à PostgreSQL), j'ai fait un petit programme d'import.
Dans ce programme j'initialise 2 connection (CnnSQL et CnnPG) et je récupère ma liste de table à importer dans une collection de type Queue (PoolTable).
J'appelle ensuite la procédure suivante afin d'importer mes données :
private
void TraiterTable(
)
{
string NomTable;
SqlDataAdapter SqlDA;
DataSet SqlDS =
new
DataSet();
OleDbDataAdapter PGDA;
while (PoolTable.Count > 0)
{
NomTable = PoolTable.Dequeue();
try
{
SqlDA =
new
SqlDataAdapter(
"Select * From " + NomTable, CnnSql);
SqlDA.Fill(SqlDS,NomTable);
PGDA =
new
OleDbDataAdapter(
"Select * From " + NomTable, CnnPG);
PGDA.Update(SqlDS, NomTable);
}
catch {}
}
}
Je n'ai aucune erreur mais aucune données n'est copiée. Je ne suis pas sur à 100% que mes structures sont équivalentes car j'ai utiliser un programme externe pour les importer.
Une suggestion pour importer la structure des tables pourraient aussi m'être utile.
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 8 mars 2006 à 09:15
qd tu creer ton dataadapter tu ne fourni pas les procedure d'update et d'insert l'erreur vient de la...
il faut definir le PGDA.InserCommand
Pour avoir une chance de faire un insert
deplus tu fais un fill d'un dataset et tu update ce meme dataset, il faudrait plutot remplir un dataset avec tes donnes SQL
parcourir ce dataset et copier les donner dans un autre dataset
et faire l'update vers prosgress de ton autre dataadapter....
Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007 8 mars 2006 à 14:39
Merci pour ta réponse.
Par contre je ne connais pas très bien ADO .Net alors pourrais tu m'expliquer comment créer la commande insert sachant qu'elle change suivant la table à copier.
J'espererais que cette méthode de Update d'un dataset dans un autre DataAdapter fonctionnerait afin de m'éviter une copie ligne à ligne de mon DataSet, pas terrible en performance.
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 8 mars 2006 à 15:36
de toute facon tu va etre oblige de faire un boucle pour parcourir ton premier dataset pour copier chaque element dans ton 2eme dataset
pour la requete insert je t'invite a regarder mes sources ou j'ai un exemple sur l'utilisation des dataadapter et notament un exemple avec des commande avec des parametres :)
Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007 8 mars 2006 à 16:36
Sinon tant qu'on y est; il y aurait pas un moyen de reprendre simplement la strucutre de mes tables, avec les clés, index et contraintes même si possible ?
Ca m'aiderai parce que la syntaxe SQL Server et PostgreSQL c'est pas la même chose et quand y'a plus de 150 tables c'est long à tranformer.
Merci.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007 8 mars 2006 à 17:07
Bon alors je vais récapituler.
Si j'ai bien compris le mieux pour copier une nombre important de tables (structure, données, relations, clés, index et contraintes) est de remplir un 1er dataset à partir de la base d'origine puis de copier chaque table une par une dans un autre dataset lié à la base de destination.
Est-ce bien ça ou je fais une erreur ?
Si tu as la commande qui permet de copies des tables ainsi d'un dataset à un autre je suis preneur sinon je trouverai bien.
J'ai toujours une erreur sur l'update puis qu'il me manque la commande insert.
Je ne vois pas comment je peux la générer dynamiquement.
Saurez-tu me dire comment faire ?
Arthenius
Messages postés1182Date d'inscriptionmercredi 21 janvier 2004StatutMembreDernière intervention 6 septembre 201114 9 mars 2006 à 08:59
tu ne peux pas la faire dynamiquement...
System.Data.OleDb.OleDbDataAdapter PGDA = new System.Data.OleDb.OleDbDataAdapter( "select * From " + NomTable, CnnPG);
PGDA.InsertCommand = new System.Data.OleDb.OleDbCommand("INSERT INTO "+ nomTable + " (CHAMP1, CHAMP2, CHAMP3, CHAMP4) VALUES (@VALEUR_CHAMP1, @VALEUR_CHAMP2, @VALEUR_CHAMP3, @VALEUR_CHAMP4)", CnnPG);
PGDA.InsertCommand.Parameters.Add("@VALEUR_CHAMP1", Valeur_champ1);
PGDA.InsertCommand.Parameters.Add("@VALEUR_CHAMP2", Valeur_champ2);
PGDA.InsertCommand.Parameters.Add("@VALEUR_CHAMP3", Valeur_champ1);
PGDA.InsertCommand.Parameters.Add("@VALEUR_CHAMP4", Valeur_champ4);
//et la tu pourra faire ton update...
faut te faire tout tes insert pour TOUTE tes TABLES A LA main...
pas le choix...je pense...
je ne pense pas que tu puisse faire mieux que ton foreach...
l'insert est specificaque a chacune de tes tables...
si tu a 150 table a migrer....
ben 150 insert....
apres si postgres gere les procedure stockee ca peu simplifier ton code..mais les parametre variront qd meme d'une procedure a l'autre...donc...tjs du spe...
Là j'arrive bien à générer ma commande dynamiquement mais après je comprends pas trop à quoi correspondent les paramètres ?
Pourrais-tu m'éclairer sur le sujet ?
Merci.
Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007 9 mars 2006 à 11:55
Chez moi l'instruction typeof(Col.GeType()) ne passe pas.
J'utilise un viusal studio 2005 avec un framework 2.
Est-ce un problème lié à ça ou alors une autre erreur ?
Sinon pour la taille je pourrais éventuellement allé la chercher dans les tables systemes de SQL Server mais ça devient usine à gaz.
J'ai mit 20 en longueur pour tester mais déjà comme ça ça se compile pas erreur sur la ligne : PGDA.InsertCommand.Parameters.Add("@" + Col.ColumnName,
typeof(Col.GetType()), 20 , Col.ColumnName);
Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007 9 mars 2006 à 14:35
Heu le 2ème foreach est sur foreach(DataColumn Col in SqlDS.Tables[0].Columns
) aussi.
Le reste c'était un test pour voir si je trouvais la longueur, désolé.
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 10 mars 2006 à 00:18
Salut,
Tu as fait un léger mélange là : déjà typeof sert à récupérer l'instance de System.Type caractérisant un type, et n'aurais pas fonctionner sur une instance de DataColumn.
Ensuite le type attendu par la méthode n'est pas une instance de System.Type, mais une valeur de System.Data.OledDb.OleDbType.
Neow26
Messages postés50Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention12 mai 2007 10 mars 2006 à 00:24
Ok c'est juste ça, mais tu saurais comment passer d'un System.Type à un System.Data.OleDb.OleDbType ?
De plus tu saurais comment connâitre la longueur d'un champ ?
Merci.