none
Such in einer SQLite Datenbank RRS feed

  • 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

    Donnerstag, 20. Februar 2020 19:50

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.:

      SQLite - Parameters


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 21. Februar 2020 23:37
    Moderator

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

    Donnerstag, 20. Februar 2020 20:16

  • 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.'

    Donnerstag, 20. Februar 2020 21:02
  • 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

    Donnerstag, 20. Februar 2020 21:06
  • Nee leider die gleiche Fehlermeldung


    • Bearbeitet Thomas 19078 Donnerstag, 20. Februar 2020 21:32
    Donnerstag, 20. Februar 2020 21:17
  • 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

    Donnerstag, 20. Februar 2020 21:32
  • 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'



    Freitag, 21. Februar 2020 13:48
  • 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



    Freitag, 21. Februar 2020 19:47
  • 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.:

      SQLite - Parameters


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 21. Februar 2020 23:37
    Moderator
  • 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!!!


    Montag, 2. März 2020 20:32
  • 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ß,
    Dimitar


    Bitte 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.

    Mittwoch, 4. März 2020 15:14
    Moderator