Laden...

Suche in SQL CE DB mit 700 000 Datensätzen sher langsam -> Alternative?

Erstellt von j4n vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.019 Views
Thema geschlossen
J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren
Suche in SQL CE DB mit 700 000 Datensätzen sher langsam -> Alternative?

Guten Tag zusammen,

will eine kleine Anwendung für mein Windows Mobile Handy schreiben, scheiter aber leider schon ganz am Anfang...Werkel da schon seit mindestens einer ner Woche rum, jedes mal in neuer Hoffnung, dass mich ein gefundener Code aus einem Forum weiterbringt...doch leider scheitert es immer wieder.
habe eben auch mal die forensuche benutzt und ebenfalls einiges gefunden unter "SqlCeConnection"...aber das war mir alles schon bekannt...

irgendwas scheine ich falsch zu machen, kann mir jmd. vielleicht auf die Sprünge helfen?

folgenden Code ist mometan bei der Verbindung im Einsatz:


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


namespace Dictionary
{
    public partial class Form1 : Form
    {
        private SqlCeConnection _conn;


        public Form1()
        {
            InitializeComponent();
            _conn = new SqlCeConnection("Data Source=|DataDirectory|\\MyDatabase#1.sdf");

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SqlCeCommand cmd = new SqlCeCommand();
            cmd.Connection = _conn;
           
             _conn.Open();
          


jedesmal wenn ich die verbindung öffnen will: "Der Pfad ist ungültig. Überprüfen Sie das Verzeichnis der Datenbank. [ Path = |DataDirectory|\MyDatabase#1.sdf ]"

die datenbank liegt im projektverzeichnis...habe sie auch schon in "C:/" gelegt und mit

@("Data Source= C:\MyDatabase#1.sdf")

und zig anderen versionen wie: "Data Source= \MyDatabase#1.sdf"

db mal ins projekt eingebunden, mal nicht...

jedesmal der gleiche fehlermeldung =/

Grüße Jan

F
10.010 Beiträge seit 2004
vor 13 Jahren

Handy == Compact Framework, und das hat weder ein laufwerk C: noch "|Datadirectory|".

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

Das ist an sich schon logisch und klar...aber ich debugge ja auf einem emulator...hat dieser spezifische pfade?
Wenn ja, wo befinden sich die? Auf C:/Programme/Windows Mobile 5 habe ich keine Ordnerstruktur gefunden, was einigermaßen danach ausschaut.

...ich werd mich mal schlaugooglen, danke erstmal fuer den tipp,

Grüße Jan

>edit< ...habe jez mal ne windows forms anwendung mit ner sql compact db gemacht..funktioniert tadellos.

lege ich ein windows mobile project an fuer mobile geräte gehts nicht...also scheint daran was dran zu sein (:
danke schonmal...hoffe ich werde fündig.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Die daten sind nicht auf deinem PC zu finden.
Die sind in den emulator copiert und stehen dort genauso wie auf einem echten pda.

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

Mhh, und wie gehe ich dann vor?

habe es so lösen können:

      

string currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);

 string connString = string.Format("Data Source={0}\\DB.sdf", currentDirectory);


            _conn = new SqlCeConnection(connString);
           
            SqlCeCommand cmd = new SqlCeCommand();
            cmd.Connection = _conn;

            _conn.Open();



            cmd.CommandText = "INSERT INTO DB (ID,Deutsch,Englisch) VALUES (1, 'Hallo', 'hello');";

            cmd.ExecuteNonQuery();

            _conn.Close();

leider, übernimmt er die daten nicht, wenn ich die tabelle öffne.

müssten die daten nicht in der tabelle erscheinen, nachdem ich das programm beende und auf "Tabellendaten anzeige" klicke?

<edit2>: habe mal ne normale windows Form genommen, da sind die Daten direkt in der Tabelle dann zu sehen. irgendwas habe ich noch nicht verstanden/mache ich falsch =)

F
10.010 Beiträge seit 2004
vor 13 Jahren

irgendwas habe ich noch nicht verstanden/mache ich falsch =)

Ja.
Bei Debugstart werden die in der Solution enthaltenen Assemblies und Dateien auf den PDA ( egal ob echt oder Emu ) copiert und dort ausgeführt.
Die werden aber nicht zurückgeschrieben.

Wenn du also weiterhin auf dem PC schaust, kannst Du da auch nichts sehen.

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

Mhhh, gut, jetzt hats Klick gemacht, Danke.

...also sind die Daten temporär während dem debuggen im Speicher?
D.h. wenn ich die Datenbank während einer Debugsitzung schreibe und in der selben die daten auslese müsste es gehen?

...klingt logisch. =)

