none
Verificar consulta de copia de tabla de una base de datos a otra.

    Pregunta

  • Hola a todos:

    Estoy tratando de efectuar una consulta de inserción de registros de una misma tabla pero en bases de datos diferentes, la base de datos de la que obtengo los datos originales es Access 2007 y adonde se tienen que insertar es SqlCompact.

    Me está dando un error de : Falta el archivo de información del grupo de trabajo o bien está abierto en modo exclusivo por otro usuario.

    El programa está trabajando ahora con SqlCompact.

    Pongo lo que he hecho pero mucho me temo que tengo algo mal en las consultas.

    Public Shared Sub PruebaConexiones() Try ' Establecemos la conexion con las bases de datos. Dim ConexionAccess As String = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|\gemmafin.accdb;Password=xxx" Dim ConexionCompact As String = "ProviderName = System.Data.SqlServerCe.4.0;Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx" Using cnn As New OleDbConnection(ConexionAccess) ' Creamos el comando Dim cmd As OleDbCommand = cnn.CreateCommand() ' Creamos la consulta SQL de datos añadidos cmd.CommandText = "INSERT INTO [Varios] Select * FROM [Varios] In  '" & ConexionCompact & "'"

    ' Abrimos la conexión cnn.Open() ' Ejecutamos el comando Dim n As Integer = cmd.ExecuteNonQuery() ' Obtenemos los registros afectados MessageBox.Show("Nº de registros exportados: " & CStr(n)) End Using Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message) End Try End Sub

    Bueno, esto es nuevo para mi el operar con diferentes bases de datos y se que me falla alguna o algunas cosas

    Agradecería que alguien me pudiera orientar sobre este tipo de consulta.

    Un saludo.

    Gemma

    viernes, 6 de enero de 2017 18:41

