Question

Je suis le stockage et l'édition de certains champs dans une base de données qui implique une longue chaîne d'une ou plusieurs phrases. chaque fois que je rentre un guillemet simple dans la zone de texte et que vous souhaitez l'enregistrer, il lance une exception comme "syntaxe incorrecte près de 'l'. guillemet Unclosed après la chaîne de caractères « ». » est-il une idée pour éviter cela?

EDIT: La requête est:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + 
    tbQuestion.Text + "]', Answer = '[" + 
    tbAnswer.Text + "]', LastEdit = '" + 
    CurrentUser.Login + 
    "'WHERE ID = '" + CurrentQuestion.ID + "'");
Était-ce utile?

La solution

KM dit, ne le faites pas!

Do ce au lieu:

private static void UpdateQuestionByID(
    int questionID, string question, string answer, string lastEdited)
{
    using (var conn = new SqlConnection(connectionString))
    {
        conn.Open();
        const string QUERY =
            @"UPDATE Questions " +
            @"SET Question = @Question, Answer = @Answer, LastEdit = @LastEdited " +
            @"WHERE ID = @QuestionID";
        using (var cmd = new SqlCommand(QUERY, conn))
        {
            cmd.Parameters.AddWithValue("@Question", question);
            cmd.Parameters.AddWithValue("@Answer", answer);
            cmd.Parameters.AddWithValue("@LastEdited", lastEdited);
            cmd.Parameters.AddWithValue("@QuestionID", questionID);
            cmd.ExecuteNonQuery();
        }
    }
}

Autres conseils

Si vous souhaitez inclure un guillemet simple dans un champ SQL, échapper en utilisant des guillemets simples

'''Test''' = 'Text'

Ceci est pour SQL Server.

Ecrire un produre stocké pour faire votre édition de champ et utiliser des paramètres SQL pour enregistrer la valeur. Citations ne sera pas question. Si vous ne voulez pas un au moins procédure stockée construire votre texte SQL avec des marqueurs de paramètres et utiliser les paramètres SQL avec cela.

il est difficile de vous donner une réponse précise, parce que vous omettez la base de données ou la langue application que vous utilisez.

Vous devez construire votre SQL dynamique, et la citation à l'intérieur de la piqûre est interprété comme la fin de la chaîne. En fonction de la base de données que vous utilisez, vous devez échapper aux guillemets simples dans chaque chaîne que vous souhaitez utiliser dans votre commande SQL. Cela peut être vu par l'impression de votre requête avant d'essayer de l'exécuter.

Vous ne mentionnez pas l'application que vous appelez la base de données, mais quand vous vous construisez la commande que vous devez utiliser une commande que vous écrivez ou si elle est fournie par votre langue FIX_QUOTES ():

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + FIX_QUOTES(tbQuestion.Text) + "]', Answer = '[" + FIX_QUOTES(tbAnswer.Text) + "]', LastEdit = '" + FIX_QUOTES(CurrentUser.Login) + "'WHERE ID = '" + FIX_QUOTES(CurrentQuestion.ID) + "'"); – A

Ce type de requête dynamique est très facile pour un attaque par injection sql . Je recommande d'appeler la base de données avec une procédure stockée ou avec une liste de paramètres.

MSSQL vous pouvez doubler vos citations:

my dodg'y test          -> 'my dodg''y test'
my 'quoted' string      -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''

Comme certains l'ont déjà dit, en ajoutant une citation supplémentaire fera l'affaire. Je peux confirmer que cela est également le cas pour Oracle (d'autres ont donné cette réponse est valide pour MSSQL et SQL Server). Je pense que l'utilisation des procédures stockées est trop pour cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top