none
Código de error del sistema operativo: 3 (El sistema no puede encontrar la ruta especificada) RRS feed

  • Pregunta

  • Buen día,

    Estoy intentando realizar un bulk insert de un archivo .csv a mi base de datos  en Sql Server, el cual ejecuto desde una pequeña aplicacion en VB .net, pero me da el siguiente error: "No se puede realizar la carga masiva. El archivo "C:\Users\david.castellanos\Documents\Cargas Dialer\SV\Octubre_16\2210\Activas.csv" no se puede abrir. Código de error del sistema operativo: 3 (El sistema no puede encontrar la ruta especificada).

    El código que tengo es el siguiente:

    Imports System.Data.SqlClient

    Public Class FormPrincipal
        Private Sub AbrirActivasBtn_Click(sender As Object, e As EventArgs) Handles AbrirActivasBtn.Click
            If OpenFileDialog1.ShowDialog = DialogResult.OK Then
                TxtRutaArchivo.Text = OpenFileDialog1.FileName
            End If
        End Sub

        Private Sub CargarActivasBtn_Click(sender As Object, e As EventArgs) Handles CargarActivasBtn.Click
            Try
                Using cnn As New SqlConnection()

                    cnn.ConnectionString = "Data Source= localhost;Initial Catalog=Cobros_SV;user id=ab;password=abc123456"

                    Dim sql As String =
                        "BULK INSERT Cobros_SV.dbo.cuentas_activas " &
                        "FROM '" & TxtRutaArchivo.Text & "'" &
                        "WITH (" &
                            "CODEPAGE = 'ACP'," &
                            "FIRSTROW = 2," &
                            "FIELDTERMINATOR = ','," &
                            "ROWTERMINATOR = '\n')"

                    Dim cmd As SqlCommand = cnn.CreateCommand()
                    cmd.CommandText = sql

                    cnn.Open()

                    Dim n As Integer = cmd.ExecuteNonQuery()

                    MessageBox.Show("Nº de registros afectados: " & CStr(n))

                End Using

            Catch ex As Exception

                MessageBox.Show(ex.Message)

            End Try
        End Sub
    End Class

    Alguien que haya podido solucionar este error que me puede ayudar o sepa cual es el error que estoy cometiendo, de ante mano, agradezco sus comentarios.

    Slds.

    David Castellanos


    David Castellanos

    sábado, 22 de octubre de 2016 17:59

Respuestas

  • El problema casi seguro es de permisos. Fíjate que la ruta que estás indicando es C:\users\... Las carpetas que hay bajo esta ruta solo tienen permiso de acceso para el mismo usuario al que pertenece la carpeta, y nadie más. Cuando envías al servicio SQL el comando BULK INSERT; éste no se ejecuta con tus credenciales de usuario (que sí que tendrían permiso de acceso a ese archivo), sino con las credenciales del servicio SQL, que casi seguro que son distintas (típicamente puede ser algo así como "NT Service\MSSQLSERVER") y ese usuario no tiene acceso a tu carpeta de archivos.

    Aparte de eso, hay un problema fundamental en esa forma de operar: estás indicando la ruta a un archivo local en el disco C: de tu puesto de trabajo, pero al ejecutar el comando bulk insert, el servicio SQL buscará el archivo en el disco C: del servidor. En tiempo de desarrollo no notarás la diferencia porque seguramente tienes el SQL Server instalado en la misma máquina (cadena de conexión con "localhost"), pero en cuanto lo pases a producción y trabaje contra un servidor de verdad ya no funcionará.

    Deberías reescribir el programa para que primero copie el archivo a una carpeta del servidor que sea accesible al servicio SQL, y después ya lanzar el bulk insert contra esa carpeta.

    sábado, 22 de octubre de 2016 19:17