none
Error en bulk insert desde vb .net a sql server 2016

    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).

    Según estuve leyendo el path del archivo debe estar en el mismo servidor de la base de datos, pero como puedo hacer para que el usuario seleccione el archivo desde su pc y haga la inserción a la base de datos? 

    El path me queda así: "C:\Dialer\Pais\activas.csv" y esto se almacena en el control TxtRutaArchivo.txt

    El código que tengo es el siguiente (Algunas partes del código por motivos de seguridad se han cambiado):

    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= 123.45.67.890\SQLEXPRESS;Initial Catalog=Cobros_SV;user id=USER;password=PASS"

                    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("Operación completada con éxito. 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 si me hace falta algo adicional en el código, de ante mano, agradezco sus comentarios.

    Slds.


    David Castellanos


    • Editado dgca jueves, 27 de octubre de 2016 16:00
    jueves, 27 de octubre de 2016 15:56

Respuestas

  • Si eso lo estás haciendo en un PC, el OpenFileDialog te mostrará los ficheros de ese PC y no del servidor. Por lo tanto, cuando elijas un archivo y lo pongas en el txtRutaArchivo, y luego el txtRutaArchivo lo concatenes en la sentencia SQL, dicha sentencia contendrá un archivo del PC, no un archivo del servidor, y en consecuencia no funcionará bien.

    No existe ninguna forma de poder ver desde el PC los archivos del servidor salvo que en el servidor te den permiso para ello. Y la forma normal de dar ese permiso consiste en crear una carpeta compartida y dar permisos sobre esa carpeta al usuario que tiene que ver los archivos de la misma. Recuerda que hay que dar los permisos dos veces: permiso de acceso en el sistema de archivos, y también permiso de compartición. Una vez hecho eso, puedes acceder a la carpeta como \\servidor\carpetacompartida\. Incluso puedes hacerlo desde dentro del OpenFileDialog, bien sea tecleando esa ruta o bien pinchando en "Network". Para que ese archivo lo pueda luego recuperar el BulkInsert hará falta que el Proceso del Servicio SQL tenga también permisos sobre ella (duplicados, igual que antes hicimos para el usuario).

    jueves, 27 de octubre de 2016 17:19

Todas las respuestas

  • Si eso lo estás haciendo en un PC, el OpenFileDialog te mostrará los ficheros de ese PC y no del servidor. Por lo tanto, cuando elijas un archivo y lo pongas en el txtRutaArchivo, y luego el txtRutaArchivo lo concatenes en la sentencia SQL, dicha sentencia contendrá un archivo del PC, no un archivo del servidor, y en consecuencia no funcionará bien.

    No existe ninguna forma de poder ver desde el PC los archivos del servidor salvo que en el servidor te den permiso para ello. Y la forma normal de dar ese permiso consiste en crear una carpeta compartida y dar permisos sobre esa carpeta al usuario que tiene que ver los archivos de la misma. Recuerda que hay que dar los permisos dos veces: permiso de acceso en el sistema de archivos, y también permiso de compartición. Una vez hecho eso, puedes acceder a la carpeta como \\servidor\carpetacompartida\. Incluso puedes hacerlo desde dentro del OpenFileDialog, bien sea tecleando esa ruta o bien pinchando en "Network". Para que ese archivo lo pueda luego recuperar el BulkInsert hará falta que el Proceso del Servicio SQL tenga también permisos sobre ella (duplicados, igual que antes hicimos para el usuario).

    jueves, 27 de octubre de 2016 17:19
  • De acuerdo Alberto, intentaré con una carpeta compartida, teniendo en cuenta las consideraciones que me haces mención, agradezco tus comentarios.

    Slds.

    David Castellanos


    David Castellanos

    jueves, 27 de octubre de 2016 17:23