5

He almacenado procedimientos (aceptan parámetros) que devuelven varios conjuntos de resultados y me gustaría tener esto guardado en un conjunto de datos con tipo.Crear todo el conjunto de datos del procedimiento almacenado existente

La pregunta es: ¿puedo hacer que Visual Studio 2010 genere el conjunto de datos tipeados según el procedimiento almacenado? Yo sé que puedo tener esto para una sola tabla, pero necesito el conjunto de datos (varias tablas, una para cada conjunto de resultados)

Respuesta

3

Así que vamos a hacer un experimento para ver si es posible ..

creé el siguiente procedimiento almacenado en una base de datos SQL 2008:

CREATE PROCEDURE dbo.StackOverflow3668337 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 'First bit'; 

    SELECT 'Second bit'; 
END 

Entonces creó un nuevo proyecto en VS2010, y ha añadido un elemento de conjunto de datos al proyecto.

Creé una conexión a la base de datos en Server Explorer y arrastré el elemento 'StackOverflow3668337' en la superficie del diseñador de DataSet. Este es el resultado:

TableAdapter from DataSet Designer

Así que sería sólo un DataTable. Por lo tanto, desafortunadamente, creo que la respuesta está fuera de la caja, "No".

Creo que la razón principal de esto es que los TableAdapter classes que se generan están vinculados a una única DataTable. Puede tener varios TableAdapters para una única DataTable, pero todos deben devolver los mismos datos. No hay capacidad para que un único TableAdapter interactúe con DataTables adicionales.

3

Sé que esto es antiguo pero examino esta pregunta cuando estaba buscando la misma/similar respuesta. Así que pensé que dejaría lo que encontré aquí para aquellos que vienen detrás de mí. No es auto-mágico, pero esto te llevará hasta allí.

http://support.microsoft.com/kb/322793

Crear Procedimiento

CREATE PROCEDURE dbo.sp_GetCustOrd 
AS 
SELECT * FROM Customers; 
SELECT * FROM Orders; 

Crear conjunto de datos

  1. En Visual Studio .NET, en el menú Archivo, seleccione Nuevo y, a continuación, haga clic en proyecto.
  2. Haga clic en Proyectos de Visual Basic en Tipos de proyecto y luego haga clic en Aplicación de Windows en Plantillas.
  3. En el menú Ver, haga clic en Explorador del servidor.
  4. En Server Explorer, haga clic en Conectar a la base de datos, y luego conéctese a su base de datos SQL Server Northwind.
  5. Arrastre los clientes y las tablas Pedidos desde Server Explorer al proyecto actual. Observe que un objeto SqlConnection y dos objetos SqlDataAdapter se agregan al proyecto.
  6. En la ventana Propiedades, haga clic en Generar conjunto de datos y luego agregue ambas tablas al conjunto de datos. Tenga en cuenta que se agrega un archivo .xsd al proyecto. El archivo .xsd se nombra de acuerdo con el nombre que seleccionó para la clase DataSet.

Agregar relaciones

  1. En el Explorador de soluciones, haga doble clic en el archivo .xsd que creó en la sección anterior.
  2. Haga clic con el botón derecho en la tabla Clientes en el diseñador, señale Agregar y luego haga clic en Nueva relación.
  3. En el cuadro de diálogo Editar relación, seleccione la tabla Pedidos como el elemento secundario y luego haga clic en Aceptar. Esto crea una nueva DataRelation llamada CustomersOrders en el esquema DataSet.
  4. En el menú Archivo, haga clic en Guardar para guardar los cambios.

Llenar

Dim da As New SqlDataAdapter("sp_GetCustOrd", SqlConnection1) 
da.SelectCommand.CommandType = CommandType.StoredProcedure 
da.TableMappings.Add("Table", "Customers") 
da.TableMappings.Add("Table1", "Orders") 
Dim ds As New CustOrd()  ' Change this name to match .xsd file name. 
da.Fill(ds) 
DataGrid1.DataSource = ds 
DataGrid1.DataMember = "Customers" 

Sé que este ejemplo es en VB, y yo estaba buscando la respuesta de C#. Pero debería ser lo suficientemente fácil de transportar.

+0

Puedo confirmar que este método funciona. Pude devolver dos tablas en un procedimiento y completar un conjunto de datos fuertemente tipado utilizando este método. También probé usando un parámetro para controlar qué tabla se devuelve. Esto funcionó pero requirió dos llamadas a da.Fill (ds.Table) y da.Fill (ds.Table1). No es una idea, pero también funciona si su único objetivo es mantener el número de procedimientos en su base de datos minimizados. – bdwakefield

Cuestiones relacionadas