Benutzer mit den meisten Antworten
Such in einer SQLite Datenbank

Frage
-
Hallo Zusammen Ich bin Einsteiger und habe wohl ein Beginner Problem.
Ich hab mich mal versucht an Xamarin Cross Plattform und habe eine kleine
Sqlite Datenbank Anwendung geschrieben. Die Tutorials von Mikrosoft waren echt gut
Für die Funktionen Erstellen, Ändern und Löschen. Nur Leider nicht um einen Datensatz zu suchen.
So wie ich das verstanden hab sollte ich doch über Querry einen SQL Befehl senden können:
return _database.QueryAsync<Person>("SELECT * FROM Person WHERE Name LIKE '% " + string);
Table ist Person und Collum Name string kommt über eine Search Bar .
Ich bekomme aber leider nur die Fehlermeldung
System.InvalidCastException: 'Specified cast is not valid.'
Wer kann mir da mal aud die Sprünge Helfen mit Rat und Tad oder der nennung einer Quelle
wo ich was nachlesen kann
Danke in voraus
Antworten
-
Hi,
return _database.QueryAsync<Ereignisse>("SELECT * FROM Ereignisse WHERE Spinfo LIKE '%'"+ a);
wäre sinnvoller so:
return _database.QueryAsync<Ereignisse>("SELECT * FROM Ereignisse WHERE Spinfo LIKE '%" + a + "%'" );
oder:
return _database.QueryAsync<Ereignisse>( $"SELECT * FROM Ereignisse WHERE Spinfo LIKE '%{a}%'" );
Achte aber strikt darauf, dass Du jegliche Eingabe in die SQL Abfragen (wie bspw. deine Variable a) vollständig gegen SQL Injection absicherst.
Alternativ (was auch sinnvoller und sicherer wäre) arbeite mit Parametern. Siehe dazu bspw.:
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 27. Februar 2020 07:23
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 6. März 2020 14:20
- Tag als Antwort aufgehoben Thomas 19078 Freitag, 6. März 2020 17:15
- Als Antwort markiert Thomas 19078 Freitag, 6. März 2020 17:15
Alle Antworten
-
Hallo,
Du bentuzt doch SQLite-net-pcl wie hier beschrieben Link.
Wenn ja, kannst Du einfach über die Tabelle suchen
//Gibt eine auflistung aller Personen mit diesem Vornamen zurück var all = _database.Table<Person>().Where(a => a.Name == "Thomas").ToList(); //Gibt eine Person mit diesem vornamen zurück oder null var first = _database.Table<Person>().FirstOrDefault(a => a.Name == "Thomas");
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings -
Ja genau ich benutze die gleiche Database wie im Turorial
deshalb hab ich folgende Funktion hinzugefüg
public Task <Person> GetPersonSortAsync()
{
return _database.Table<Person>().FirstOrDefaultAsync(e => e.Name == "Thomas");
}die ich wie folgt aufrufe
await App.Database.GetPersonSortAsync();
await Navigation.PopAsync();Nur leider bekomme ich auch wieder nur System.InvalidCastException: 'Specified cast is not valid.' -
Versuche es mal so
public async Task<Person> GetPersonSortAsync() { return await _database.Table<Person>().FirstOrDefaultAsync(e => e.Name == "Thomas"); }
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings -
Nee leider die gleiche Fehlermeldung
- Bearbeitet Thomas 19078 Donnerstag, 20. Februar 2020 21:32
-
Diese Meldung kommt eigentlich nur wenn man auf etwas zugreifen will das als private gekennzeichnet ist.
Poste mal den Code zu Database aus App und zudem noch die Database Klasse
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings -
Hallo Thomas
Ich hab jetzt alles noch mal neu erstellt
Hier ist die Classe
using System;
using System.Collections.Generic;
using System.Text;
using SQLite;namespace MyScheduler.Model
{
public class Ereignisse
{
[PrimaryKey,AutoIncrement]
public int ID { get; set; }
public string SpDatum { get; set; }
public string SpEreigniss { get; set; }
public string SpInfo { get; set; }
}
}Und hier ist die Database
using System;
using System.Collections.Generic;
using System.Text;
using SQLite;
using MyScheduler.Model;
using System.Threading.Tasks;namespace MyScheduler.Data
{
public class EreignissDatabase
{
readonly SQLiteAsyncConnection _database;
public EreignissDatabase(string dbPath)
{
_database = new SQLiteAsyncConnection(dbPath);
_database.CreateTableAsync<Ereignisse>().Wait();
}
public Task <List<Ereignisse>> GetEreignisseAsync()
{
return _database.Table<Ereignisse>().ToListAsync();
}
public Task<Ereignisse> GerEreignisseAsync(int id)
{
return _database.Table<Ereignisse>().Where(i => i.ID == id).FirstOrDefaultAsync();
}public Task<List<Ereignisse>> GetEreignisseSortAsync(Ereignisse ereignisse, string a)
{
return _database.QueryAsync<Ereignisse>("SELECT * FROM Ereignisse WHERE Spinfo LIKE '%'"+ a);
}
public Task<int> SaveEreignisseAsync(Ereignisse ereignisse)
{
if (ereignisse.ID != 0)
{
return _database.UpdateAsync(ereignisse);
}
else
{
return _database.InsertAsync(ereignisse);
}
}
public Task<int>DeleteEreignisseAsync(Ereignisse ereignisse)
{
return _database.DeleteAsync(ereignisse);
}
}
}
Der Aufruf der markierten Funktion
async void Search_SearchButtonPressed(object sender, EventArgs e)
{var ereignisse = (Ereignisse)BindingContext;
string keyword = Search.Text.ToString();await App.Database.GetEreignisseSortAsync(ereignisse, keyword);await Navigation.PopAsync();}
Das Resultat ist folgende Fehlermeldung
SQLite.SQLiteException: 'near "Thomas": syntax error'
- Bearbeitet Thomas 19078 Freitag, 21. Februar 2020 18:52
-
Du solltest dich erstmal mit den basics von C# und Asynchrone Programmierung mit async und await beschäftigen. Du solltest dich auch erstmal entweder für Linq oder SQL entscheiden. Vor allem solltest Du den unterschied kennen. Hier im Forum können wir dir bei Problemen helfen die basics musst Du dir aber schon selbst beibringen.
Wenn Du aber weiterhin wild rumprobieren willst, dann mach das. Ich kann dir so nicht helfen
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings
- Bearbeitet Thomas Wycichowski Freitag, 21. Februar 2020 19:50
-
Hi,
return _database.QueryAsync<Ereignisse>("SELECT * FROM Ereignisse WHERE Spinfo LIKE '%'"+ a);
wäre sinnvoller so:
return _database.QueryAsync<Ereignisse>("SELECT * FROM Ereignisse WHERE Spinfo LIKE '%" + a + "%'" );
oder:
return _database.QueryAsync<Ereignisse>( $"SELECT * FROM Ereignisse WHERE Spinfo LIKE '%{a}%'" );
Achte aber strikt darauf, dass Du jegliche Eingabe in die SQL Abfragen (wie bspw. deine Variable a) vollständig gegen SQL Injection absicherst.
Alternativ (was auch sinnvoller und sicherer wäre) arbeite mit Parametern. Siehe dazu bspw.:
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 27. Februar 2020 07:23
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 6. März 2020 14:20
- Tag als Antwort aufgehoben Thomas 19078 Freitag, 6. März 2020 17:15
- Als Antwort markiert Thomas 19078 Freitag, 6. März 2020 17:15
-
Hallo Leute !
Ich wollte mich mal bei allen Bedanken die mir
mit Rat geholfen habe, Dank eurer Hilfe hab ich das Letzte
Puzzel Teilchen gefunden und nun das ganze zum Laufen gebracht.
Also Danke und macht Weiter so!!!
- Bearbeitet Thomas 19078 Dienstag, 3. März 2020 19:04
-
Hallo Thomas,
Ich wollte mich mal bei allen Bedanken die mir
mit Rat geholfen habe,Ich möchte Dich diesbezüglich auf das Markieren als Antwort hinweisen. Dadurch kannst Du Dich nicht nur bedanken, sondern auch die Beiträge, die zur Lösung geführt haben, für künftige Leser zur besseren Übersichtlichkeit hervorheben.
· Lösungsbeiträge als “Die Antwort“ markieren
Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.
[Quelle: Forenregeln]Gruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.