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

Para una versión de Microsoft Visual C# .NET de este artículo, consulte
311021 .
Para obtener una versión de Microsoft Visual Basic 6.0 de este artículo, consulte
178070 .

En este artículo se refiere a los siguientes espacios de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System.Data.SqlClient
  • System.Text
  • System.Data.OleDb

EN ESTA TAREA

Resumen

Este artículo muestra cómo 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). En este artículo también proporciona un ejemplo de Microsoft Access que utiliza el proveedor OLE DB de Microsoft y relacionadas con las clases de acceso a datos.

La lista siguiente describe el hardware recomendado, software, infraestructura de red y service packs que se necesitan:
  • 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 una nueva aplicación de consola de .NET de Visual Basic denominada QuoteDemo.
  1. Inicie Microsoft Visual Studio. NET.
  2. En el menú archivo, elija 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 en Tipos de proyectoy, a continuación, 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, crear un ejemplo que muestra cómo utilizar el método Replace de la clase String . Este ejemplo reemplaza comillas simples con dos adyacentes comillas simples para asegurarse de que se distribuirán los datos correctamente al concatenar valores para una instrucción SQL. El código en esta demostración utiliza una instrucción SQL que inserte en la tabla Employees de la base de datos Northwind .

Tanto de la de SQL Server y el acceso de ejemplos incluidos 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. (Ratón) 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 usa 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 va a reemplazar (StringToReplace) y la cadena que desea utilizar (StringReplacement).

    Nota: para las sustituciones de cadena más complejas, consulte la siguiente documentación de la biblioteca de clases .NET de Microsoft:
  1. Agregue las siguientes referencias de espacio de nombres al Module1.vb:
    Imports System.Data.SqlClientImports System.Text

  2. En Module1.vb, agregue el método siguiente:
        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 ' Connery, a continuación, presione ENTRAR.

    Recibirá un mensaje que incluye la siguiente información:


    • Cómo el método FixString modifica el valor del apellido.
    • Cómo la cadena modificada aparece en la instrucción SQL.
    • Confirmación de que el valor se agrega a la base de datos.
    Observe que el apellido es modificado a O'' Conner. SQL Server interpreta las dos adyacentes 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. Las referencias de espacio de nombres de lista se parece el siguiente anuncio había creado en el ejemplo de SQL Server en la sección anterior:
    Imports System.Data.SqlClientImports System.Text
    Imports System.Data.OleDb

    La referencia de espacio de nombres System.Data.SqlClient no es necesaria si sólo va a seguir el ejemplo de código de acceso.
  2. En Module1.vb, agregue el método siguiente:
        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 no desea volver a ejecutar el método RunSqlDemo , 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 ' Connery, a continuación, presione ENTRAR.

    Recibirá un mensaje que incluye la siguiente información:

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

    Puede modificar este ejemplo para que los delimitadores de comillas simples en la instrucción SQL se sustituyen por comillas dobles. Sin embargo, este ejemplo no puede controlar situaciones donde se encuentran unas comillas en la cadena de entrada.

Solución de problemas

  • Si no reemplaza la comilla simple con dos adyacentes comillas, recibirá un error de sintaxis similar a cualquiera de los siguientes mensajes de error:
    System.Data.SqlClient.SqlException: Línea 1: sintaxis incorrecta cerca de 'Conner'. ¡¡Comilla delante de la cadena de caracteres ')
    - o -
    Excepción no controlada: System.Data.OleDb.OleDbException: Error de sintaxis (falta operador) en expresión de consulta '' o ' Conner ', 'Susan')'
  • Cuando se utiliza el ejemplo de Access en este artículo, si presiona ENTRAR sin tener que 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 no se establece la propiedad PermitirLongitudCero (AllowZeroLength) del campo de base de datos en . Consulte la sección referenciaspara obtener más información.

Referencias

Para obtener información adicional acerca de la propiedad PermitirLongitudCero (AllowZeroLength) en Access, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
209098 ACC2000: mediante el AllowZeroLength y requerido propiedades
Para la documentación y los ejemplos sobre tareas comunes de programación de ADO.NET, consulte el siguiente sitio Web de Microsoft:
Centro de 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:
Propiedades

Id. de artículo: 311023 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios