Meilleur auteur de réponses
c# sqlce express 2008

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
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
-
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
-
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
-
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".- Modifié Patrice ScribeMVP, Moderator samedi 14 août 2010 19:41
- Marqué comme réponse DanielMorais mardi 17 août 2010 18:29
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
-
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 -
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
-
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 -
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
-
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 -
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".- Modifié Patrice ScribeMVP, Moderator samedi 14 août 2010 19:41
- Marqué comme réponse DanielMorais mardi 17 août 2010 18:29
-
-
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
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.