Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : problème pour generer un script sql serveur à partir d'une base access en utilisant le provider oledb dans un programme en C# [ Access / Migration ] (solons)

lundi 4 août 2008 à 10:55:27 | problème pour generer un script sql serveur à partir d'une base access en utilisant le provider oledb dans un programme en C#

solons


Bonjour,

Je cherche à pouvoir fabriquer un script générant une base SQL serveur identique à une base de départ qui doit pouvoir être de plusieurs formats (SQL serveur, Access ou excel).Seulement je n'y connais rien (c'est pour un stage) et je ne connais ni le C# ni quoi que ce soit sur les bases de donées. Je me suis donc tapper le site de microsoft pendant une semaine et je me suis servi de la très bonne source qui a été déja proposée à cet effet que vous trouverez au bout de ce lien.

Cette proposition est assez complètes mais contient quelques bugs pours lequels je n'arrive pas à trouver de solutions et pour lesquels je solicite votre aide.

Lorsque l'on génère un script sql serveur à partir d'une base access, le champs " AllowDBNull" est mal renseigné.
L'idée est que l'on crée une DATATABLE à partir de laquelle on reconstruit le script permettant de généré chaque table en parcourant la DATATABLE crée.

On utilise pour cela la commande :

oDataTableTables = oOleDbConnection.GetSchema("tables");

Pour remplir les propriétés des différentes colones on utilise le code suivant:

oOleDbDataReader = new System.Data.OleDb.OleDbCommand("SELECT * FROM [" + sCurrentTable + "]", oOleDbConnection).ExecuteReader(System.Data.CommandBehavior.KeyInfo);
                        oDataTableInfosTable = oOleDbDataReader.GetSchemaTable();

                        foreach (System.Data.DataRow oDataRow in oDataTableInfosTable.Rows)
                        {
                            BObject.Column oColumn;
                            oColumn=new NET2CsExportData.BObject.Column();

                            oColumn.ColumnName = oDataRow["ColumnName"].ToString();
                          
                            oColumn.Type = this.SetDataType(oDataRow["DataType"].ToString());

                            if (oColumn.Type == "char(250)")
                            {
                                if (Convert.ToInt32(oDataRow["ColumnSize"]) > 255)
                                {
                                    oColumn.Type = "text";
                                }
                                else
                                {
                                    oColumn.Type = "char(" + Convert.ToString(oDataRow["ColumnSize"]) + ")";
                                }
                            }
                            if (Convert.ToBoolean(oDataRow["AllowDBNull"]) )
                            {
                                oColumn.isAllowDbNull = true;
                            }
                            if (Convert.ToBoolean(oDataRow["IsKey"]))
                            {
                                oColumn.isPrimaryKey = true;
                            }
                                           
                            oTable.Columns.Add(oColumn);
                        }
                        oOleDbDataReader.Close();
                        oTable.Rows = this.GetDataOfTable(oTable);
                        oTables.Add(oTable);

Quand on analyse en detail le DataRow, on se rend compte que celui-ci n'a pas les propriétés qu'il devrait avoir. En effet si la colone sur laquelle il travaille et une clé primaire, il le voit et la propriété est à "true",de même la propiété "allowDBNull"est à "false". Dans tous les autre cas enviseageables, la propiété "allowDBNull" est à "true" ce qui pose donc un gros problème. Puisque du coup le résultat est inutilisable.

A mon avis le problème vient de la méthode "oOleDbDataReader.GetSchemaTable()", mais je peux me tromper..

Ma question est donc autant "est ce que vous savez comment résoudre le problème" que "est ce qu'il existe une façon de faire la mème chose sans se servir du provider oledb (récupérer les tables sys dans access par ex)"

Il y a un autre problème pour ceux qui peut etre connaitrait la source.. Les Foreign key ne sont pas bien mise en place et il y a des doublons qui rendent le script inutilisable sans l'avoir retravailler à la main ce qui lui fait grandement perdre de son interet .. Mais je n'ai pas encore identifier le problème donc je reposerai une question en temps voulu.

D'avance merci.

lundi 4 août 2008 à 15:48:31 | Re : problème pour generer un script sql serveur à partir d'une base access en utilisant le provider oledb dans un programme en C#

yann_lo_san

Salut,
Ne connaisant pas la totalité du code les remarques suivantes ne sont peut etre pas pertinentes.

Es-tu sur de cette instruction ?

oColumn.Type = this.SetDataType(oDataRow["DataType"].ToString());

this est l'objet courrant, quel est la classe en cours ?
de plus SetDataType doit affecter un type et pas en retourner un ?
Mais je ne connais pas la classe entiere donc ...


Es-tu sur de ces 2 instructions ? (validés dans le debuger ?)
 
if (Convert.ToBoolean(oDataRow["AllowDBNull"]) )
if (Convert.ToBoolean(oDataRow["IsKey"]))

