2012-06-23 30 views
5

he un procedimiento almacenado que acepta una tabla definida usuario tipo llamada SeasonTable que se parece a esto:C#: pasar dataTable al procedimiento almacenado: cuestión orden de las columnas

SeasonTable

[SeasonId] [int] NOT NULL, 
    [SeasonName] [varchar](50) NOT NULL, 
    [Month] [int] NULL, 
    [IsDeleted] [bit] NOT NULL 

almacenados El procedimiento es como se muestra a continuación

CREATE PROCEDURE [dbo].[udpTest] 
(
    @STable dbo.SeasonTable READONLY 
) 
AS 
BEGIN 
SELECT [SeasonName] as SeasonName,[SeasonId],[Month],[IsDeleted] 
    FROM @AdminBillingSeasonsTable 
END 

Cuando llamo a esto desde C# aplicación

private DataTable TestCreateDataTable() 
{ 
      DataTable dt = new DataTable(); 

      dt.Columns.Add("SeasonName", typeof(string)); 
      dt.Columns.Add("SeasonId", typeof(int));     
      dt.Columns.Add("Month", typeof(int)); 
      dt.Columns.Add("IsDeleted", typeof(bool)); 
      dt.Rows.Add("season1",1, 4, false); 
      dt.Rows.Add("season2",2, 9, false); 
      dt.Rows.Add("season3",3, 11, false); 
      return dt; 
} 

Cuando uso la tabla anterior como parámetro a SP de aplicación de C# es tirar de error:

unable to convert "season1" to int.

¿Quiere esto decir el orden de las columnas en C# aplicación debe ser lo mismo que el orden de las columnas en SQL?

Cualquier ayuda con respecto a esto es muy apreciada.

Gracias de antemano

+0

¿Te ha intentado cambiar el orden de las columnas (SeasonId continuación SeasonName) en dt ?? – yogi

+0

@yogi ya después de cambiar funcionó bien. !!!! – sandeep

+0

@yogi quizás necesite agregar eso como la respuesta: para que la gente sepa que ha sido respondida – whytheq

Respuesta

5

trate de cambiar su columna de secuencia de algo como esto

private DataTable TestCreateDataTable() 
      { 
       DataTable dt = new DataTable(); 

       dt.Columns.Add("SeasonId", typeof(int));  // seasonId and then 
       dt.Columns.Add("SeasonName", typeof(string)); // seasonName 
       dt.Columns.Add("Month", typeof(int)); 
       dt.Columns.Add("IsDeleted", typeof(bool)); 
       dt.Rows.Add("season1",1, 4, false); 
       dt.Rows.Add("season2",2, 9, false); 
       dt.Rows.Add("season3",3, 11, false); 
       return dt; 
      } 
+0

¿Es este el comportamiento exacto de C# y sql ????? – sandeep

+2

En realidad 'tipo de tabla definido por el usuario' exceptúa las columnas en ese formato solo en las que se han creado en SQL, no podemos hacer malabares con ellas, al menos no sé cómo hacerlo, así que es mejor mantener la secuencia correcta y sincronizar. – yogi

+1

Estoy generando automáticamente mis tablas de datos para esto y puedo confirmar que, como se describe aquí, SQL Server ignora los nombres y tipos de columna de la tabla y depende únicamente del orden de ellos cuando un Stored Proc obtiene un parámetro de tabla. Entonces, en algún lugar debes pedir esas columnas. – philw

Cuestiones relacionadas