none
Funcion eliminar valor sql server con vb.net RRS feed

  • Pregunta

  • Buenos dias,

    Estoy haciendo un mini programa que solo permite eliminar datos de la sql (el introducir lo hace automaticamente cogiendo cada x tiempo un archivo txt) pero el problema lo tengo en la funcion eliminar que no consigo arreglarlo, a ver si me pueden ayudar.

    Los campos de la base de datos son todos nvarchar(50) y concretamente el problema lo tengo cuando pongo datos con "/"

    Function Eliminar(ByVal tabla, ByVal condicion)
            conexion.Open()
            Dim elimina As String = "delete from " + tabla + " where " + condicion
            comando = New SqlCommand(elimina, conexion)
            Dim i As String = comando.ExecuteNonQuery()                            'AQUI SIEMPRE ME SALTA EL ERROR'
            conexion.Close()
            If (i > 0) Then
                Return True
            Else
                Return False
            End If
        End Function

    Espero respuesta.

    Muchas gracias a todos.

    • Cambiado Enrique M. Montejo miércoles, 7 de junio de 2017 18:09 Pregunta relacionada con el acceso a datos con SQL Server.
    lunes, 5 de junio de 2017 10:24

Todas las respuestas

  • Hola:

    El borrado de las tablas, lo tendrías que hacer de otra manera. Te sobran comillas y signos +.

    "DELETE FROM Tabla WHERE Condicion = A lo que sea "

    Un saludo.

    Gemma


    lunes, 5 de junio de 2017 10:35
  • El programa en si funciona pero por ejemplo si en esa columna pone "2060/02" ya no me borra ningún valor,

    y si en la base de datos borro todos los valores que contienen "/" entonces me deja eliminar cualquier valor.

    lunes, 5 de junio de 2017 10:52
  • Hola:

    Va a ser difícil ayudarte como no des mejores explicaciones que las que das.

    Léete por favor esto: AYUDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    Si no sabemos de que tipo es la columna, nombre de la misma, etc., no se yo como ayudarte.

    Si dices que la columna es de tipo NVarchar o sea de texto, no tienes que tener problemas al borrar la misma como se te ha indicado, ya que el valor del campo es un string y por lo tanto contiene caracteres.

    Un saludo.

    Gemma


    lunes, 5 de junio de 2017 11:01
  • Hola, puedes poner el código de como llamas a la función podrías intentar poniendo apóstrofes 

         Dim tabla As String = "pruebas"
            Dim condicion As String = "campo=" + "'" + "2060/02" + "'"
            Eliminar(tabla, condicion)

    Por otro lado el executenonquery siempre devuelve un tipo int 

    http://www.elguille.info/net/ADONET/cuando_usar_ExecuteNonQuery_o_ExecuteScalar.htm


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Solo dejo mis respuestas en el foro si son votadas o respuesta, de lo contrario por mantener el orden las borro.Saludos. Lima-Perú.


    lunes, 5 de junio de 2017 13:26
  • Hola, dejo todo el codigo que tengo:

    Base de datos sql server

    Nombre base de datos "MODULA"

    Tabla "dbo.CLIENTS"

    Columnas

    1º "CLIENTE" tipo de datos "nvarchar(50) "permitir valores null "SI"

    2º "POSICION" tipo de datos "nvarchar(50) "permitir valores null "SI"

    conexion.vb

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Windows.Forms
    Public Class conexion
    
        Public conexion As SqlConnection = New SqlConnection("Data source=MOTOPLASTIC6\GESTION;initial catalog=MODULA;Integrated security=true")
        Private cmb As SqlCommandBuilder
        Public ds As DataSet = New DataSet()
        Public da As SqlDataAdapter
        Public comando As SqlCommand
    
        Public Sub conectar()
            Try
                conexion.Open()
                conexioncorrecta.Show()
            Catch ex As Exception
                MessageBox.Show("Error al conectar")
            Finally
                conexion.Close()
            End Try
        End Sub
    
        Public Sub Consulta(ByVal sql As String, ByVal tabla As String)
            ds.Tables.Clear()
            da = New SqlDataAdapter(sql, conexion)
            cmb = New SqlCommandBuilder(da)
            da.Fill(ds, tabla)
        End Sub
    
        Function insertar(ByVal sql)
            conexion.Open()
            comando = New SqlCommand(sql, conexion)
            Dim i As String = comando.ExecuteNonQuery()
            conexion.Close()
            If (i > 0) Then
                Return True
            Else
                Return False
            End If
        End Function
    
        Function Eliminar(ByVal tabla, ByVal condicion)
            conexion.Open()
            Dim elimina As String = "delete from tabla where condicion = /"
            comando = New SqlCommand(elimina, conexion)
            Dim i As String = comando.ExecuteNonQuery()
            conexion.Close()
            If (i > 0) Then
                Return True
            Else
                Return False
            End If
        End Function
    End Class
    

    Form1:

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Windows.Forms
    
    Public Class Form1
        Dim conexion As conexion = New conexion()
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            conexion.conectar()
            MostrarDatos()
        End Sub
        Public Sub MostrarDatos()
            conexion.Consulta("select * from CLIENTS", "CLIENTS")
            dgvDatos.DataSource = conexion.ds.Tables("CLIENTS")
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Me.Close()
        End Sub
    
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Dim agregar As String = "insert into CLIENTS values(" + Codclient.Text + ",'" + Posclient.Text + "')"
            If (conexion.insertar(agregar)) Then
                MessageBox.Show("Cliente y posición agregados")
                MostrarDatos()
            Else
                MessageBox.Show("Error al agregar")
            End If
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If (conexion.Eliminar("CLIENTS", "CLIENTE= " + Codclient.Text)) Then
                MessageBox.Show("Liberado correctamente")
                MostrarDatos()
            Else
                MessageBox.Show("Error al liberar")
            End If
        End Sub
    
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            Try
                Using cnn As New SqlConnection()
    
                    ' Especificamos la cadena de conexión con la base de SQL Server
                    cnn.ConnectionString = "Data source=MOTOPLASTIC6\GESTION;initial catalog=MODULA;Integrated security=true"
    
                    ' Construimos la consulta T-SQL de inserción masiva, donde
                    ' la primera fila del archivo de texto delimitado por comas
                    ' contiene el nombre de los campos.
                    '
                    Dim sql As String = _
                        "BULK INSERT MODULA.dbo.CLIENTS " & _
                        "FROM 'M:\POSICION\1.txt' " & _
                        "WITH (" & _
                            "CODEPAGE = 'ACP'," & _
                            "FIELDTERMINATOR = '|'," & _
                            "ROWTERMINATOR = '\n')"
    
                    ' Creamos el comando
                    '
                    Dim cmd As SqlCommand = cnn.CreateCommand()
                    cmd.CommandText = sql
    
                    ' Abrimos la conexión.
                    cnn.Open()
    
                    ' Ejecutamos la consulta
                    '
                    Dim n As Integer = cmd.ExecuteNonQuery()
    
                    MessageBox.Show("Nº de registros afectados: " & CStr(n))
                    My.Computer.FileSystem.MoveFile("M:\POSICION\1.txt", "M:\POSICION\BACKUP\1.txt")
                    Dim MiFecha As String = Format(Today, "MM-dd-yyyy_h-mm-ss")
                    My.Computer.FileSystem.RenameFile("M:\POSICION\BACKUP\1.txt", "POSICION_" & MiFecha & ".txt")
                End Using
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
        End Sub
    
        Private Sub Label3_Click(sender As Object, e As EventArgs) Handles Label3.Click
    
        End Sub
    
        Private Sub TextBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyUp
            If e.KeyData = Keys.Enter Then
                BuscarDescrip()
    
            End If
        End Sub
        Private Sub BuscarDescrip()
    
    
        End Sub
    End Class


    Espero que me podáis ayudar gracias....

    lunes, 5 de junio de 2017 14:37
  • Hola @Panndas

    ¿Que parámetro envias en la condición? imagino que cuando eliminas registros lo haces por el primary key de la tabla.

    Si quieres preguntar si un registro existe o no tienes que hacer lo siguiente: Es a modo de ejemplo

    Public Shared Function Existe(idPersonal As String) As Boolean
                Using cn As SqlConnection = Conexion.Conectar("default")
                    cn.Open()
                    Using cmd As SqlCommand = cn.CreateCommand()
                        cmd.CommandText = "SELECT COUNT(*) FROM Personal WHERE Personal_Id=@Personal_Id"
                        cmd.Parameters.AddWithValue("@Personal_Id", idPersonal)
                        Dim resultado As Integer = Convert.ToInt32(cmd.ExecuteScalar())
                        If resultado = 0 Then
                            Return false
                        Else
                            Return true
    
                        End If
                        End using
    
                    End using
    
                End Function

    Si el registro existe eliminas 

    if (Existe(personal.Personal_Id))

    'Eliminar


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    miércoles, 14 de junio de 2017 4:02