cerhu > microsoft.* > microsoft.dotnet.adonet

Gérard (11/10/2007, 23h16)
Bonjour,

Je teste SQLite avec le Framework 2.
Je rencontre un probl? avec les chaines contenant des caract?s
accentu?.. qui ne "passent pas bien". Ci-dessous vous trouverez un
petit programme de test. Voi?le r?ltat (affich?ar le programme
SQLIte Administrator : [..] )

--> table test, colonne id vaut 1 et colonne texte vaut : "à l'école
!!"

--> J'aimerais mieux "A l'?le" pour la colonne texte...

Voyez-vous ce qui peut proser probl? dans le source ?

D'avance MERCI

*****

using System;
using System.Collections.Generic;
using System.Text;

using System.Data.SQLite;

namespace TestSQLite
{
class Program
{
private static string m_nomBase = "essai.dat";
private static SQLiteConnection m_cnx = null;

static void Main(string[] args)
{
try
{
// Cr?ion de la base
SQLiteConnection.CreateFile(m_nomBase);

// Ouverture de la base
m_cnx = new SQLiteConnection("Data Source=" +
m_nomBase);
m_cnx.Open();

// Cr?ion de la table de test
using (SQLiteCommand cmd = new SQLiteCommand(m_cnx))
{
cmd.CommandText = "create table test( id integer,
texte varchar(100) )";
cmd.ExecuteNonQuery();
}

// Requete d'insertion...
using (SQLiteCommand cmd = new SQLiteCommand(m_cnx))
{
cmd.CommandText = "insert into test( id, texte )
values ( @id, @texte )";

SQLiteParameter pid = new SQLiteParameter("@id",
1);
SQLiteParameter ptexte = new SQLiteParameter(
"@texte", "?'?le !!");

cmd.Parameters.Add(pid);
cmd.Parameters.Add(ptexte);

cmd.ExecuteNonQuery();
}

Console.WriteLine("Appuyez sur une touche....");
Console.ReadKey();
}
finally
{
if (m_cnx != null) m_cnx.Dispose();
}
}
}
}
Patrice (12/10/2007, 11h31)
Cela ressemble ?u texte enregistr?n UTF-8. Peut-?e commencer par
sortir les codes ASCII des caract?s pr?nts dans la base pour v?fier ce
qui est stock?en base (cela pourrait ?e un probl? d'interface ?).
Gérard (13/10/2007, 14h45)
Il me semble bien que SQLite stocke ses donn? "chaines" en UTF-8. Par
ailleurs, je crois savoir ?lement que le Framework travaille en
interne avec des chaines en UTF-8. Et donc le r?ltat m'?nne... car
?e qu'il me semble tout se passe comme si SQLite et le Framework ne
stockaient pas les chaines avec le m? encodage...

Savez-vous si le framework offre quelque moyen simple de soumettre une
requete dans un "format de chaine" avec un encodage au choix du
d?loppeur ?

Ou encore, et par exemple, comment convertir "?'?le !!" en "Êl'école !!" ?

Et inversement ?

Patrice a couch?ur son ?an :
[..]
Gilles TOURREAU (13/10/2007, 15h20)
Le Sat, 13 Oct 2007 14:45:59 +0200, Gérard <merci> a écrit:

> Il me semble bien que SQLite stocke ses données "chaines" en UTF-8. Par
> ailleurs, je crois savoir également que le Framework travaille en
> interne avec des chaines en UTF-8. Et donc le résultat m'étonne... car à
> ce qu'il me semble tout se passe comme si SQLite et le Framework ne
> stockaient pas les chaines avec le même encodage...
> Savez-vous si le framework offre quelque moyen simple de soumettre une
> requete dans un "format de chaine" avec un encodage au choix du
> développeur ?
> Ou encore, et par exemple, comment convertir "à l'école !!" en "Ã
> l'école !!" ?
> Et inversement ?

Normalement SQLite devrait vous proposer :
- Une propriété au niveau su SQLiteConnection indiquant quel encodage
utiliser
- Ou alors (comme se fut le cas pour moi avec mySQL), ajouter avant la
requête SQL l'encodage à utiliser pour la récupération des données (par
exemple : "SET encoding=utf-8;SELECT * FROM MaTable")

Cependant, savez-vous où l'on peut trouver la documentation en ligne de
votre driver SQLite ?

Cordialement
Gérard (13/10/2007, 20h02)
Pour télécharger le driver (avec sa documentation) c'est ICI :
[..]

Sinon, le "site du projet" : [..]

J'ai fait un petit tour du coté des forums, sans trouver la solution à
mon problème...

A creusant d'avantage la documentation, et suite à votre remarque, j'ai
exécuté la commande "PRAGMA encoding;" sur la base créée par le petit
programme de test. Le résultat est : "UTF-8".

J'ai légèrement modifé le programme, afin d'ajouter un "select" pour
tenter de "retouver" l'enregistrement : cela fonctionne (dans les "deux
versions" : avec et sans SQLiteParameter)