Vielen vielen Dank, ohne diese Erkenntnis wäre ich wohl noch Wochen dran gesessen =D

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

*push*..damit ich kein neues thema aufmachen muss.

ich will aus dem code heraus eine datenbank erstellen und diese dann öffnen:

   

string dbfile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + "\\datafile.sdf";
                
SqlCeConnection connection = new SqlCeConnection("Data Source=" + dbfile);

                
str = "CREATE DATABASE datafile (NAME = datafile_dat, FILENAME = @db)";

                
SqlCeCommand myCommand = new SqlCeCommand(str, connection);

              
 myCommand.Parameters.AddWithValue("db", dbfile);

               
connection.Open();  

	            
myCommand.ExecuteNonQuery();

sagt mir aber egal, wie ichs versuch, dass die Datenbank nicht vorhanden ist.

Grüße Jan

F
10.010 Beiträge seit 2004
vor 13 Jahren

Tja, die DB-Datei musst du halt auch anlegen.
Steht aber in der Einführung zu SqlCe auch drin.

Schau mal SqlCeEngine an.

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

Danke, war mal wieder der richtige hinweis...wer hätt es gedacht 😉

Wo finde ich denn eine ausführliche Doku zu sql compact?
Bei der msdn findet man zwar alles, WENN man den richtigen begriff zur hand hat, wie eben "sqlceengine".

Aber so eine "How to" Einführung in der msdn suche ich vergeblich..zumindest eine ausfürliche....

und bevor ich hier schreibe, suche ich mich eigentlich dumm und dämlich über google.
..dabei sprang nur der Code raus, hinweis zu sqlceengine keine spur.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Schon klar, das effektive Suchen lernt man erst wenn man sich mehr mit dem ganzen system auskennt, aber das ist in jedem bereich so.

Wenn du aber im Hilfe Index mal "sql compact" eingibst, wirst du dich dann weiterhangeln können.

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

