Cómo: Administrar comillas en literales SQL concatenadas mediante ADO.NET y Visual Basic .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 311023 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se demuestra cómo puede administrar comillas en los valores de cadena al concatenar instrucciones SQL. El artículo proporciona una solución de ejemplo que utiliza el proveedor administrado de SQL (Microsoft SQL Server). Este artículo también proporciona un ejemplo de Microsoft Access que utiliza el proveedor OLE DB y relacionados con las clases de acceso de datos.

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Packs recomendados que necesitará:
  • Microsoft Windows XP, Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server o Microsoft Windows 2000 Advanced Server
  • Microsoft .NET framework
  • Microsoft Access
  • Microsoft SQL Server

Crear una aplicación de consola de Visual Basic .NET

Estos pasos demuestran cómo crear un nuevo Visual Basic.NET aplicación de consola denominada QuoteDemo.
  1. Inicie Microsoft Visual Studio NET..
  2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
  3. En el cuadro de diálogo Nuevo proyecto , haga clic en Proyectos de Visual Basic bajo Tipos de proyecto y, después, haga clic en Aplicación de consola en plantillas .
  4. En el cuadro de texto nombre , escriba QuoteDemo .
  5. Haga clic en Aceptar para abrir el proyecto.

Ejemplos que administración comillas en instrucciones SQL concatenadas

En esta sección, se crea un ejemplo que muestra cómo utilizar el método Replace de la clase String . En este ejemplo reemplaza las comillas simples con dos adyacentes comillas simples para asegurarse de que los datos de formato correctamente al concatenar valores para una instrucción SQL. El código en esta demostración utiliza una instrucción SQL INSERT en la tabla Employees de la base de datos Northwind .

De SQL Server y el acceso a ejemplos que figuran en este artículo referencia el método FixString . Debe incluir este método para cualquier ejemplo funcione correctamente. Los pasos siguientes muestran cómo hacerlo:
  1. Haga clic con el botón secundario en Module1.vb , en el Explorador de soluciones y, a continuación, haga clic en Ver código .
  2. Agregue el método siguiente al módulo:
    Private Function FixString(ByVal SourceString As String, ByVal StringToReplace As String, ByVal StringReplacement As String)
            SourceString = SourceString.Replace(StringToReplace, StringReplacement)
            Return SourceString
    End Function
    						
    el método anterior utiliza el método Replace del objeto String . Puede utilizar este método para reemplazar caracteres con otras opciones. Los parámetros de entrada incluyen la cadena original ( SourceString ), la cadena que se desea reemplazar ( StringToReplace ) y la cadena que desea utilizar ( StringReplacement ).

    Nota : para sustituciones de cadena más complejas, consulte la siguiente documentación biblioteca de clases de Microsoft .NET:
    Clase StringBuilder
    http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
  1. Agregar las referencias de espacio de nombres siguiente a Module1.vb:
    Imports System.Data.SqlClient
    Imports System.Text
    					
  2. Agregue el siguiente método para Module1.vb:
        Private Sub RunSqlDemo()
            'Create a variable to hold the last name and the first name.
            Dim Fname As String = "Susan"
            Dim Lname As String
    
            Console.Write("Type Last Name (SQL Server Sample): ")
            Lname = Console.ReadLine()
    
            'Call FixString to replace a single quotation mark with two
            'adjacent single quotation marks.
            Lname = FixString(Lname, "'", "''")
            Console.WriteLine("Modified value: " & Lname)
    
            'Although the Fname variable in this sample is fine,
            'run Replace on this variable also.
            Fname = FixString(Fname, "'", "''")
    
            'Use a StringBuilder object to build the SQL statement.
            Dim sb As New StringBuilder()
            sb.Append("INSERT INTO Employees(LastName, FirstName) Values( '")
            sb.Append(Lname)
            sb.Append("','")
            sb.Append(Fname)
            sb.Append("')")
    
            'Present the SQL statement to the console, and include the modified
            'values.
            Console.WriteLine("SQL string: " & sb.ToString())
    
            'Create the connection string.
            Dim myConStr As String = "Server=localhost;Database=Northwind;UID=myUserID;PWD=myPassword"
            Dim myConn As SqlConnection = New SqlConnection(myConStr)
            Dim myCmd As SqlCommand = New SqlCommand(sb.ToString(), myConn)
    
            Try
                'Open the connection.
                myConn.Open()
                myCmd.ExecuteNonQuery()
                Console.WriteLine("Values inserted into table (SQL Server Sample)")
            Finally
                Try
                    myConn.Close()
                Catch
                End Try
            End Try
        End Sub
    					
    Nota : modificar la cadena de conexión de SQL Server para reflejar correctamente su entorno.

  3. Para llamar al método RunSqlDemo , agregue el código siguiente al método Main del módulo:
    RunSqlDemo()
    					
  4. En el menú archivo , haga clic en Guardar todo para guardar la solución.
  5. En el menú Generar , haga clic en Generar solución .
  6. En el menú Depurar , haga clic en Iniciar sin depurar para ejecutar la aplicación.
  7. Cuando se le pida para solicitar un valor para el apellido, escriba el nombre O'Conner y, a continuación, presione ENTRAR.

    Recibe un mensaje que incluye la información siguiente:

    • Cómo el método de FixString modifica el último valor de nombre.
    • Cómo aparece la cadena modificada en el SQL instrucción.
    • Confirmación de que el valor se agrega a la base de datos.
    Observe que el apellido se modifica para O '' Conner. SQL Server interpreta dos adyacentes las comillas simples como una comilla simple incrustada.
  1. Agregue el System.Data.OleDb y las referencias de espacio de nombres System.Text para Module1.vb. Ejemplo de las referencias de espacio de nombres aparece similar a la lista siguiente si ha creado el servidor SQL Server listado en la sección anterior:
    Imports System.Data.SqlClient
    Imports System.Text
    Imports System.Data.OleDb 
    						
    la referencia de espacio de nombres System.Data.SqlClient no es necesaria si sólo pretende seguir el ejemplo de código de acceso.
  2. Agregue el siguiente método para Module1.vb:
        Private Sub RunAccessDemo()
            'Create a variable to hold the last name and the first name.
            Dim Fname As String = "Susan"
            Dim Lname As String
    
            Console.Write("Type Last Name (Access Sample): ")
            Lname = Console.ReadLine()
    
            'Call FixString to replace a single quotation mark with two         'adjacent single quotation marks.
            Lname = FixString(Lname, "'", "''")
            Console.WriteLine("Modified value: " & Lname)
    
            'Although the Fname variable in this sample is fine, 
            'run Replace on the variable also.
            Fname = FixString(Fname, "'", "''")
    
            'Use a StringBuilder object to build the SQL statement.
            Dim sb As New StringBuilder()
            sb.Append("INSERT INTO Employees(LastName, FirstName) Values( '")
            sb.Append(Lname)
            sb.Append("','")
            sb.Append(Fname)
            sb.Append("')")
    
            'Present the SQL statement to the console, and include the modified 
            'values.
            Console.WriteLine("SQL string: " & sb.ToString())
    
            'Create the connection string.
            Dim myConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                     "Data Source=C:\MyDatabases\NWIND.MDB"
    
            Dim myConn As OleDbConnection = New OleDbConnection(myConStr)
            Dim myCmd As OleDbCommand = New OleDbCommand(sb.ToString(), myConn)
    
            Try
                'Open the connection.
                myConn.Open()
                myCmd.ExecuteNonQuery()
                Console.WriteLine("Values inserted into Employees table! (Access Sample)")
            Finally
                Try
                    myConn.Close()
                Catch
                End Try
            End Try
        End Sub
    					
    Nota : modificar la cadena de conexión de SQL Server para reflejar correctamente su entorno.

  3. Para llamar al método RunAccessDemo , agregue el código siguiente al método Main del módulo:
    RunAccessDemo()
    					
    Nota : si ha seguido los pasos para ejecutar el ejemplo anterior de SQL Server y, si desea ejecutar el método RunSqlDemo de nuevo, puede comentar la llamada al método RunSqlDemo en el método Main .

  4. En el menú archivo , haga clic en Guardar todo para guardar la solución.
  5. En el menú Generar , haga clic en Generar solución .
  6. En el menú Depurar , seleccione Iniciar sin depurar para ejecutar la aplicación.
  7. Cuando se le pida para solicitar un valor para el apellido, escriba el nombre O'Conner y, a continuación, presione ENTRAR.

    Recibe un mensaje que incluye la información siguiente:

    • Cómo el método de FixString modifica el último valor de nombre.
    • Cómo aparece la cadena modificada en el SQL instrucción.
    • Confirmación de que el valor se agrega a la base de datos.
    Observe que el apellido se modifica para O '' Conner. La base de datos interpreta dos adyacentes las comillas simples como una comilla simple incrustada.

    Puede modificar este ejemplo, para que los delimitadores de comillas simples en la instrucción SQL se reemplazan por un signo de comillas doble. Sin embargo, en este ejemplo no se puede controlar situaciones donde un signo de comillas doble está dentro de la cadena de entrada.

