Datenbank auslesen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    @VB1963 danke für den Link.
    @Busfahring Verstehst keinen Sarkasmus oder ;)

    Schau dir das nochmal an:

    mrMo schrieb:

    In deinem jetzigen SQL Statement hast du plötzlich wieder Hochkommas drin. Vorhin hattest noch beim funktionierenden Statement diese anderen "schrägen Hochkommas".
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hat nun endlich geklappt. Nun bekomme ich wenn ich etwas eingebe was nicht vorhanden ist das er mir immer einen Fehler anzeigt der von Windows bestimmt ist. gerne würde ich hierfür aber eine MsgBox verwenden.

    Also wenn der Wert nicht vorhanden ist bringt

    VB.NET-Quellcode

    1. myData = myCommand.ExecuteReader() ' Hier startet man die SQL Abfrage


    einen fehler mit

    Wie könnte ich das am sinnvollsten beheben
    Prüf doch die Eingabe der Textbox und wenn da was nicht passt, machst du keine Abfrage auf sie DB sondern zeigst dem User ne nette Meldung in einer MessageBox an.

    If TextBox.Text = Blödsinn Then
    MessageBox.Show("Eingabe falsch")
    Else
    DB Zeug machen
    End If
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Klar raucht es ab. Daher hatte ich empfohlen: Prüfe, bevor du dein SQL abschießt, die Eingabe der Textbox.


    Übrigens ist es nicht sehr empfehlenswert, den Benutzer die Tabelle frei Hand eingeben zu lassen. Nimm doch me ComboBox und füge dieser die Tabellen deiner DB hinzu. Dann muss der Benutzer nur nich auswählen was er haben will...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Habe jetzt nicht alles gelesen in diesem Thread. Gehe aber davon aus, dass irgendjemand schon mal auf SQL-Injection und parametrisierte SQL-Commands aufmerksam gemacht hat?

    Das ist ja total schlimm, diese zusammengeschusterten Strings. Erinnert mich an VB und VBA*schauder*. Besser ist doch es gleich sauber zu machen, wenn es "mittlerweile" Möglichkeiten dafür gibt, oder? :)

    mrMo schrieb:

    Klar raucht es ab. Daher hatte ich empfohlen: Prüfe, bevor du dein SQL abschießt, die Eingabe der Textbox.


    Übrigens ist es nicht sehr empfehlenswert, den Benutzer die Tabelle frei Hand eingeben zu lassen. Nimm doch me ComboBox und füge dieser die Tabellen deiner DB hinzu. Dann muss der Benutzer nur nich auswählen was er haben will...


    Es soll nicht alles vom Programm aus definiert werdeen sondern über die Datenbank. Daher ist dies nicht sehr sinnvoll.
    Es soll nicht alles vom Programm aus definiert werdeen sondern über die Datenbank. Daher ist dies nicht sehr sinnvoll.


    What??? Ja aber die Tabelle muss es in der DB doch geben um Daten von ihr anfragen zu können... Daher einfach eine Auswahlmöglichkeit per ComboBox anbieten.

    Naja, wenn du sas nicht willst, packste den DB Zugriff in einen Try/Catch. Der fängt den Fehler und dein Programm raucht nicht ab.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Settings
    Spoiler anzeigen

    C#-Quellcode

    1. class Statics
    2. {
    3. public static Column LaenderCol { get; private set; } = new Column("leander", "TEXT");
    4. public static Column HautpstadtCol { get; private set; } = new Column("Stadt", "TEXT");
    5. public static Column ID { get; private set; } = new Column("ID", "INTEGER PRIMARY KEY AUTOINCREMENT");
    6. public static Table Laender { get; private set; } = new Table("Laender", LaenderCol, HautpstadtCol, ID);
    7. }


    Initialisieren
    Spoiler anzeigen

    C#-Quellcode

    1. DBMAnager = new DatabaseManager("Lern");
    2. DBMAnager.CreateTable(Statics.Laender);


    DatabaseManager
    Spoiler anzeigen

    C#-Quellcode

    1. public class DatabaseManager
    2. {
    3. public string DatabaseName { get; set; }
    4. private SQLiteConnection Connection;
    5. public DatabaseManager(string databasename = "base")
    6. {
    7. Connection = new SQLiteConnection($"Data Source={databasename}.s3db");
    8. Connection.Open();
    9. Connection.Close();
    10. }
    11. public void CreateTable(Table table)
    12. {
    13. string query = $"CREATE TABLE IF NOT EXISTS {table.TableName}({string.Join(", ", table.Columns.Select(column => column.GetCreateQuery()))});";
    14. SingleQuery(query);
    15. }
    16. public void CreateTable(Table table, string settings)
    17. {
    18. string query = $"CREATE TABLE IF NOT EXISTS {table.TableName}({string.Join(", ", table.Columns.Select(column => column.GetCreateQuery()))},{settings});";
    19. SingleQuery(query);
    20. }
    21. public void CreateTables(Table[] tables)
    22. {
    23. foreach (Table table in tables) {
    24. string query = $"IF NOT EXISTS CREATE TABLE {table.TableName}({string.Join(", ", table.Columns.Select(column => column.GetCreateQuery()))});";
    25. SingleQuery(query);
    26. }
    27. }
    28. public void Insert(Table table, (Column column, string value)[] values)
    29. {
    30. string query = $"INSERT INTO {table.TableName}({string.Join(", ", values.Select(item => item.column.Name))}) VALUES ({string.Join(", ", values.Select(item => item.value))});";
    31. SingleQuery(query);
    32. }
    33. public void Inserts(Table table,List<(Column column, string value)[]> values)
    34. {
    35. foreach (var items in values) {
    36. string query = $"INSERT INTO {table.TableName}({string.Join(", ", items.Select(item => item.column.Name))}) VALUES ({string.Join(", ", items.Select(item => item.value))});";
    37. SingleQuery(query);
    38. }
    39. }
    40. public List<(Column column, string value)[]> Select(Table table, Column[] columns)
    41. {
    42. string query = $"SELECT {string.Join(",", columns.Select(item => item.Name))} FROM {table.TableName};";
    43. SQLiteDataReader reader = ReaderQuery(query);
    44. return GetReaderReponse(columns, reader);
    45. }
    46. public List<(Column column, string value)[]> Select(Table table, Column[] columns, string order)
    47. {
    48. string query = $"SELECT {string.Join(",", columns.Select(item => item.Name))} FROM {table.TableName} {order};";
    49. SQLiteDataReader reader = ReaderQuery(query);
    50. return GetReaderReponse(columns, reader);
    51. }
    52. private void SingleQuery(string query)
    53. {
    54. Console.WriteLine($"SingleQuery:{query}");
    55. lock (Connection) {
    56. Connection.Open();
    57. SQLiteCommand command = Connection.CreateCommand();
    58. command.CommandText = query;
    59. command.ExecuteNonQuery();
    60. command.Dispose();
    61. Connection.Close();
    62. }
    63. }
    64. private SQLiteDataReader ReaderQuery(string query)
    65. {
    66. Console.WriteLine($"SingleQuery:{query}");
    67. SQLiteDataReader reader = null;
    68. lock (Connection) {
    69. Connection.Open();
    70. SQLiteCommand command = Connection.CreateCommand();
    71. command.CommandText = query;
    72. reader = command.ExecuteReader();
    73. command.Dispose();
    74. Connection.Close();
    75. }
    76. return reader;
    77. }
    78. private List<(Column column, string value)[]> GetReaderReponse(Column[] columns, SQLiteDataReader reader)
    79. {
    80. List<(Column column, string value)[]> items = new List<(Column column, string value)[]>();
    81. while (reader.Read()) {
    82. (Column column, string value)[] acc = new(Column column, string value)[columns.Length];
    83. for (int i = 0; i < columns.Length; i += 1) {
    84. Column cal = columns[i];
    85. acc[i] = (cal, reader[cal.Name].ToString());
    86. }
    87. items.Add(acc);
    88. }
    89. return items;
    90. }
    91. }
    92. public class Table
    93. {
    94. public string TableName { get; private set; }
    95. public List<Column> Columns { get; private set;}
    96. public Table(string tablename,params Column[] columns)
    97. {
    98. TableName = tablename;
    99. Columns = new List<Column>();
    100. Columns.AddRange(columns);
    101. }
    102. public void Addcolumn(Column column)
    103. {
    104. Columns.Add(column);
    105. }
    106. public void Addcolumns(Column[] columns)
    107. {
    108. Columns.AddRange(columns);
    109. }
    110. }
    111. public class Column
    112. {
    113. public string Name { get; private set; }
    114. public string Typ { get; private set; }
    115. public Column(string name, string typ)
    116. {
    117. Name = name;
    118. Typ = typ;
    119. }
    120. public string GetCreateQuery() => $"{Name} {Typ}";
    121. }


    Natürlich könnte man hier noch mit Parallel.For und Yield arbeiten aber das hab ich noch nicht gemacht und war neben sächlich erstmal :thumbsup:
    @Facebamm was genau hat deine Antwort mit der Frage des TE zu tun? Der will doch gar keine Tabellen zur Laufzeit anlegen...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Er hat doch Probleme mit seinen Querys. Also hab ich mal meins geschickt als Example.

    Und wenn er dann die Erstellten Tabellen speichern möchte. #noch Dynamischer
    Erstellt er sich eine Klasse ('MeineTabellen' o.ä) erstellt dort eine Liste mit Tabellen als Typ.
    Macht das ganze '[Serializable]' und speichert sich die Klasse, so hat er immer seine Tabellen bei sich
    und zur sql-injec., prüfe einfach auf leerzeichen evtl noch auf ';' :D und dann sollte das reichen

    Speichern mit
    Spoiler anzeigen

    C#-Quellcode

    1. using (FileStream serializationStream = new FileStream(sFile, FileMode.Create))
    2. new BinaryFormatter().Serialize(serializationStream, "Deine Klassen Variable");

    öffnen
    Spoiler anzeigen

    C#-Quellcode

    1. public static AIPatter Load(String sFile)
    2. {
    3. "Deine Klasse" varia;
    4. try {
    5. using (FileStream serializationStream = new FileStream(sFile, FileMode.Open))
    6. varia = ("Deine Klasse")new BinaryFormatter().Deserialize(serializationStream);
    7. } catch {
    8. MessageBoxResult result = MessageBox.Show("File not found, would you create?", "File not found", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes);
    9. if (result == MessageBoxResult.Yes)
    10. File.Create(sFile);
    11. return new "Deine Klasse"();
    12. }
    13. return varia;
    14. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Facebamm“ ()