Pregunta

Estoy almacenar y editar algún campo en una base de datos que consiste en una larga cadena de uno o más oraciones. Cada vez que entro una comilla simple en el cuadro de texto y quiero guardarlo lanza una excepción como "sintaxis incorrecta cerca de 'L'. signo de comillas sin cerrar después de la cadena de caracteres ''. " ¿hay alguna idea para evitar eso?

EDIT: La consulta es:

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

Solución

Como dijo KM, No haga esto!

Do este en su lugar:

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

Otros consejos

Si desea incluir una comilla simple en un campo SQL, escapar de ella mediante comillas simples

'''Test''' = 'Text'

Esto es para SQL Server.

Escribir un produre almacenado para su edición de campo y utilizar los parámetros de SQL para guardar el valor. Cotizaciones no importará. Si no desea que un procedimiento almacenado al menos construir su texto SQL con marcadores de parámetros y el uso de parámetros SQL con eso.

es difícil darle una respuesta específica, ya que no indica el idioma base de datos o aplicación que esté utilizando.

Debe ser la construcción de su SQL de forma dinámica, y la cita dentro de la picadura se interpreta como el final de la cadena. Dependiendo de la base de datos que está utilizando, lo que necesita para escapar de las comillas simples dentro de cada cadena que se va a utilizar en el comando SQL. Esto se puede ver mediante la impresión de la consulta antes de intentar ejecutarlo.

Usted no menciona la aplicación que está llamando la base de datos de, pero cuando se construye te mando es necesario utilizar un comando FIX_QUOTES () que se escribe o si existe en la lengua:

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

Este tipo de consulta dinámica es muy fácil para un ataque de inyección . yo recomendaría llamar a la base de datos con un procedimiento almacenado o con una lista de parámetros.

En MSSQL se puede doblar sus cotizaciones:

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

Como algunos ya han dicho, añadiendo una cotización adicional hará el truco. Puedo confirmar que este es también el caso de Oracle (otros han dado esta respuesta debe ser válido para MSSQL y SQL Server). Creo que el uso de procedimientos almacenados es una exageración para esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top