none
Stored Procedure Con TVP RRS feed

  • Pregunta

  • Hola

    Desarrollo una aplicacion donde paso un dataTable a un procedimiento almacenado para insertar filas, y aunque del lado de mi codigo C# el datatable esta lleno , no se insertan las filas en la tabla ... Que estare haciendo mal ??

    Mi Codigo SQL

    USE [CERVIX]
    GO
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
       
    CREATE PROCEDURE [dbo].[Sp_InsertarEnPrecioTVP]
        @TVP LocationTableType READONLY  
        AS   
        SET NOCOUNT ON  
         INSERT INTO CVX_CAR_PRECIOS  
               ( CPR_ORDEN , 
       CPR_T_REGISTRO, 
       CPR_NEMOTECNICO, 
       CPR_ISIN, 
       CPR_NUMERO_EMISION, 
       CPR_ESTADO, 
       CPR_FECHA_REGISTRO ,
       CPR_FECHA_EMISION ,
       CPR_FECHA_VENCIMIENTO , 
       CPR_PERIODICIDAD ,
       CPR_MODALIDAD, 
       CPR_DIAS_VCTO, 
       CPR_CODIGO_MONEDA , 
       CPR_TIPO_TASA ,
       CPR_TASA_REFERENCIA , 
       CPR_SPREAD ,
       CPR_TIPO_CALCULO , 
       CPR_BASE_CALCULO ,
       CPR_PRECIO , 
       CPR_FECHA_ULTIMO_PRECIO  , 
       CPR_ULTIMO_PRECIO , 
       CPR_ISIN2 , 
       CPR_PRECIO_LIMPIO ,
       CPR_ISIN3 )    SELECT * FROM  @TVP;  
      
    

    Mi Codigo C#

     public void InsertarEnPrecioTVP (DataTable dt)
            {
                SqlConnection Conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["CnxCervix"].ToString());
                SqlCommand comando = new SqlCommand("Sp_InsertarEnPrecioTVP", Conexion);
                comando.CommandType = CommandType.StoredProcedure;
                comando.Parameters.Clear();
                SqlParameter myDataTable = comando.Parameters.AddWithValue("@TVP", dt);
                myDataTable.SqlDbType = SqlDbType.Structured;
                comando.ExecuteNonQuery();
           
            }


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    viernes, 30 de junio de 2017 13:37

Respuestas