Danke nochmal, leider habe ich den roten Faden in der msdn - falls es den gibt - nicht ganz gefunden..hoffe aber, dass ich nun nicht mehr allzu häufig hier mein "Unwesen" treibe (=.

Solltet PayPal Spendenkonten einrichten, wie es es in manchen foren gibt..hätt ich schon nen "Bier" dagelassen (;

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

*nochmal ich*

Gut, bin nun im groben fertig. klappt auch super, nur leider ist das ganze ein wenig langasm mit über 700 000 Datensätzen.

Ist jez nicht auf den vorgang "txt To sql" gemeint, sondern die suche in der sql db nach dem select:

string query = cmd.CommandText = "SELECT E FROM Dictionary Where D LIKE '" + suchwort +"'";


                SqlCeCommand myCommand = new SqlCeCommand(query, OpenSQLDB._conn);

                SqlCeDataReader myReader = myCommand.ExecuteReader();

                while (myReader.Read())
                {

                    _f1.listBox1.Items.Add(myReader.GetString(0));

                }
                myReader.Close();

ist sqlcompact vllt doch nicht das richtige für soviele datensätze?
oder gibt es da nen trick, das ganze vllt ein wenig zu optimieren?
...oder muss nen ganz andrer ansatz her?

Grüße Jan

F
10.010 Beiträge seit 2004
vor 13 Jahren

1, Niemals parameter in den Sql String friemeln. [Artikelserie] Parameter von SQL Befehlen

  1. 700.000 Datensätze machen dem SqlCompact nichts aus, aber definitv dem PDA.
    Der ist meist speicher und Prozessormässig nicht sonderlich performant.

Aber wie ist das mit Index in deiner DB?

Du kannst auch mal SQLite probieren, da gibt es auch eine für das CF,

Achso, das halten der Daten in UI Elementen ist eine schlechte Angewohnheit.
Schau die mal databinding an.

Und noch etwas, nicht für neue Fragen den Titel des Thread ändern, sondern neue aufmachen.

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

zum index in der db:

hab den jetzt einfach mal rausgenommen und nur 2 spalten mit deutschem und englischem wort in die tabelle eingetragen..
wozu ist der gut? zwecks dem select?

ich kannte es von mysql dbs, dass der index selber in dei tabelle mit eingetragen wird.
ist das hier auch möglich?

databinding, damit hab ich mich anfänglich mal ein wenig rumgeschlagen, werde aber nicht schlau draus, was ich damit anfangen soll...

letzeres werde ich mir zu herzen nehmen.

Danke, und schönes wocheende

grüße

F
10.010 Beiträge seit 2004
vor 13 Jahren

Ich meinte eher, ist ein Index vorhanden.
Denn mit Index auf den in der abfrage enthaltenen Spalten geht suchen natürlich deutlich schneller.

DataBinding ist doch so einfach und gerade beim CF mit dem CeResultSet resourcenschonend zu implementieren.

Ich mache da heute abend mal ne demo zu.
Muss jetzt golfen.

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

Vielen dank, das wäre echt nett.

Hoffe hast/hattest Erfolg beim Einlochen (;

Grüße Jan

328 Beiträge seit 2006
vor 13 Jahren

Na super, da hätte ich mir meine Antwort auch sparen können...

Crosspost: http://www.pda-dev.de/topic.asp?TOPIC_ID=1675

Robert Wachtel

http://blog.robertsoft.de

F
10.010 Beiträge seit 2004
vor 13 Jahren

@j4n:
Ja hatte ich.

Und wegen [Hinweis] Wie poste ich richtig? Punkt 2.2 gibt es jetzt keine Demo.

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

bitte vielmals um entschuldigung, wusste nicht, dass dies nicht erwünscht ist...geschweige denn was crossposting ist. muss zugeben, dass ich ein wenig ungeduldig bin, was u.a. damit zusammenhängt, dass ich sehr ehrgeizig bin neues zu lernen und einfach begeisterter programmierer bin - befinde mich im ersten lehrjahr - vorallrm c# hat es mir angetan, was ich mir gerade neben der ausbildung zu c ++ aneignen will...wo ich bisher nur mit der konsole gearbeitet habe und eine fw zu einem funkttemperaturfuehler programmiert habe. nochmal nen grosses sry an alle fuer mein fehlverhalten. ich gelobe besserung und auf jedenfall nochmal nen grosses danke die mir bisher geholfen haben (:. schoenen sonntag nachmittag noch. gruesse jan

F
10.010 Beiträge seit 2004
vor 13 Jahren

Dann solltest Du dir in zukunft angewöhnen erst die FAQ der jeweiligen Community zu lesen.

Zu deinem Problem mit den 700.000 Datensätzen.
Da der SqlServer Compact kein dedizierter server ist, wird beim ersten Suchen der Ausführungsplan erstellt, ggf ein index gelesen usw.

Deshalb ist das erste lesen immer langsamer.
Beim 2. suchen geht es dann schon deutlich schneller.

In der Demo wird eine DB mit mehr als einer Übersetzung benutzt, die allerdings nicht ganz so viele Datensätze hat.
Hier kannst du mal das mit dem DataBinding ansehen.

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

Ja, das werde ich in Zukunt machen, vielen Dank.

...sieht gar nicht so kompliziert aus, werde es mir morgen mal testen und Bericht geben.

Grüße Jan

J
j4n Themenstarter:in
30 Beiträge seit 2010
vor 13 Jahren

So, habe nun nochmal alles getestet, viel schneller ist der code leider nicht...schon bei ca 7000 einträgen dauert die suche ca. 4 sekunden.

denke sql ist wohl leider nichts für diese anwendung.

das direkte einlesen der txt ist da um einiges schneller, das suchergebnis ist auch in unspürbarer zeit da...

   string Pfad = string.Empty;

            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.Filter = "txt files (*.txt)|*.txt";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
                Pfad = openFileDialog1.FileName;



            StreamReader testTxt = new StreamReader(Pfad);

            string allRead = testTxt.ReadToEnd();//Reads the whole text file to the end
            testTxt.Close(); //Closes the text file after it is fully read.
            string regMatch = searchstring; //string to search for inside of text file. It is case sensitive.
           
            if (Regex.IsMatch(allRead,regMatch))//If the match is found in allRead
                textBox2.Text = searchstring;

nun brauche ich nur eine passende ergebnisausgabe, welche mir die Übersetzung liefert.

Trotzdem nochmal vielen Dank, denke habe mir durch die Hilfe hier doch was aneignen können =)

Grüße Jan

Hinweis von herbivore vor 13 Jahren

geschlossen wegen [Hinweis] Wie poste ich richtig? Punkt 2.2

Thema geschlossen