none
Frage zu Hochzeichen RRS feed

  • Frage

  • Hallo, ich bastle Strings für SQL-Statments. Es enstehen solche Strings: "INSERT INTO tab (name) VALUES (" + String.Format("'{0:s}'", 'Michael') + ");" Bis dahin alles klar. Jetzt kann es sein das in dem Namen eben falls ' enthalten sind (französisch ...) - dann muss man das escapen. Aber wenn ich da aus Tabellen einlese wie muss ich das automtisch escapen oder gibts auch eine andere Lösung? Danke Michael
    Dienstag, 5. Juli 2011 10:20

Antworten

  • Automatischt geht es nur mit Prepared Statements, welche auch zu bevorzugen sind, anstatt die SQL Statements von Hand zusammenzuschrauben,
    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    • Als Antwort vorgeschlagen Frank Dzaebel Dienstag, 5. Juli 2011 11:22
    • Als Antwort markiert mimuel Donnerstag, 7. Juli 2011 07:43
    Dienstag, 5. Juli 2011 10:38
  • Hallo Michael,

    das "Formatieren" von SQL Anweisungen auf diese Weise sollte man generell unterlassen.
    Denn spätesten bei "Michael's" geht das schief.
    Wenn Du Unicode-Daten verwendest erfordert der SQL Server (u. a.) ein N als Präfix, z. B. N'Michael'.
    Nicht zuletzt machst Du den Code anfällig für SQL Injection.

    Auf der anderen Seite gilt:
    Der Accent aigu (\u00b4) ist in Verbindung mit einem anderen Buchstaben kein Problem,
    da das eine andere Codierung wäre (z. B. Café) und es ist nichts zu "escapen".
    Als Literaltrenner wird er üblicherweise mehr bei MySql verwendet.
    Beim SQL Server nimmt man das einfache Anführungszeichen (', \u0027).

    Deswegen verwende Parameter, beim SQL Server SqlParameter:

    var command = new SqlCommand("INSERT INTO tab (name) VALUES (@name)', connection);
    command.Parameters.AddWithValue("@name", "Michael's Café");
    

    oder bei MySql MySqlParameter:

    var command = new MySqlCommand("INSERT INTO tab (name) VALUES (?name)', connection);
    command.Parameters.AddWithValue("?name", "Michael's Café");
    

    Gruß Elmar

    • Als Antwort vorgeschlagen Frank Dzaebel Dienstag, 5. Juli 2011 11:22
    • Als Antwort markiert mimuel Donnerstag, 7. Juli 2011 07:43
    Dienstag, 5. Juli 2011 10:42
    Beantworter
  • Hallo Michael,

    Dein Vorgehen ist nicht ungefährlich. Auch deshalb würde ich das Ganze eher über Parameter erledigen:

    using(SqlCommand insertCommand = new SqlCommand("INSERT INTO tab (name) VALUES (@name) ", connection))
    {
       insertCommand.Parameters.AddWithValue("@name", myOtherDataTable.Name); 
       insertCommand.Connection.Open(); 
       insertCommand.ExecuteNonQuery(); 
       insertCommand.Connection.Close(); 
    }


    SqlCommand.Parameters-Eigenschaft:
    http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlcommand.parameters.aspx

    Gruß
    Marcel

    • Als Antwort vorgeschlagen Frank Dzaebel Dienstag, 5. Juli 2011 11:24
    • Als Antwort markiert mimuel Donnerstag, 7. Juli 2011 07:43
    Dienstag, 5. Juli 2011 10:44
    Moderator

Alle Antworten

  • Automatischt geht es nur mit Prepared Statements, welche auch zu bevorzugen sind, anstatt die SQL Statements von Hand zusammenzuschrauben,
    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    • Als Antwort vorgeschlagen Frank Dzaebel Dienstag, 5. Juli 2011 11:22
    • Als Antwort markiert mimuel Donnerstag, 7. Juli 2011 07:43
    Dienstag, 5. Juli 2011 10:38
  • Hallo Michael,

    das "Formatieren" von SQL Anweisungen auf diese Weise sollte man generell unterlassen.
    Denn spätesten bei "Michael's" geht das schief.
    Wenn Du Unicode-Daten verwendest erfordert der SQL Server (u. a.) ein N als Präfix, z. B. N'Michael'.
    Nicht zuletzt machst Du den Code anfällig für SQL Injection.

    Auf der anderen Seite gilt:
    Der Accent aigu (\u00b4) ist in Verbindung mit einem anderen Buchstaben kein Problem,
    da das eine andere Codierung wäre (z. B. Café) und es ist nichts zu "escapen".
    Als Literaltrenner wird er üblicherweise mehr bei MySql verwendet.
    Beim SQL Server nimmt man das einfache Anführungszeichen (', \u0027).

    Deswegen verwende Parameter, beim SQL Server SqlParameter:

    var command = new SqlCommand("INSERT INTO tab (name) VALUES (@name)', connection);
    command.Parameters.AddWithValue("@name", "Michael's Café");
    

    oder bei MySql MySqlParameter:

    var command = new MySqlCommand("INSERT INTO tab (name) VALUES (?name)', connection);
    command.Parameters.AddWithValue("?name", "Michael's Café");
    

    Gruß Elmar

    • Als Antwort vorgeschlagen Frank Dzaebel Dienstag, 5. Juli 2011 11:22
    • Als Antwort markiert mimuel Donnerstag, 7. Juli 2011 07:43
    Dienstag, 5. Juli 2011 10:42
    Beantworter
  • Hallo Michael,

    Dein Vorgehen ist nicht ungefährlich. Auch deshalb würde ich das Ganze eher über Parameter erledigen:

    using(SqlCommand insertCommand = new SqlCommand("INSERT INTO tab (name) VALUES (@name) ", connection))
    {
       insertCommand.Parameters.AddWithValue("@name", myOtherDataTable.Name); 
       insertCommand.Connection.Open(); 
       insertCommand.ExecuteNonQuery(); 
       insertCommand.Connection.Close(); 
    }


    SqlCommand.Parameters-Eigenschaft:
    http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlcommand.parameters.aspx

    Gruß
    Marcel

    • Als Antwort vorgeschlagen Frank Dzaebel Dienstag, 5. Juli 2011 11:24
    • Als Antwort markiert mimuel Donnerstag, 7. Juli 2011 07:43
    Dienstag, 5. Juli 2011 10:44
    Moderator