Domanda

Io sono l'archiviazione e la modifica di qualche campo in un database che comporta una lunga serie di una o più frasi. ogni volta che entro in una singola citazione nella casella di testo e voglio salvarla viene generata un'eccezione come "la sintassi non corretta in prossimità 'l'. Unclosed virgolette dopo la stringa di caratteri '' ". c'è qualche idea per evitare questo?

Modifica La query è:

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

Soluzione

Come ha detto KM, non lo fate!

Do questo , invece:

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();
        }
    }
}

Altri suggerimenti

Se si desidera includere un apice in un campo di SQL, la fuga usando apici

'''Test''' = 'Text'

Questo è per SQL Server.

Scrivi una produre memorizzata per fare l'editing campo e utilizzare parametri SQL per salvare il valore. Citazioni non importa. Se non si desidera un proc memorizzato almeno costruire il tuo testo SQL con indicatori di parametro e utilizzare i parametri SQL con questo.

è difficile dare una risposta specifica, perché non si nomina il linguaggio database o applicazione che si sta utilizzando.

Devi essere costruendo il vostro SQL dinamico, e la citazione all'interno del pungiglione viene interpretata come la fine della stringa. A seconda del database in uso, è necessario sfuggire le virgolette singole all'interno di ogni stringa che si intende utilizzare nel vostro comando SQL. Questo può essere visto stampando la query prima di provare a eseguirlo.

Non accennate l'applicazione che si sta chiamando il database da, ma quando si costruisce si comando è necessario utilizzare un comando FIX_QUOTES () che si scrive o se fornito dal lingua:

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

Questo tipo di query dinamica è molto facile per un attacco SQL iniezione . mi sento di raccomandare chiamando il database con una stored procedure o con una lista di parametri.

In MSSQL si possono raddoppiare le vostre citazioni:

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

Come qualcuno ha già detto, aggiungendo un preventivo in più farà il trucco. Posso confermare che questo è anche il caso di Oracle (gli altri hanno dato questa risposta sia valida per MSSQL e SQL Server). Credo che l'utilizzo di stored procedure è eccessivo per questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top