2011-10-12 29 views
7

Tengo una cadena¿Cómo reemplazar el apóstrofo con un apóstrofo doble en una cadena?

good overview of ESP's in more detail than you probably need.

Al insertar en la tabla SQL, se produce un error. Así que quiero reemplazar apóstrofe en la cadena con doble apóstrofe como

good overview of ESP''s in more detail than you probably need

cómo manipular esto en C#?

+1

Debe usar las funciones de escape de la base de datos. Podrías dejarte vulnerable a las inyecciones de SQL si no lo haces. http://stackoverflow.com/questions/249567/algorithm-to-avoid-sql-injection-on-mssql-server-from-c-code – CheeseSucker

+0

O, aún mejor: consultas parametrizadas. – MatBailie

Respuesta

10

Muy fácil:

string s = "good overview of ESP's in more detail than you probably need."; 
string escaped = s.Replace("'","''"); 

Nota: Por lo general es más seguro de usar parámetros de comando. Especialmente si el código no controla los valores de las cadenas de entrada (es decir, entradas de usuario).

+3

Si bien esto es técnicamente correcto, dirige al asker original en la dirección incorrecta. Es mucho mejor utilizar los parámetros adecuados y evitar las vulnerabilidades de inyección de SQL. –

+0

¿Se puede producir una inyección, si se escapó la cuerda? La inyección, como yo lo entiendo, termina el sql prematuramente mediante el uso de una apostofia única. –

8

Utilice el objeto Parameter.

myCommand.InsertCommand.Parameters.Add("@myString", SqlDbType.VarChar, 200); 
    myCommand.InsertCommand.Parameters["@myString"].Value = @"good overview of ESP's in more detail than you probably need."; 
0

String.Replace(String,String) debería funcionar bien. En este ejemplo, usted querría:

String.Replace("'", "''") 

Sin embargo, no creo que eso solucione su problema. Me imagino que estás más apropiadamente buscando:

String.Replace("'", "\'") 

La razón de esto es que MySQL, y me imagino que otras versiones de SQL, espero cadenas que se van entre comillas simples.

+0

Acepto que esto responde directamente la pregunta, pero ayuda al OP en una mala práctica. Si se utilizan consultas parametrizadas, este problema desaparece Y adoptan una práctica que protege contra ataques de inyección, ayuda en el almacenamiento en caché del plan de ejecución, etc. – MatBailie

+0

@dambrisco: Algunos dialectos SQL usan un doble apóstrofo ('') en lugar del escape secuencia (\ ') que sugirió para MySQL. –

+0

@Dems - Estoy totalmente de acuerdo, pero, dada la pregunta, asumí que sería mejor dar pasos de bebé. Explicar la parametrización a alguien que no parece saber acerca de las secuencias de escape podría ser un mal lugar para comenzar. De todos modos, sin embargo, sería mucho mejor usar la solución de Daok que la mía. –

2

Estuve trabajando en este problema durante años. Hazlo en el cliente, reemplazando la comilla simple con dos comillas simples. Esto funciona si está ejecutando una sp con varios parámetros de entrada varchar. El único problema con esto es la inyección SQL, es decir, las personas pueden ver lo que estás haciendo en el cliente, lo que nunca es algo bueno. La única forma de evitar esto es usar parámetros SQL en el servidor, como lo han dicho anteriormente.

0

myCommand.InsertCommand.Parameters.Add ("@ myString", SqlDbType.VarChar, 200); myCommand.InsertCommand.Parameters ["@ myString"]. Valor

Cuestiones relacionadas