2 votes

C# DataTable avec un champ ushort comme paramètre d'une procédure stockée du serveur SQL

J'ai une procédure de stockage dans SQL Server qui a comme paramètre un type de valeur de table.

Le type de table valorisé est le suivant :

CREATE TYPE [Serveis].[tblType_DispensadorBebidas_Abonados] AS TABLE 
(
    [ID] [varchar](9) NOT NULL,
    [Field1] [smallint] NOT NULL,
    [Field2] [smallint] NOT NULL,
    [Date] [datetime] NOT NULL,
    PRIMARY KEY ([ID])
)

Ensuite, la procédure stockée prend ce type de valeur de table comme paramètre :

PROCEDURE [dbo].[AddData] 
    @DataTable MytableValuedType READONLY

En C#, je crée une DataTable comme ci-dessous :

DataTable dt = new DataTable();

dt.Columns.Add("ID", typeof(string)).SetOrdinal(0);           
dt.Columns.Add("Field1", typeof(ushort)).SetOrdinal(1);
dt.Columns.Add("Field2", typeof(ushort)).SetOrdinal(2);
dt.Columns.Add("Date", typeof(DateTime)).SetOrdinal(3);

dt.Rows.Add(this.ID,this.Field1,this.Field2,this.Date);

En C#, les types de données sont :

  • Chaîne d'identification
  • Champ1 ushort
  • Champ2 ushort
  • Date DateTime

et ensuite je crée un paramètre SQL :

SqlParameter param = new SqlParameter();
param.ParameterName = "@DataTable";
param.Value = dt;
param.SqlDbType = SqlDbType.Structured;

Ajoutez-le en utilisant command.Parameters.Add(param)

et enfin j'appelle ExecuteNonQuery.

Il jette l'erreur (traduite de l'espagnol) :

Column type 'Field1' not allowed. The type is "'UInt16'".

Comment pourrais-je résoudre ce problème ?

2voto

Marc Gravell Points 482669

smallint dans SQL Server est signé. Vous devrez utiliser un type de données signé correspondant (c.-à-d. short ) dans votre code C#. Cela devrait être aussi simple que :

    dt.Columns.Add("ID", typeof(string)).SetOrdinal(0);           
    dt.Columns.Add("Field1", typeof(short)).SetOrdinal(1);
    dt.Columns.Add("Field2", typeof(short)).SetOrdinal(2);
    dt.Columns.Add("Date", typeof(DateTime)).SetOrdinal(3);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X