Solución de problemas

  • Si no reemplace la comilla simple con dos adyacentes comillas simples, recibirá un error de sintaxis similar a cualquiera de los mensajes de error siguientes:
    Línea System.Data.SqlClient.SqlException: 1: sintaxis incorrecta cerca de 'Conner'. Comilla no cerrada antes de la cadena de caracteres ')
    -o bien -
    Excepción no controlada: System.Data.OleDb.OleDbException: error de sintaxis (falta operador) en la expresión de consulta '' O'Conner ',' Susana ') '
  • Cuando se utiliza el ejemplo de Access en este artículo, si presiona ENTRAR sin proporcionar ninguna entrada cuando se le pida, puede recibir el siguiente mensaje de error (o uno similar):
    Campo TableName.FieldName no puede ser una cadena de longitud cero.
    Access interpreta un campo de cadena vacía como una cadena de longitud cero. Este error se produce si la propiedad AllowZeroLength del campo de la base de datos no se establece en . Consulte las REFERENCES de sección para obtener más información.

Referencias

Para obtener información adicional acerca de la propiedad AllowZeroLength en Access, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
209098ACC2000: Mediante el AllowZeroLength y requerido propiedades
Para documentación y ejemplos de tareas comunes de programación de ADO.NET, vea el siguiente sitio Web de Microsoft:
Soporte técnico de ADO.NET
http://support.microsoft.com/ph/548
Para obtener más información acerca de cómo migrar de Microsoft ActiveX Data Objects (ADO) a Microsoft ADO.NET, consulte el siguiente sitio Web de Microsoft:
Información general de ADO.NET
http://msdn.microsoft.com/en-us/library/h43ks021.aspx

Propiedades

Id. de artículo: 311023 - Última revisión: jueves, 20 de abril de 2006 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft .NET Framework Class Libraries 1.1
  • Microsoft .NET Framework Class Libraries 1.1
Palabras clave: 
kbmt kbhowtomaster kbsqlclient kbsystemdata KB311023 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 311023

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com