Respuestas

  • "gemma_campillo" escribió:

    > ... si lo hemos de dejar sin que exporte a access pues eso a tomar viento.

    Yo creo que es lo mejor que puedes hacer.

    Los datos de Access, digamos que deberían ser el principio de todo, porque en un primer momento todo lo tenías en Access. Pero si le vas a permitir a tus usuarios trabajar con SQL Server y SQL Compact, ¿para qué "leches" quieres que otra vez vuelvan a Access?

    El que quiera trabajar con Access, que trabaje directamente con él, sin tener que importar los datos existentes en SQL Server o en SQL Compact, al menos, así es como lo pienso yo.

    Por cierto. ¿Te acuerdas que te comenté que tenía problemas al importar a Access los datos DECIMALES existentes en SQL Compact (y en SQL Server, porque sucede lo mismo) ya que se importaban como números ENTEROS? ¡Bueno! Pues lo he solucionado insertando, registro a registro, todos aquellos existentes en el objeto DataTable recuperado de SQL Compact, mediante la ejecución indidivual de consultas INSERT INTO con parámetros, donde a la hora de añadir el parámetro a la colección Parameters de un objeto OleDbCommand, convertía el valor a String:

        For Each row As DataRow In dt.Rows
            cmd = cnn.CreateCommand()
            cmd.CommandText = "INSERT INTO [Facturas] ([IdFactura], [Fecha], [IdCliente], [Base], [IVA], [Total], [Cobrada], [FechaCobro]) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
            cmd.Parameters.AddWithValue("", row(0))
            cmd.Parameters.AddWithValue("", row(1))
            cmd.Parameters.AddWithValue("", row(2))
            cmd.Parameters.AddWithValue("", Convert.ToString(row(3)))
            cmd.Parameters.AddWithValue("", Convert.ToString(row(4)))
            cmd.Parameters.AddWithValue("", Convert.ToString(row(5)))
            cmd.Parameters.AddWithValue("", row(6))
            cmd.Parameters.AddWithValue("", row(7))
            cmd.ExecuteNonQuery()
        Next

    De ésta manera he podido solucionar que no DESAPARECIERAN los decimales de su valor Decimal. ;-)

    Pero insisto, que por ahora no le veo ningún sentido traspasar datos a Access desde otros orígenes de datos diferentes, teniendo el cliente la posibilidad de trabajar directamente desde tu aplicación con una base de datos de Access original. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 7 de enero de 2017 8:11
    Moderador
  • "gemma_campillo" escribió:

    > Estoy tratando de efectuar una consulta de inserción de registros de
    > una misma tabla pero en bases de datos diferentes, la base de datos
    > de la que obtengo los datos originales es Access 2007 ...
    >
    > Me está dando un error de : Falta el archivo de información del grupo
    > de trabajo o bien está abierto en modo exclusivo por otro usuario.

    Fíjate la cadena de conexión que estás utilizando para conectarte con la base de datos de Access:

    > Dim ConexionAccess As String = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|
    >     \gemmafin.accdb;Password=xxx"

    Si especificas el parámetro Password, tendrás también que especificar el parámetro User Id=cuentaUsuario y el parámetro Jet OLEDB:System Database=ruta que contiene el archivo de información de grupos de trabajo, ya que el parámetro Password es para especificar la CONTRASEÑA DEL USUARIO, no la contraseña de la base de datos, la cual se especifica mediante el parámetro Jet OLEDB:Database Password=contraseña.

    ¡Ay, ay! ¡Será que no has utilizado veces dicho parámetro! Ahora le echas la culpa al día de hoy. ¡Jejeje!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.









    viernes, 6 de enero de 2017 19:18
    Moderador
  • gemma_campillo,

    Creo que el problema se da porque utilizas el atributo incorrecto para asignar la contraseña de la base de datos:

    Data Source =|DataDirectory|\gemmafin.accdb;Jet OLEDB:Database Password=xxx;"

    Por otro lado, la consulta sql que escribes, ¿realmente funciona? 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo viernes, 6 de enero de 2017 19:42
    viernes, 6 de enero de 2017 19:19
  • "gemma_campillo" escribió:

    > Bueno, ahora el error dice: No es un nombre de archivo válido.
    >
    > ' Creamos la consulta SQL de datos añadidos
    > cmd.CommandText = "INSERT INTO [Varios] Select * FROM [Varios] In '" & ConexionCompact & "'"
    >
    > Es la primera consulta que he hecho en mi vida de este tipo, en que en la select se
    > introduce la cadena de conexión de la tabla que emite los datos.

    Pues la primera y la última vez que la vasa a utilizar, porque esa forma de conectarte a la base de datos de SQL Compact no te va a funcionar. Si hubiese un driver ODBC para SQL Compact, se podría intentar, pero mejor es que te olvides de esa sintaxis, al menos para conectarte con SQL Compact, porque no vas a parar de recibir el mensaje de error No es un nombre de archivo válido.

    > Dim ConexionCompact As String = "ProviderName = System.Data.SqlServerCe.4.0;
    >     Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx"

    Esa NO ES UNA CADENA DE CONEXIÓN VÁLIDA para conectarse mediante OleDb a una base de datos de SQL Compact, ya que sobra el parámetro ProviderName que te acabas de "inventar". ;-)

    Si te deseas conectar a SQL Compact vía OLEDB, tienes que especificar el proveedor OleDb para SQL Server Compact en el parámetro Provider de la cadena de conexión, que para la versión 4.0 sería:

    Imports System.Data.OleDb    


    Dim ConexionCompact As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;" & _ "Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx" Using cnn As New OleDbConnection(ConexionCompact) cnn.Open() MessageBox.Show(cnn.ConnectionString) End Using


    Y si la versión de la base de datos de SQL Compact fuera la 3.5, éste sería el proveedor OleDb que deberás utilizar:

        Dim ConexionCompact As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;" & _
           "Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx"

    La palabra "providerName" se utiliza en las cadenas de conexión existentes en el app.config para especificar el nombre del PROVEEDOR ADMINISTRADO (System.Data.OleDb, System.Data.SqlServerCe.4.0, System.Data.SqlClient, etc.), pero ese proveedor administrado NO SE PUEDE ESPECIFICAR en el parámetro Provider (sin 'Name') de una cadena de conexión OleDb, porque aquí tienes que especificar el PROVEEDOR OLEDB adecuado a la conexión que deseas realizar (Microsoft.ACE.OLEDB.12.0, Microsoft.SQLSERVER.CE.OLEDB.4.0, SqlOledb, etc.).

    Así que no confundas más un proveedor de datos administrado (que es el que aparece en las cadenas de conexión existentes en el app.config para conectarte con una "factoría de proveedores", como le sueles denominar a un nombre de proveedor invariable) de un proveedor de datos no administrado u OleDb (que es el que hay que especificar en el parámetro Provider de la cadena de conexión OleDb).

    Te comento que en el mundo de .NET, cuando se habla que una cosa (un proveedor de datos, una secuencia abierta con un archivo, una imagen que se muestra en un PictureBox, cualquier otro recurso) está administrado/no administrado, se refiere a que está administrado por el propio marco de trabajo de .NET o no lo está, de ahí que se diferencie entre un proveedor de datos administrado, como puede ser System.Data.SqlServerCe.4.0, de otro proveedor de datos no administrado por .NET, como puede ser el proveedor de datos OleDb para SQL Compact llamado Microsoft.SQLSERVER.CE.OLEDB.4.0, donde en el nombre del proveedor de datos suele llevar la palabra OleDb, como Microsoft.ACE.OLEDB.12.0.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    sábado, 7 de enero de 2017 7:33
    Moderador

