2011-01-10 81 views
15

Tengo una aplicación donde los valores en el campo de texto se envían a la base de datos.Gestión de comillas simples en una cadena de SQL

Por ejemplo, tengo un formulario con un campo (cuadro de texto). Cuando presiono el botón Ok, el contenido del campo de texto se inserta como un registro en una tabla. Solo estoy recortando y extrayendo el texto del cuadro de texto en variable y pasándolo a mi cadena SQL.

El problema es que siempre que algo como "Es" o "Amigo" la cita simple se identifica como el final de la cadena. En Delphi, he visto algo como QuotedString para evitar esto. Alguna idea tuya?

+1

está usando consultas parametrizadas? –

+0

Si bien puede citar cadenas con seguridad, debe usar consultas parametrizadas como sugiere Mitch. – Gabe

+1

@Gabe: supongo que se conformará con la respuesta a su pregunta, en lugar de abordar el problema real. Inyección SQL aquí venimos !!!! –

Respuesta

34

No vuelvas construir sentencias SQL como eso, es muy inseguro (read this). Utilizar los parámetros, es decir:

var command = new SqlCommand("select * from person where firstname = @firstname"); 
SqlParameter param = new SqlParameter(); 
param.ParameterName = "@firstname"; 
param.Value   = "testing12'3"; 
command.Parameters.Add(param); 
+1

Lo que estoy haciendo es una aplicación muy simple. Es por eso que no usé esto. Muchas gracias de todos modos. – JCTLK

+9

@JCTLK: hazlo de la manera correcta. pequeñas aplicaciones de la costumbre de convertirse en más grandes si se considera que son útiles. Además, mantenga su base de códigos llena de patrones que deben copiarse, NO patrones que no son deseables. –

+8

@JCTLK: Esto no es complicado, y tiene * enormes * beneficios a largo plazo. –

-2

Hope esto le ayudará a ...

public static string DoQuotes(string sql) 
    { 
     if (sql == null) 
      return ""; 
     else 
      return sql.Replace("'", "''"); 
    } 
+3

Eliminando comentarios aquí: se han salido de control y atrajeron ** lotes ** de banderas: algunas banderas suficientes para disparar la eliminación automática. Resumen: * muchas personas piensan que el enfoque basado en citas aquí es una idea excepcionalmente mala cuando los parámetros son igual de fáciles y mucho más sólidos. Otros (OK, el OP) están en desacuerdo. –

+0

Sería útil ver un tratamiento más sólido de cómo manejar citas en aquellas circunstancias donde la parametrización es, por cualquier razón oscura, realmente imposible. –

+3

Este método funciona bien para aplicaciones personales pequeñas donde SQL Injection no es una preocupación. – Wayne

0

Uso .Replace("'","''''")

Por ejemplo

string name = txtName.Text.Replace("'","''''"); 

Ahora name se pueden pasar como un parámetro de procedimiento almacenado etc.

Cuestiones relacionadas