Todas las respuestas

  • Saludos,

    No veo ahí la creación de la LocationTableType, donde lo haces?


    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Proponer como respuesta"

    Blog
    J.Joaquin

    viernes, 30 de junio de 2017 13:49
  • Hola J.Joaquin

    No veo ahí la creación de la LocationTableType, donde lo haces?

    Creo el procedimiento almacenado de esta forma ...pero cuando lo abro el codigo de crear LocationTableType desaparece

    Mi Codigo al crear el  Procedimiento almacenado

    USE CERVIX;  
    GO  
      
    CREATE TYPE LocationTableType AS TABLE   
      ( CPR_ORDEN INT, 
       CPR_T_REGISTRO VARCHAR(1), 
       CPR_NEMOTECNICO VARCHAR(12), 
       CPR_ISIN VARCHAR(12), 
       CPR_NUMERO_EMISION VARCHAR(18), 
       CPR_ESTADO VARCHAR(1), 
       CPR_FECHA_REGISTRO DATE,
       CPR_FECHA_EMISION DATE,
       CPR_FECHA_VENCIMIENTO DATE, 
       CPR_PERIODICIDAD VARCHAR(1),
       CPR_MODALIDAD VARCHAR(1), 
       CPR_DIAS_VCTO REAL, 
       CPR_CODIGO_MONEDA VARCHAR(4), 
       CPR_TIPO_TASA VARCHAR(1),
       CPR_TASA_REFERENCIA VARCHAR(4), 
       CPR_SPREAD REAL,
       CPR_TIPO_CALCULO REAL, 
       CPR_BASE_CALCULO REAL,
       CPR_PRECIO REAL, 
       CPR_FECHA_ULTIMO_PRECIO DATE , 
       CPR_ULTIMO_PRECIO REAL, 
       CPR_ISIN2 VARCHAR(12), 
       CPR_PRECIO_LIMPIO REAL,
       CPR_ISIN3 VARCHAR(12)
        );  
     GO  
      
    /* Create a procedure to receive data for the table-valued parameter. */  
    CREATE PROCEDURE Sp_InsertarEnPrecioTVP
        @TVP LocationTableType READONLY  
        AS   
        SET NOCOUNT ON  
         INSERT INTO CVX_CAR_PRECIOS  
               ( CPR_ORDEN , 
       CPR_T_REGISTRO, 
       CPR_NEMOTECNICO, 
       CPR_ISIN, 
       CPR_NUMERO_EMISION, 
       CPR_ESTADO, 
       CPR_FECHA_REGISTRO ,
       CPR_FECHA_EMISION ,
       CPR_FECHA_VENCIMIENTO , 
       CPR_PERIODICIDAD ,
       CPR_MODALIDAD, 
       CPR_DIAS_VCTO, 
       CPR_CODIGO_MONEDA , 
       CPR_TIPO_TASA ,
       CPR_TASA_REFERENCIA , 
       CPR_SPREAD ,
       CPR_TIPO_CALCULO , 
       CPR_BASE_CALCULO ,
       CPR_PRECIO , 
       CPR_FECHA_ULTIMO_PRECIO  , 
       CPR_ULTIMO_PRECIO , 
       CPR_ISIN2 , 
       CPR_PRECIO_LIMPIO ,
       CPR_ISIN3 )    SELECT * FROM  @TVP;  
            GO 
    	
      
      
    GO
    


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    viernes, 30 de junio de 2017 15:28
  • Saludos,

    Los Types Table se guardan en Programmin/Types ahí la veras y según lo que puedo observar tu TVP no machea con los valores que le pasas en el procedure, los valores que le pasas en el procedure deben ser los mismos que el TVP.


    Si mi respuesta te ha ayudado a resolver tus problemas, Selecciona "Proponer como respuesta"

    Blog
    J.Joaquin

    viernes, 30 de junio de 2017 15:36
  • ¿Tienes establecido el nombre del tipo para el parámetro con valores de tabla?

    //...
    myDataTable.SqlDbType = SqlDbType.Structured;
    myDataTable.TypeName = "dbo.LocationTableType";
    comando.ExecuteNonQuery();


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de junio de 2017 15:42
  • Hola

    Hize el cambio que sugirio Willams Morales y aun no funcionan

    J.Joaquin escribio : Según lo que puedo observar tu TVP no machea con los valores que le pasas en el procedure

    Willams Morales escribio : ¿Tienes establecido el nombre del tipo para el parámetro con valores de tabla?

    Sera que el DataTable contiene muchas filas ? 39203


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    viernes, 30 de junio de 2017 16:25
  • No, no es el camino a tomar. Te recomiendo utilizar la clase SqlBulkCopy, puedes seguir utilizando el objeto de tipo DataTable como origen de los datos.

    Bulk Insert into SQL from C# App

    SqlBulkCopy Class


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de junio de 2017 16:35
  • Hola

    Usando SQLBULKCOPY

      public void InsertarEnPrecioSqlBulk(DataTable dt)
            {
                using (SqlConnection destinationConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["CnxCervix"].ToString()))
                {
                    destinationConnection.Open();
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection.ConnectionString))
                    {
                        bulkCopy.DestinationTableName = "CVX_CAR_PRECIOS";
                        bulkCopy.WriteToServer(dt);
                    }
                    destinationConnection.Close();
                }
            }


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    viernes, 30 de junio de 2017 17:41