Todas las respuestas

  • Hola Augusto.

    Lo tengo cerrado.

    Gracias.

    Gemma

    viernes, 6 de enero de 2017 19:12
  • "gemma_campillo" escribió:

    > Estoy tratando de efectuar una consulta de inserción de registros de
    > una misma tabla pero en bases de datos diferentes, la base de datos
    > de la que obtengo los datos originales es Access 2007 ...
    >
    > Me está dando un error de : Falta el archivo de información del grupo
    > de trabajo o bien está abierto en modo exclusivo por otro usuario.

    Fíjate la cadena de conexión que estás utilizando para conectarte con la base de datos de Access:

    > Dim ConexionAccess As String = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|
    >     \gemmafin.accdb;Password=xxx"

    Si especificas el parámetro Password, tendrás también que especificar el parámetro User Id=cuentaUsuario y el parámetro Jet OLEDB:System Database=ruta que contiene el archivo de información de grupos de trabajo, ya que el parámetro Password es para especificar la CONTRASEÑA DEL USUARIO, no la contraseña de la base de datos, la cual se especifica mediante el parámetro Jet OLEDB:Database Password=contraseña.

    ¡Ay, ay! ¡Será que no has utilizado veces dicho parámetro! Ahora le echas la culpa al día de hoy. ¡Jejeje!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.









    viernes, 6 de enero de 2017 19:18
    Moderador
  • gemma_campillo,

    Creo que el problema se da porque utilizas el atributo incorrecto para asignar la contraseña de la base de datos:

    Data Source =|DataDirectory|\gemmafin.accdb;Jet OLEDB:Database Password=xxx;"

    Por otro lado, la consulta sql que escribes, ¿realmente funciona? 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo viernes, 6 de enero de 2017 19:42
    viernes, 6 de enero de 2017 19:19
  • Hola:

    Bueno, ahora el error dice: No es un nombre de archivo válido.

    Ahora la consulta rectificada en su password queda así:

      Public Shared Sub PruebaConexiones()
    
            Try
                ' Establecemos la conexin con la base de Access 2007.
                '
                '
                Dim ConexionAccess As String = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|\gemmafin.accdb;Jet OLEDB:Database Password=xxx"
                Dim ConexionCompact As String = "ProviderName = System.Data.SqlServerCe.4.0;Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx"
    
                Using cnn As New OleDbConnection(ConexionAccess)
    
                    ' Creamos el comando
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                    ' Creamos la consulta SQL de datos añadidos 
                    cmd.CommandText = "INSERT INTO [Varios] Select * FROM [Varios] In '" & ConexionCompact & "'"
    
                    ' Abrimos la conexión
                    cnn.Open()
    
                    ' Ejecutamos el comando
                    Dim n As Integer = cmd.ExecuteNonQuery()
    
                    ' Obtenemos los registros afectados
                    MessageBox.Show("Nº de registros exportados: " & CStr(n))
    
                End Using
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
                    End Try
    
        End Sub

    Williams, respecto a que si la consulta funciona o no, no se que decirte, evidentemente a mi no me funciona. Si te digo que pasa por todos los sitios, abre la conexión, y casca en la query.

    Es la primera consulta que he hecho en mi vida de este tipo, en que en la select se introduce la cadena de conexión de la tabla que emite los datos.

    Bueno, os agradezco vuestro interés en como siempre.

    Muchas gracias a los dos.

    Un abrazo.

    Gemma



    viernes, 6 de enero de 2017 19:42
  • "gemma_campillo" escribió:

    > Bueno, ahora el error dice: No es un nombre de archivo válido.
    >
    > ' Creamos la consulta SQL de datos añadidos
    > cmd.CommandText = "INSERT INTO [Varios] Select * FROM [Varios] In '" & ConexionCompact & "'"
    >
    > Es la primera consulta que he hecho en mi vida de este tipo, en que en la select se
    > introduce la cadena de conexión de la tabla que emite los datos.

    Pues la primera y la última vez que la vasa a utilizar, porque esa forma de conectarte a la base de datos de SQL Compact no te va a funcionar. Si hubiese un driver ODBC para SQL Compact, se podría intentar, pero mejor es que te olvides de esa sintaxis, al menos para conectarte con SQL Compact, porque no vas a parar de recibir el mensaje de error No es un nombre de archivo válido.

    > Dim ConexionCompact As String = "ProviderName = System.Data.SqlServerCe.4.0;
    >     Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx"

    Esa NO ES UNA CADENA DE CONEXIÓN VÁLIDA para conectarse mediante OleDb a una base de datos de SQL Compact, ya que sobra el parámetro ProviderName que te acabas de "inventar". ;-)

    Si te deseas conectar a SQL Compact vía OLEDB, tienes que especificar el proveedor OleDb para SQL Server Compact en el parámetro Provider de la cadena de conexión, que para la versión 4.0 sería:

    Imports System.Data.OleDb    


    Dim ConexionCompact As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;" & _ "Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx" Using cnn As New OleDbConnection(ConexionCompact) cnn.Open() MessageBox.Show(cnn.ConnectionString) End Using


    Y si la versión de la base de datos de SQL Compact fuera la 3.5, éste sería el proveedor OleDb que deberás utilizar:

        Dim ConexionCompact As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;" & _
           "Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx"

    La palabra "providerName" se utiliza en las cadenas de conexión existentes en el app.config para especificar el nombre del PROVEEDOR ADMINISTRADO (System.Data.OleDb, System.Data.SqlServerCe.4.0, System.Data.SqlClient, etc.), pero ese proveedor administrado NO SE PUEDE ESPECIFICAR en el parámetro Provider (sin 'Name') de una cadena de conexión OleDb, porque aquí tienes que especificar el PROVEEDOR OLEDB adecuado a la conexión que deseas realizar (Microsoft.ACE.OLEDB.12.0, Microsoft.SQLSERVER.CE.OLEDB.4.0, SqlOledb, etc.).

    Así que no confundas más un proveedor de datos administrado (que es el que aparece en las cadenas de conexión existentes en el app.config para conectarte con una "factoría de proveedores", como le sueles denominar a un nombre de proveedor invariable) de un proveedor de datos no administrado u OleDb (que es el que hay que especificar en el parámetro Provider de la cadena de conexión OleDb).

    Te comento que en el mundo de .NET, cuando se habla que una cosa (un proveedor de datos, una secuencia abierta con un archivo, una imagen que se muestra en un PictureBox, cualquier otro recurso) está administrado/no administrado, se refiere a que está administrado por el propio marco de trabajo de .NET o no lo está, de ahí que se diferencie entre un proveedor de datos administrado, como puede ser System.Data.SqlServerCe.4.0, de otro proveedor de datos no administrado por .NET, como puede ser el proveedor de datos OleDb para SQL Compact llamado Microsoft.SQLSERVER.CE.OLEDB.4.0, donde en el nombre del proveedor de datos suele llevar la palabra OleDb, como Microsoft.ACE.OLEDB.12.0.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    sábado, 7 de enero de 2017 7:33
    Moderador
  • Hola maestro, buenos días.

    Ya lo he corregido y probado, pero continúa diciendo que "No es un nombre de archivo válido".

    La consulta ahora está de la siguiente forma: Había añadido los campos antes pero nada, los he tildado porque el error es el mismo.

    Public Shared Sub PruebaConexiones() 'Añadir llamada al load de frmInicio
    
            Try
                ' Establecemos la conexion con la base de Access 2007.
                '
                Dim ConexionAccess As String = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|\gemmafin.accdb;Jet OLEDB:Database Password=xxx"
                Dim ConexionCompact As String = "Provider = Microsoft.SQLSERVER.CE.OLEDB.4.0;Data Source=|DataDirectory|\PerseoSQLce.sdf;password=xxx"
    
                Using cnn As New OleDbConnection(ConexionAccess)
    
                    ' Creamos el comando
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                    ' Creamos la consulta SQL de datos añadidos 
                    cmd.CommandText = "INSERT INTO [Varios] Select * FROM [Varios] In '" & ConexionCompact & "'"
    
                    'cmd.CommandText = "INSERT INTO Varios (Cod_Empresa, Orden, OrdenacionEspec, GrupoInformes, Grupo, Balance, Descripcion, PlanConta, " &
                    '              "Ejer_01, Ejer_02, Ejer_03, Ejer_04, Ejer_05, Ejer_06, Ejer_07, Ejer_08, Ejer_09, Ejer_10, Ejer_11, Ejer_12, " &
                    '              "PorcTot1,  PorcTot2, PorcTot3, PorcTot4, PorcTot5, PorcTot6, PorcTot7,  PorcTot8, PorcTot9, PorcTot10, PorcTot11, PorcTot12, " &
                    '              "PorcDesv1, PorcDesv2, PorcDesv3, PorcDesv4, PorcDesv5, PorcDesv6, PorcDesv7, PorcDesv8, PorcDesv9, PorcDesv10, PorcDesv11, " &
                    '              "MediaAnual, PorcMedAnual, IndiceGrafValores, IndiceGrafPorc, IndiceTipoGrafValores, IndiceTipoGrafPorc) " &
                    '          "Select Cod_Empresa, Orden, OrdenacionEspec, GrupoInformes, Grupo, Balance, Descripcion, PlanConta, " &
                    '              "Ejer_01, Ejer_02, Ejer_03, Ejer_04, Ejer_05, Ejer_06, Ejer_07, Ejer_08, Ejer_09, Ejer_10, Ejer_11, Ejer_12, " &
                    '              "PorcTot1,  PorcTot2, PorcTot3, PorcTot4, PorcTot5, PorcTot6, PorcTot7,  PorcTot8, PorcTot9, PorcTot10, PorcTot11, PorcTot12, " &
                    '              "PorcDesv1, PorcDesv2, PorcDesv3, PorcDesv4, PorcDesv5, PorcDesv6, PorcDesv7, PorcDesv8, PorcDesv9, PorcDesv10, PorcDesv11, " &
                    '              "MediaAnual, PorcMedAnual, IndiceGrafValores, IndiceGrafPorc, IndiceTipoGrafValores, IndiceTipoGrafPorc " &
                    '          "FROM Varios In '" & ConexionCompact & "'"
    
    
    
                    ' Abrimos la conexión
                    cnn.Open()
    
                    ' Ejecutamos el comando
                    Dim n As Integer = cmd.ExecuteNonQuery()
    
                    ' Obtenemos los registros afectados
                    MessageBox.Show("Nº de registros exportados: " & CStr(n))
    
                End Using
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
            End Try
    
        End Sub

    Desde luego la consulta se las trae. Maestro si no tienes nada mas importante que hacer estoy de acuerdo en que tu cabezonería insista en ello, pero si no, déjalo porque esto es complicado, de hecho en el google no encuentro nada que sea para hacerlo de esta forma. Si te ponen la instrucción insert into que no tiene nada del otro mundo, pero no hablan de como juegan las cadenas de conexión, evidentemente el problema está en la que envía los datos, en este caso SqlCompact 4.0.

    Bueno querido amigo, muchas gracias como siempre y a lo dicho, si no, no te preocupes por que mis guerras siempre son las tuyas también, pero si lo hemos de dejar sin que exporte a access pues eso a tomar viento.

    Un abrazo Enrique.

    Gemma

    sábado, 7 de enero de 2017 7:58
  • "gemma_campillo" escribió:

    > ... si lo hemos de dejar sin que exporte a access pues eso a tomar viento.

    Yo creo que es lo mejor que puedes hacer.

    Los datos de Access, digamos que deberían ser el principio de todo, porque en un primer momento todo lo tenías en Access. Pero si le vas a permitir a tus usuarios trabajar con SQL Server y SQL Compact, ¿para qué "leches" quieres que otra vez vuelvan a Access?

    El que quiera trabajar con Access, que trabaje directamente con él, sin tener que importar los datos existentes en SQL Server o en SQL Compact, al menos, así es como lo pienso yo.

    Por cierto. ¿Te acuerdas que te comenté que tenía problemas al importar a Access los datos DECIMALES existentes en SQL Compact (y en SQL Server, porque sucede lo mismo) ya que se importaban como números ENTEROS? ¡Bueno! Pues lo he solucionado insertando, registro a registro, todos aquellos existentes en el objeto DataTable recuperado de SQL Compact, mediante la ejecución indidivual de consultas INSERT INTO con parámetros, donde a la hora de añadir el parámetro a la colección Parameters de un objeto OleDbCommand, convertía el valor a String:

        For Each row As DataRow In dt.Rows
            cmd = cnn.CreateCommand()
            cmd.CommandText = "INSERT INTO [Facturas] ([IdFactura], [Fecha], [IdCliente], [Base], [IVA], [Total], [Cobrada], [FechaCobro]) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
            cmd.Parameters.AddWithValue("", row(0))
            cmd.Parameters.AddWithValue("", row(1))
            cmd.Parameters.AddWithValue("", row(2))
            cmd.Parameters.AddWithValue("", Convert.ToString(row(3)))
            cmd.Parameters.AddWithValue("", Convert.ToString(row(4)))
            cmd.Parameters.AddWithValue("", Convert.ToString(row(5)))
            cmd.Parameters.AddWithValue("", row(6))
            cmd.Parameters.AddWithValue("", row(7))
            cmd.ExecuteNonQuery()
        Next

    De ésta manera he podido solucionar que no DESAPARECIERAN los decimales de su valor Decimal. ;-)

    Pero insisto, que por ahora no le veo ningún sentido traspasar datos a Access desde otros orígenes de datos diferentes, teniendo el cliente la posibilidad de trabajar directamente desde tu aplicación con una base de datos de Access original. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    sábado, 7 de enero de 2017 8:11
    Moderador
  • Hola Enrique:

    Solución tomada. El volver a Access no creo que nadie vuelva, en ese último caso, la conversión la haría yo desde aquí a través de algún programa que tengo para convertir bases de datos.

    No perdamos más el tiempo (tu tiempo) en algo que falla desde los principios, como el comentario que haces sobre lo del otro día en la conversión de datos.

    Esto lo damos ya por finiquitado, el programa va de película y corre como la seda, te lo preparo entre hoy y mañana y te lo envío.

    Querido amigo gracias por tus enseñanzas y razonamientos como siempre. Lo bueno es que de cada cosa que escribes aprendo algo y t aseguro que he aprendido muchísimo.

    Un fuerte abrazo y feliz fin de semana.

    Gemma

    sábado, 7 de enero de 2017 8:22