Pour etre sur, j'aurais fais :

bool bNull, bKey;
try
{
   if( oDataRow["AllowDBNull"] == null || oDataRow["IsKey"] == null )
      throw new Exception("les objets sont null");

   bNull = Convert.ToBoolean(oDataRow["AllowDBNull"].ToString().ToLower());
   bKey = Convert.ToBoolean(oDataRow["IsKey"].ToString().ToLower());
}
catch(Exception exc) // ou InvalidCastException
{
   throw new Exception(exc.Message);
}


lundi 4 août 2008 à 16:20:46 | Re : problème pour generer un script sql serveur à partir d'une base access en utilisant le provider oledb dans un programme en C#

solons

Tout d'abord, merci d'avoir pris le temps de lire ma question qui est assez indigeste j'en convient ..

pour ta première question la classe en cours s'appelle "managementaccess" et possède la méthode suivante:

private string SetDataType(string sReceived)
        {
            string sReturn;
            sReturn = string.Empty;

            if (sReceived.ToLower().IndexOf("bool") != -1)
            {
                sReturn = "bit";
            }
            if (sReceived.ToLower().IndexOf("string") != -1)
            [J'AI COUPE LE MILIEU MAIS IL Y A L'ENSEMBLE DES TYPES POSSIBLES]
            return sReturn;
        }

Pas de problème de ce coté là je pense.
Ensuite pour les instructions suivantes

if (Convert.ToBoolean(oDataRow["AllowDBNull"]) )
if (Convert.ToBoolean(oDataRow["IsKey"]))

Elles fonctionnent comme il faut .. Mais le problème est que la valeur oDataRow["AllowDBNull"] n'est pas la bonne.
Or oDataRow est initialisé par la méthode

OleDbDataReader.GetSchemaTable();

Soit la méthode fournie par Microsoft marche pas (je me rend pas du tout compte si c'est une hypothèse crédible ou pas vu que je ne connais pas les produits Microsoft) soit ... j'ai rien compris au pb
ça me semble quand même bizarre, qqun s'en serait rendu compte et ils auraient corrigé le problème..

Pourtant dès la creation de l'objet celui-ci ne contient pas les bonnes valeurs ...
La propriété "iskey" est toujours bien. Mais la propriété "AllowDBNull" n'est bonne que si la propriété "iskey" est vrai et que la colonne est une clé primaire ..

Je sais pas trop comment faire..

Il y a t'il une autre façon de récupérer ce type de propriété ??




Cette discussion est classé dans : script, problème, sql, ocolumn, odatarow


Répondre à ce message

Sujets en rapport avec ce message

SQL Microsoft [ par Zoubida ] Bonjour à tous,j'ai un problème de requête SQL. Mon application tourne sous SQL SERVER et je dois la rendre compatible avec ACCESS . Le problème c'es Problème SQLSERVER/php [ par LeJulius ] Je travaille actuellement sous SQL SERVER 2000 en lien avec du PHP 4.2.0 Mon problème est le suivant :Mes tables sql contiennent des caractères accent base sql problème [ par Fildomen ] salut ( 4fois par jour!!)j'ai réinstaller le windows, et quand je veux attacher ma base de donnée sql server 2000, il me passe une erreur  comme s'il script asp pour rafraichir sql serveur [ par gregorstevens69 ] Bonjour,quelqu'un connait il un script ASP(si possible) pour rafraichir une bd sql serveur.J'ai un script qui créé des tables mais lorsqu'un utilisate problème de connexion [ par penchu ] bonjour à tous, je viens de découvrir qu'il existait la MSDE (et oui, je suis en retard apparemment, mais mieux vaut tard que jamais) Mais j'ai Problème accès base [ par skowee59 ] J'ai développé une appli qui accède à une base SQL Server.Tous les ADMINISTRATEURS du domaine arrivent à y accéder mais dès que j'essaie avec un compt Problème avec l'opérateur LIKE dans SQL SERVER [ par oluha ] BonjourJ'ai un petit problème avec une procédure stockée sur SQL server.Dans celle ci j'utilise une requete de type :select count(*) from matable wher [Script transact-sql][SQL server 2000] Copie d'une base à une autre [ par rabbiwan ] Bonjour, J'ai sur mon serveur 2 bases de données, et je souhaiterai faire un travail tous les soirs (routine), qui consiste à copier une partie des do Problème OSQL & ACCENT [ par Bpoulain ] Bonjour, Je travaille avec SQLSERVER2000. Avec OSQL je passe des scripts sql sur une base. Tout se passe bien ... sauf dans le cas ou des accents so [SQL Server 2000] problème avec la base Master [ par aieeeuuuuu ] Bonjour à tousj'ai tenté de restaurer la base Master sur mon SQL server 2000 mais la restauration a planté.j'ai du redémarrer mon serveur, mais SQL ne


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,685 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.