Auteur |
Message |
deco76
Forumeur occasionnel
Messages: 36
|
Posté le:
Lun 31 Déc 2012 - 15:52 |
|
Bonjour
Je développe un programme vb c#, et j'utilise une basse de donnée access.
Par flemme ou soucis d'efficacité,
je met chaque type de donnée en string
(parfois c'est du int, ou du float réellement)
Pour ne pas avoir à me prendre la tête pour l'insertion de donnée lors du développement de mon programme (ajouter guillemet ou non).
Ma question est, esse vraiment si mal ?
(je sais qu'il est important de bien distinguer les types, pour qu'un développeur tiers ne fasse pas d'erreur d'insertion)
Cela prend t-il plus de place dans ma base de donnée ?
une type mis en string dans une basse de donnée prend t-il vraiment toute l’allocation dont-il dispose (alors qu'il ne comporte que 10 lettre) ?
Merci pour vos futurs réponses. |
|
|
|
|
N'oubliez pas de vous inscrire à la communauté pour participer. Si vous êtes déjà membre, connectez-vous pour faire disparaître ce bandeau publicitaire. |
Zonag
Modérateur
Sexe:
Messages: 1298
Localisation: Toulouse
|
Posté le:
Mer 02 Jan 2013 - 17:22 |
|
Salut,
Ca peut poser des problèmes pour les jointures.
Après effectivement ta base de données peut prendre plus de place et être moins performante, mais tu ne t'en rendra probablement pas compte sur des petits jeux de données (moins de quelques milliers d'enregistrement).
Et au delà de ça, tu perds certaines fonctionnalités natives de ton moteur de base de données (faire calculer des sommes ou des moyennes à des strings c'est pas évident )
Tu as quand même intérêt à bien typer tes champs, ça peut t'éviter quelques soucis plus tard dans ton appli ... (lorsque t'essaye d'additionner un numérique avec un string qui n'aurait jamais du se retrouver la par exemple). |
_________________ Zonag |
|
|
|
deco76
Forumeur occasionnel
Messages: 36
|
Posté le:
Mer 02 Jan 2013 - 21:42 |
|
Bonsoir
Merci pour la réponse.
C'est ce que je compte faire par la suite (bien typer mes données)
Citation: |
tu perds certaines fonctionnalités natives de ton moteur de base de données |
Effectivement, je n'y pensée plus.
Une autre question qui ma pris la journée (je dois re-poster, un nouveau sujet ?)
est-il possible de faire un INSERT Massif dans une base de donnée access.
Je m'explique :
J'ai plusieurs thread qui lance la même classe qui contienne (pour chaque classe) une DataTable (heure, chiffre, chaine) qui est à l'intérieur.
Et Je souhaite insérer dans ma base.
Malheureusement cela me prend énormément de temps.
De plus Mon processeur chauffe et monte à + de 80%
Et même parfois VB Plante avec le message d'erreur qu'une des variables sont utilisées ailleurs (alors qu'à ma connaissance non).
Voici mon code sans procédure :
Code: |
string strTemp = "";
string Values = "";
this.table = new DataTable();
//Début Reception Reader Sur Impr Ecran Voulu
OleDbDataReader myReader = this.GetReaderTableScreenEmpreinteYDebutYFin(Convert.ToString(this.IDScreenEmpreinte));
//Début Lecture du Reader
myReader.Read();
//Début Recherche du nom de la colonne souhaité
int NombreDeColonne = myReader.FieldCount;
for (int i = 0; i < NombreDeColonne; i++)
{
// Debut Insertion Nom + Type colonne dans DataTable
this.table.Columns.Add(myReader.GetName(i), typeof(string));
}
// Debut Construction du Values
foreach (DataColumn column in this.table.Columns)
{
this.strTemp += column.ColumnName + ",";
this.Values += "@" + column.ColumnName + ",";
}
//Début Suppression Dernier Virgule
this.strTemp = this.strTemp.Substring(0, this.strTemp.Length - 1);
this.Values = this.Values.Substring(0, this.Values.Length - 1);
myReader.Close();
//Début Parcour
for (int y = this.Y; y <= this.Y + this.TailleY; y++)
{
dateh();
this.table.Rows.Add(this.IDScreenEmpreinte, Convert.ToString(this.X), Convert.ToString(y), Convert.ToString(this.MaCapture.GetPixel(this.X, y)), datenow, hournow, datenow, hournow);
}
string requête = "ERROR";
try
{
if (this.table != null)
{
//Debut Boucle Dans Datatable
foreach (DataRow dr in this.table.Rows)
{
//Début Insertion dans DB
using (OleDbConnection oConn = new OleDbConnection(Connection))
{
oConn.Open();
requete = "INSERT INTO TableX (" + this.strTemp + ") values( " + this.Values + ")";
OleDbCommand oCmd = new OleDbCommand(requete, oConn);
// formatage de la colonne à afficher
foreach (DataColumn column in this.table.Columns) { oCmd.Parameters.AddWithValue("@" + column.ColumnName, dr[column.ColumnName].ToString()); }
oCmd.ExecuteNonQuery();
oConn.Close();
}
}
}
}
catch { MessageBox.Show("Erreur InsertTableScreenEmpreinteYDebutYFin IDScreenEmpreinteScreenEmpreinteYDebutYFinS \n requête : " + requête); }
|
Si Vous pouviez donner vos avis/ Aides
PS : Aussi pour la ligne this.table.Columns.Add(myReader.GetName(i), typeof(string));
Je n'arrive pas à récupérer le type de la donnée (si je veux bien typé mes données par la suite) par exemple un :
Code: |
this.table.Columns.Add(myReader.GetName(i), typeof(myReader.GetName(i).GetType())); |
Ne fonctionne pas ..
Je l'utilise pour variabilisé mes insertion (si dans le futur les champs changes, ou n'existe plus, ne pas tous mettre en dur. Mais récuperer les champs + leur type en cours. |
|
|
|
|
Zonag
Modérateur
Sexe:
Messages: 1298
Localisation: Toulouse
|
Posté le:
Ven 04 Jan 2013 - 16:47 |
|
Je ne comprends pas trop ce que tu veux insérer.
Tu peux détailler stp au dela du code ? |
_________________ Zonag |
|
|
|
deco76
Forumeur occasionnel
Messages: 36
|
Posté le:
Mar 08 Jan 2013 - 01:31 |
|
Bonsoir
Je souhaite insérer pixel par pixel une image modifier par mes soins en bitmap dans une base de donnée (par la suite les pixels seront crypté via un algo perso), je sais qu'on peut le faire sur le bitmap lui même mais ça ne m’intéresse pas.
Je viens de modifier mon code avec du LockBitmap et changer la base de donnée access en postgresql, ce que je souhaite c'est un moyen d’inserrer rapidement une multitude d'information.
La meilleur solution est un serveur à distance ?!
Merci |
|
|
|
|
|