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
Handy == Compact Framework, und das hat weder ein laufwerk C: noch "|Datadirectory|".
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.
Die daten sind nicht auf deinem PC zu finden.
Die sind in den emulator copiert und stehen dort genauso wie auf einem echten pda.
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 =)
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.
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
*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
Tja, die DB-Datei musst du halt auch anlegen.
Steht aber in der Einführung zu SqlCe auch drin.
Schau mal SqlCeEngine an.
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.
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.
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 (;
*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
1, Niemals parameter in den Sql String friemeln. [Artikelserie] Parameter von SQL Befehlen
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.
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
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.
Vielen dank, das wäre echt nett.
Hoffe hast/hattest Erfolg beim Einlochen (;
Grüße Jan
Na super, da hätte ich mir meine Antwort auch sparen können...
Robert Wachtel
@j4n:
Ja hatte ich.
Und wegen [Hinweis] Wie poste ich richtig? Punkt 2.2 gibt es jetzt keine Demo.
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
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.
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
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
geschlossen wegen [Hinweis] Wie poste ich richtig? Punkt 2.2