none
ERROR AL GUARDAR INFORMACION CUANDO SE CREAN TABLAS EN TIEMPO DE EJECUCION - AYUDA RRS feed

  • Pregunta

  • Hola a todos

    Estoy desarrollando una aplicación donde requiero crear una tabla a partir de otra identica; para ello utilizo la siguiente consulta:

    Dim Nsql_ref = "SELECT * FROM BT_Qsist"

    Dim TblConex_oi As OleDbConnection = New OleDbConnection

    Dim TblCommand_ref As OleDbCommand = New OleDbCommand

    Dim TblAdapter_ref As OleDbDataAdapter = New OleDbDataAdapter(Nsql_ref, TblConex_oi)

    Dim TblCBuilder_ref As OleDbCommandBuilder = New OleDbCommandBuilder(TblAdapter_ref)

    TblAdapter_ref.MissingSchemaAction = MissingSchemaAction.AddWithKey

    Dim TblDatTbl_ref As DataTable = New DataTable

    TblCommand_ref.Connection = TblConex_oi

    TblConex_oi.ConnectionString = ConexSist_oi

    TblConex_oi.Open()

    TblAdapter_ref.Fill(TblDatTbl_ref)

    'crear tablas

        TblDatTbl_ref.Columns.Item("Id").AutoIncrement = True

        TblDatTbl_ref.Columns.Item("Id").Unique = True

            TblCommand_ref.CommandText = "SELECT * INTO u_BT_Qsist FROM BT_Qsist"

            TblCommand_ref.ExecuteNonQuery()

       TblConex_oi.Close()

    Aparentemente la tabla se crea de forma perfecta. Pude verificar que ambas tablas se crearon identicas en datos y estructura.

    Sin embargo mas adelante cuando intento escribir datos en la nueva tabla creada me arroja el siguiente error:

    "La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave." y aqui se detiene.

    El codigo que utilizo para escribir en la tabla es muy sencillo y es el siguiente:

    Dim Nsql_ref As String = "SELECT * FROM " & NTbl_ref & " ORDER BY " & NCol_ref & " ASC"

    Dim TblAdapter_ref As OleDbDataAdapter = New OleDbDataAdapter(Nsql_ref, TblConex_a)

    Dim TblCBuilder_ref As New OleDbCommandBuilder(TblAdapter_ref)

    TblAdapter_ref.MissingSchemaAction = MissingSchemaAction.AddWithKeyDim

    TblDatTbl_ref As DataTable = New DataTableTbl

    Conex_a.ConnectionString = ConexSist_a

    TblConex_a.Open()

    TblAdapter_ref.Fill(TblDatTbl_ref)

     

    For i As Integer = 0 To TblDatTbl_ref.Rows.Count - 1

         

    TblDatTbl_ref.Rows(i).Item("Id_NR") = CStr(i + 1)

     

    Next i

    'Actualizar Tabla 

       TblAdapter_ref.Update(TblDatTbl_ref)   .... en esta linea me genera el error

    ...

    No he podido solventar la situación, sin embargo pude notar que el archivo de base de datos donde se creo la nueva tabla generó automaticamente otra tabla llamada "Problemas de Compatibilidad web", con la siguiente informacion:

    Identificador  Tipo elem      Nombre del elem      Tipo de control        Nombre del control           Nombre de la propiedad      Identificador           tipo  de problema                     

    1                           Tabla                u_BT_Qsist               TableColumn               Id                                              Error                                           ACCWeb107024        La autonumeración   sólo se admite para   el campo de la clave

    2                           Tabla                u_BT_Qsist               Tabla                               u_BT_Qsist                          Error                                          ACCWeb107014         Una tabla debe tener una clave  principal y ser un número con el

                     tamaño de campo 'largo' para

     

     La tabla original tiene clave principal en la columna Id, pero la tabla que se genera no tiene ese campo con clave.

    Realmente no entiendo lo que sucede y requiero que alguien me ayude a fin de resolver estas dos situaciones que no dejan escribir y actualizar la nueva tabla...

    Agradeciendo la ayuda que puedan prestar.

    Estoy usando VS2010, MSAcces 2010 y ADO.net, OLEDB en plataforma de 64 bits

    Saludos

    Cumanez




    lunes, 30 de septiembre de 2013 9:31

Respuestas

  • El problema es que tu comando "SELECT * INTO u_BT_Qsist FROM BT_Qsist" crea la tabla  u_BT_Qsist sin ningún índice ni clave primaria (la configuración que antes estableces en memoria sobre TblDatTbl_ref no sirve para nada, al servidor no le llega). Y cuando una tabla no tiene clave primaria, el OleDbCommandBuilder no es capaz de generar los comandos de actualización, por lo que te sale el error que dice "La generación SQL dinámica para UpdateCommand no es compatible [...], que no devuelve ninguna información sobre columnas clave". Para remediarlo, podrías ejecutar mediante un ExecuteNonQuery una sentencia "ALTER TABLE ... ADD CONSTRAINT ... PRIMARY KEY(columna)". Por esta vía también puedes añadir el IDENTITY si lo necesitas.

    • Propuesto como respuesta Sergio Parra lunes, 30 de septiembre de 2013 18:04
    • Marcado como respuesta Cumanez_5131 domingo, 13 de octubre de 2013 23:10
    lunes, 30 de septiembre de 2013 18:00

Todas las respuestas

  • El problema es que tu comando "SELECT * INTO u_BT_Qsist FROM BT_Qsist" crea la tabla  u_BT_Qsist sin ningún índice ni clave primaria (la configuración que antes estableces en memoria sobre TblDatTbl_ref no sirve para nada, al servidor no le llega). Y cuando una tabla no tiene clave primaria, el OleDbCommandBuilder no es capaz de generar los comandos de actualización, por lo que te sale el error que dice "La generación SQL dinámica para UpdateCommand no es compatible [...], que no devuelve ninguna información sobre columnas clave". Para remediarlo, podrías ejecutar mediante un ExecuteNonQuery una sentencia "ALTER TABLE ... ADD CONSTRAINT ... PRIMARY KEY(columna)". Por esta vía también puedes añadir el IDENTITY si lo necesitas.

    • Propuesto como respuesta Sergio Parra lunes, 30 de septiembre de 2013 18:04
    • Marcado como respuesta Cumanez_5131 domingo, 13 de octubre de 2013 23:10
    lunes, 30 de septiembre de 2013 18:00
  • Excelente. era lo que hacia falta. solucionada la situación.

    Gracias por la ayuda y estamos en contacto.

    Saludos

    Cumanez

    domingo, 13 de octubre de 2013 23:12