Egalement, l'affichage du résultat d'un "select complet" sur la table
est correct, alors que je m'attendais à ce que sous la console le
résultat soit "sale" s'agissant des caractères accentués...

Je vais faire un test avec une WinForm...

Ci-dessous le programme

PS : Si quelqu'un utilise sans problème un autre provider gratuit, je
suis intéressé, au cas où je ne m'en sorte pas !

*****

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;

using System.Data.SQLite;

namespace TestSQLite
{
class Program
{
static void Main(string[] args)
{
string nomBase = "essai.dat";

// Destruction fichier si existe
if (File.Exists(nomBase)) File.Delete(nomBase);

// Création de la base
SQLiteConnection.CreateFile(nomBase);

// Ouverture de la base
using (SQLiteConnection cnx = new SQLiteConnection("Data
Source=" + nomBase))
{
cnx.Open();

// Création de la table de test
using (SQLiteCommand cmd = new SQLiteCommand(cnx))
{
cmd.CommandText = "create table test( id integer,
texte varchar(100) )";
cmd.ExecuteNonQuery();
}

// Requete d'insertion...
using (SQLiteCommand cmd = new SQLiteCommand(cnx))
{
cmd.CommandText = "insert into test( id, texte )
values ( @id, @texte )";

SQLiteParameter pid = new SQLiteParameter("@id",
1);
SQLiteParameter ptexte = new
SQLiteParameter("@texte", "à l'école !!");

cmd.Parameters.Add(pid);
cmd.Parameters.Add(ptexte);

cmd.ExecuteNonQuery();
}

// Interrogation de la base
using (SQLiteCommand cmdCount = new SQLiteCommand(cnx))
{
cmdCount.CommandType =
System.Data.CommandType.Text;
// Fonctionne aussi :
//cmdCount.CommandText = "select count(*) from test
where texte = 'à l''école !!'";
cmdCount.CommandText = "select count(*) from test
where texte = @texte";
cmdCount.Parameters.Add( new SQLiteParameter(
"@texte", "à l'école !!" ) );

Console.WriteLine("Count = " +
cmdCount.ExecuteScalar());
}

// Afficher le contenu de la table
using (SQLiteCommand cmdSelect = new
SQLiteCommand(cnx))
{
cmdSelect.CommandType =
System.Data.CommandType.Text;
cmdSelect.CommandText = "select id, texte from
test";

using( SQLiteDataReader dr =
cmdSelect.ExecuteReader() )
{
while (dr.Read())
{
Console.WriteLine( string.Format( "id =
{0}; texte = {1}", dr[0], dr[1]));
}
}
}

}

Console.WriteLine("Appuyez sur une touche....");
Console.ReadKey();
}
}
}

Gilles TOURREAU a exposé le 13/10/2007 :
[..]
Gérard (13/10/2007, 20h11)
Bon, le problème vient peut-être de l'outil graphique que j'utilise
pour interroger "confortablement" la base de données...

En effet, le programme WinForm ci-dessous fonctionne fort bien... C'est
à dire que le résultat affiché est correct :-)

J'essaye un autre outil, et je vous tiens informé ;-)

***********

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Data.SQLite;

namespace WinTestSQLite
{
public partial class Form1 : Form
{
protected void TestSelect()
{
string nomBase = "essai.dat";

// Ouverture de la base
using (SQLiteConnection cnx = new SQLiteConnection("Data
Source=" + nomBase))
{
cnx.Open();

// Afficher le contenu de la table
using (SQLiteCommand cmdSelect = new
SQLiteCommand(cnx))
{
cmdSelect.CommandType =
System.Data.CommandType.Text;
cmdSelect.CommandText = "select id, texte from
test";

using( SQLiteDataReader dr =
cmdSelect.ExecuteReader() )
{
while (dr.Read())
{
textBox1.Text += string.Format( "\nid =
{0}; texte = {1}", dr[0], dr[1]);
}
}
}
}
}

public Form1()
{
InitializeComponent();

TestSelect();
}
}
}

Gérard avait énoncé :
[..]
Patrice (15/10/2007, 14h02)
Non le framework lui-m? utilise un codage "classique" sur deux caract?s
(UCS-2 je pense ?).

A priori les probl? de transcodage sont g?ralement pris en charge par le
fournisseur ADO.NET ou par l'infrastructure ASP.NET (lorsque la r?nse est
?ite vers le navigateur).

[..] donne qq infos (?riori SQLLite2
communique par d?ut en UTF-8 et on peut changer, SQLLite3 communique par
d?ut en Unicode).
Discussions similaires
caractères accentués collés aux autres caractères

Caractères accentués transformés en caractères chinois

Caractères accentués en caractères chinois

Conversion de caracteres accentues en ces memes caracteres non accentues


Fuseau horaire GMT +2. Il est actuellement 14h11. | Privacy Policy