none
c# sqlce express 2008 RRS feed

  • Question

  • Bonjour

    Voila! j'utilise ce code

    private void CreateMyRV()
    { 
    string connectionString;
    string fileName = "MyRV.sdf";
    string password = "Daniel";
    connectionString = string.Format("DataSource=\"{0}\"; Password=\"{1}\"", fileName, password);
    SqlCeEngine en = new SqlCeEngine(connectionString);
    if (File.Exists(fileName) == false)
    { 
    en.CreateDatabase();
    SqlCeConnection cn = new SqlCeConnection(connectionString);
    if (cn.State == ConnectionState.Closed)
    {
    cn.Open();
    }
    SqlCeCommand cmd;
    string sql = "create table [" + monthCalendar.TodayDate.ToShortDateString() + "] ([RVID] int IDENTITY (1,1) PRIMARY KEY, [Heures] nvarchar (8), [Descriptions] nvarchar (247))";
    cmd = new SqlCeCommand(sql, cn);
    try
    {
    cmd.ExecuteNonQuery();
    }
    catch (SqlCeException sqlexception)
    {
    MessageBox.Show(sqlexception.Message, "Oops.", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message, "Oops.", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
    cn.Close();
    }
    cmd.Dispose(); 
    en.Dispose();
    cn = null;
    }
    }

     

     

     

     

     

    pour construire ma base et ma table selon la date du calendrier

    A la premiere ouverture du programme si la base de données est inexistante.

    Jusque la ca va. Mais je suis pas arriver a trouver la bonne facon de creer la table lorsque je sauveguarde les données

    je sais que je dois verifier si la table existe deja mais ca j'y arrive pas. et jai essayer tous ce que j'ai trouver sur le net

       le statement du sql  que je crois avoir a utiliser est celui si dessous.

     

     

     

    string sqlString = "create table [" + monthCalendar.SelectionEnd.ToShortDateString() + "] ([RVID] int IDENTITY (1,1) PRIMARY KEY, [Heures] nvarchar (8), [Descriptions] nvarchar (247))";

    est-ce KKun peut maider SVP.

    Merci


    BigDan

    • Modifié DanielMorais vendredi 13 août 2010 20:32 ajout de codes
    vendredi 13 août 2010 20:31

Réponses

  • Bonjour,

    Utilisez les vues INFORMATION_SCHEMAS :

    using (SqlCeConnection connexion = new SqlCeConnection("Data Source=|DataDirectory|\\MyDatabase1.sdf"))
    {
      using (SqlCeCommand commande = new SqlCeCommand("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @table", connexion))
      {
        int résultat;
    
        commande.Parameters.Add("@table", "MaTable");
    
        connexion.Open();
              
        résultat = Convert.ToInt32(commande.ExecuteScalar());
    
        if (résultat == 1)
        {
          // MaTable existe !
        }
      }
    }
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse DanielMorais mardi 17 août 2010 18:29
    samedi 14 août 2010 09:19
    Modérateur
  • Au temps pour moi. Etait ce bien le problème ?

    Pour créer un index :

    CREATE INDEX NomIndex ON NomTable(Champ). L'index sera utilisé pour de meilleures performances mais à strictement parler sa présence n'est pas indispensable.

    Avoir une table unique permettra aussi bien de faire qq chose comme :

    SELECT * FROM MaTable WHERE Jour=@Jour ce qui donne les données du seul jour voulu mais aussi :

    SELECT * FROM MaTable WHERE Jour BETWEEN @PremierJour AND @DernierJour ce qui donnera les données de tous les jours entre ces deux dates (ce qui ne serait pas facile si on a une table séparée pour chaque jour).

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse DanielMorais mardi 17 août 2010 18:29
    samedi 14 août 2010 13:36
    Modérateur
  • Bonjour,

    Le paramètre est @MaTable dans l'instruction SQL et @table dans le code VB d'où peut-être le problème.

    Sans rapport et je ne sais pas quel est le besoin, mais l'utilisation d'une table par date risque à mon avis de créer pas mal de soucis (impossibilité de requêter d'un coup sur l'ensemble des tables par exemple). Personnellement j'utiliserais sans doute une table unique, avec un index sur le jour pour pouvoir récupérer facilement les données d'un  jour donné (ou par exemple de tous les jours du mois en cours si besoin est).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse DanielMorais mardi 17 août 2010 18:29
    samedi 14 août 2010 12:29
    Modérateur
  • Cela me parait bon pour ce point.

    Une autre petite chose. SQL Server 2008 dispose également des types DATE et TIME. Il serait peut-être préférable d'utiliser ces types pour stocker des dates et des heures plutôt que d'utiliser NVARCHAR ce qui permettra :
    - ne pas pouvoir stocker, même par inadvertance, des chaines de caractères qui n'auraient pas de sens
    - d'avoir un tri correct
    - de pouvoir faire des calculs
    - de puvoir formatter la même valeur dans des langues différentes
    - etc...

    Voir par exemple http://msdn.microsoft.com/fr-fr/library/bb675168.aspx


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    samedi 14 août 2010 19:28
    Modérateur

Toutes les réponses

  • Bonjour,

    Utilisez les vues INFORMATION_SCHEMAS :

    using (SqlCeConnection connexion = new SqlCeConnection("Data Source=|DataDirectory|\\MyDatabase1.sdf"))
    {
      using (SqlCeCommand commande = new SqlCeCommand("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @table", connexion))
      {
        int résultat;
    
        commande.Parameters.Add("@table", "MaTable");
    
        connexion.Open();
              
        résultat = Convert.ToInt32(commande.ExecuteScalar());
    
        if (résultat == 1)
        {
          // MaTable existe !
        }
      }
    }
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse DanielMorais mardi 17 août 2010 18:29
    samedi 14 août 2010 09:19
    Modérateur
  • Merci Gilles

    Voila y a certenement quelques chose que je comprend pas

    j'ai ca.

    string connectionString;
    string fileName = "MyRV.sdf";
    string password = "xxxxxx";
    string MaTable = monthCalendar.SelectionEnd.ToString("dd MMM yyyy");
    connectionString = string.Format("DataSource=\"{0}\"; Password=\"{1}\"", fileName, password);
    using (SqlCeConnection connexion = new SqlCeConnection(connectionString))
    {
    using (SqlCeCommand commande = new SqlCeCommand("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @MaTable", connexion))
    {
    int rsultat;
    commande.Parameters.Add("@table", "MaTable");
    connexion.Open();
    rsultat = Convert.ToInt32(commande.ExecuteScalar());
    if (rsultat == 1)
    {
    MessageBox.Show("MaTable");
    }
    }
    }

     

     

    et je recoit

    Le type de paramètre n'a pas été déclaré. [ Parameter ordinal = 1,Parameter name (if available) = @MaTable ]

    et en plus

     

    L'exception System.Data.SqlServerCe.SqlCeException n'a pas été gérée
      Message="Le type de paramètre n'a pas été déclaré. [ Parameter ordinal = 1,Parameter name (if available) = @MaTable ]"
      Source="SQL Server Compact ADO.NET Data Provider"
      HResult=-2147217900
      NativeError=25956
      StackTrace:
           à System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()
           à System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
           à System.Data.SqlServerCe.SqlCeCommand.ExecuteScalar()
           à dbSqlText2.mMain.SaveToMyRV() dans C:\Documents and Settings\Daniel Morais\Mes documents\Visual Studio 2008\Projects\Essaie non fructua\dbSqlText2\dbSqlText2\mMain.cs:ligne 185
           à dbSqlText2.mMain.saveBtn_Click(Object sender, EventArgs e) dans C:\Documents and Settings\Daniel Morais\Mes documents\Visual Studio 2008\Projects\Essaie non fructua\dbSqlText2\dbSqlText2\mMain.cs:ligne 198
           à System.Windows.Forms.Control.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ButtonBase.WndProc(Message& m)
           à System.Windows.Forms.Button.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.Run(Form mainForm)
           à dbSqlText2.Program.Main() dans C:\Documents and Settings\Daniel Morais\Mes documents\Visual Studio 2008\Projects\Essaie non fructua\dbSqlText2\dbSqlText2\Program.cs:ligne 18
           à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()
      InnerException:

    et j'arrive pas a dechiffre ca

     

    Merci


    BigDan
    samedi 14 août 2010 11:24
  • Bonjour,

    Le paramètre est @MaTable dans l'instruction SQL et @table dans le code VB d'où peut-être le problème.

    Sans rapport et je ne sais pas quel est le besoin, mais l'utilisation d'une table par date risque à mon avis de créer pas mal de soucis (impossibilité de requêter d'un coup sur l'ensemble des tables par exemple). Personnellement j'utiliserais sans doute une table unique, avec un index sur le jour pour pouvoir récupérer facilement les données d'un  jour donné (ou par exemple de tous les jours du mois en cours si besoin est).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse DanielMorais mardi 17 août 2010 18:29
    samedi 14 août 2010 12:29
    Modérateur
  • Merci

    Moi c'est en C# 

    Il faut croire que suis pas du pour travailler avec les base de données ca finis toujours par casser

    mon projet. SQL on dis facile mais pas tant que ca.

    Et creer une table unique ca je sais comment mais une index sur le jours ca par contre?

    je crois que j'ai encore beaucoup de chemin a faire pour y arriver.

     

    Merci.


    BigDan
    samedi 14 août 2010 12:39
  • Au temps pour moi. Etait ce bien le problème ?

    Pour créer un index :

    CREATE INDEX NomIndex ON NomTable(Champ). L'index sera utilisé pour de meilleures performances mais à strictement parler sa présence n'est pas indispensable.

    Avoir une table unique permettra aussi bien de faire qq chose comme :

    SELECT * FROM MaTable WHERE Jour=@Jour ce qui donne les données du seul jour voulu mais aussi :

    SELECT * FROM MaTable WHERE Jour BETWEEN @PremierJour AND @DernierJour ce qui donnera les données de tous les jours entre ces deux dates (ce qui ne serait pas facile si on a une table séparée pour chaque jour).

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse DanielMorais mardi 17 août 2010 18:29
    samedi 14 août 2010 13:36
    Modérateur
  • Bonjour Patrice

    La tu vien de m'ouvrir une petite portion du tiroir a codes.

    j'etais a fouiller dans internet mais pas trouver grand chose la dessus.

    Merci encore cela devrait m'aider a debuter.

    en passant si je met ca est-ce bon

    CREATE INDEX Jours ON RVJours(Champ) //c,est quoi le champ ici

    pardon mais j'ai trouver

     

    string sqlInd = "CREATE INDEX Jours ON RV(RVJours)";
    cmd =
    new SqlCeCommand(sqlInd, cn);
    cmd.ExecuteNonQuery();

     

    Et si j'utilise le tout comme ci-dessous est-ce la bonne facon

    private

     

    void CreateMyRV()
    {
    string connectionString;
    string fileName = "MyRV.sdf";
    string password = "Daniel";
    connectionString =
    string.Format("DataSource=\"{0}\"; Password=\"{1}\"", fileName, password);

     

    SqlCeEngine en = new SqlCeEngine(connectionString);
    if (File.Exists(fileName) == false)
    {
         en.CreateDatabase();
        
    SqlCeConnection cn = new SqlCeConnection(connectionString);

     

    if (cn.State == ConnectionState.Closed)
    {
         cn.Open();
    }

     

    SqlCeCommand cmd;
    string sql = "create table [RV]([RVID] int IDENTITY (1,1) PRIMARY KEY, [RVJours] nvarchar(25), [RVHeures] nvarchar (8), [RVDescriptions] nvarchar (242))";

    cmd =

    new SqlCeCommand(sql, cn);
    cmd.ExecuteNonQuery();
    string sqlInd = "CREATE INDEX Jours ON RV(RVJours)";
    cmd =
    new SqlCeCommand(sqlInd, cn);
    cmd.ExecuteNonQuery();
    cn.Close();
    cmd.Dispose();
    en.Dispose();
    cn =
    null;
    }
    }

    A plus 


    BigDan
    samedi 14 août 2010 13:40
  • Cela me parait bon pour ce point.

    Une autre petite chose. SQL Server 2008 dispose également des types DATE et TIME. Il serait peut-être préférable d'utiliser ces types pour stocker des dates et des heures plutôt que d'utiliser NVARCHAR ce qui permettra :
    - ne pas pouvoir stocker, même par inadvertance, des chaines de caractères qui n'auraient pas de sens
    - d'avoir un tri correct
    - de pouvoir faire des calculs
    - de puvoir formatter la même valeur dans des langues différentes
    - etc...

    Voir par exemple http://msdn.microsoft.com/fr-fr/library/bb675168.aspx


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    samedi 14 août 2010 19:28
    Modérateur
  • Merci Beaucoup

    vraiment vous m'aider encore plus c'est vraiment super

    A plus


    BigDan
    samedi 14 août 2010 19:37
  • Bonjour,

     

    Daniel, est-ce que vous pouvez marquer la réponse (ou les réponses) que vous considérez pertinentes pour ce thread ? N’oubliez non plus d’octroyer des votes « utile » pour nos collègues J

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    mardi 17 août 2010 13:25