2009-07-14 7 views
8

Sto memorizzando e modificando alcuni campi in un database che implica una lunga stringa di una o più frasi. ogni volta che inserisco una citazione singola nella casella di testo e voglio salvarla, genera un'eccezione come "Sintassi errata vicino a" l " Virgolette uncluse dopo la stringa di caratteri" "." c'è qualche idea per evitarlo?Come aggiungere preventivi a un comando SQL dinamico?

EDIT: La query è:

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

Mostrare l'istruzione SQL che si sta utilizzando. –

+0

semplicemente escape 'con un altro' come * Hell's Angels * a ** Hell''s Angels ** – TheVillageIdiot

+0

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

risposta

11

Come detto KM, non farlo!

Do invece questo:

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

grazie mille, l'hai anche implementata. u rock;) –

+1

+1 per la parametrizzazione – booyaa

3

Scrivi una produre memorizzata per fare l'editing campo e utilizzare parametri SQL per salvare il valore. Le citazioni non contano. Se non si desidera che un processo memorizzato almeno crei il testo SQL con i marcatori di parametro e utilizzi i parametri SQL con quello.

6

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

'''Test''' = 'Text' 

Questo è per SQL Server.

+3

Sarebbe molto più sicuro usare invece SQL parametrizzato. – LukeH

+0

Luke: Certo, ma non mi siederò qui e cercherò di indovinare come sta facendo il suo SQL, quindi darò la risposta più semplice. – TheTXI

+0

@TheTXI: abbastanza giusto, ma comunque sta facendo il suo SQL, l'unica cosa certa è che non sta usando i parametri. L'uso dei parametri eviterebbe completamente questo problema. – LukeH

1

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''' 
+0

ma il problema è che ottengo l'input da parte dell'utente quindi non sarà bello dire all'utente di aggiungere un'altra citazione –

1

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

È necessario creare SQL in modo dinamico e la citazione all'interno della stringa viene interpretata come la fine della stringa. A seconda del database che si sta utilizzando, è necessario sfuggire alle virgolette singole all'interno di ciascuna stringa che si intende utilizzare nel comando sql. Questo può essere visto stampando la tua query prima di provare a eseguirla.

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 semplice per un sql injection attack. Si consiglia di chiamare il database con una stored procedure o con un elenco di parametri.

0

Come alcuni hanno già detto, l'aggiunta di un preventivo in più farà il trucco. Posso confermare che questo è il caso anche per Oracle (altri hanno dato questa risposta per essere valida per MSSQL e SQL Server). Penso che usare stored procedure sia eccessivo per questo.

+0

Come utilizzare una query con parametri? –

+0

Sì, puoi farlo. La soluzione di doppia quota dovrà essere utilizzata se si esegue sql direttamente, non tramite l'API .NET. – awe

Problemi correlati