Pourquoi SqlParameter définit toujours le paramètre est null?

using (SqlCommand cmd = new SqlCommand()) { DataTable dt = new DataTable(); cmd.CommandText = p; cmd.CommandType = CommandType.Text; SqlConnection con = new SqlConnection("--"); cmd.Connection = con; cmd.Connection.Open(); foreach (var parameter in filters) { var type = parameter.Value.GetType(); var param = new SqlParameter(parameter.Id, parameter.Value); param.Direction = ParameterDirection.Input; param.Value = parameter.Value; cmd.Parameters.Add(param); } dt.Load(cmd.ExecuteReader()); cmd.Connection.Close(); return dt; } 

Voici mon code. La variable "p" est ma string sqlQuery. La variable "filters" est ma list de parameters. Par exemple: parameter.Id = "@offerId" (en tant que string) et parameter.Value = 1230 (en tant qu'entier) Ma requête est également similaire à celle-ci: " select * from Offers where ID = @offerID and IsActive = @isActive "

quand passer dans cmd.ExecuteReader (), dans IntelliTrace montre ma requête comme ça:

 --The data may be truncated and may not represent the query that was run on the server USE [DB]; GO --Type and value data was not available for the following variables. Their values have been set to defaults. DECLARE @offerID AS SQL_VARIANT; DECLARE @isActive AS SQL_VARIANT; SET @offerID = NULL; SET @isActive = NULL; select * from Offers where ID = @offerID and IsActive = @isActive 

Nous avons essayé beaucoup de méthode pour l'set. Mais toujours les variables définies nulles.

IntelliTrace prend actuellement uniquement en charge ce type d'informations de type pour les files journaux à partir de scénarios MMA . Dans votre scénario, les informations de type de SqlParameter ne sont pas collectées; par conséquent toutes les variables de la requête par défaut à SQL_VARIANT avec des valeurs null.

En utilisant votre code sur Visual Studio 2010 et SQL Server 2008, j'ai essayé de reproduire votre scénario (ou du less ce que je pensais que votre scénario était car vous n'étiez pas très précis ). J'ai créé ces tables: Q25682067 en utilisant int pour l'id de l'offre et le bit pour le champ 'isActive' ; et Q25682067_Offres avec sql_variant pour chaque champ, comme suggéré par votre publication.

 CREATE TABLE [Q25682067]([ID] [int] NOT NULL, [IsActive] [bit] NOT NULL) ON [PRIMARY] CREATE TABLE [Q25682067_Offers]([ID] [sql_variant] NOT NULL,[IsActive] [sql_variant] NOT NULL ) ON [PRIMARY] 

Les paires de données (1, false) et (1, true) ont été ajoutées à chaque table. Maintenant, count tenu de vos filters sont quelque chose comme:

 var filters = new Parameter[] { new Parameter() {Id="@offerID ", Value=1}, new Parameter() {Id="@isActive", Value=false} }; 

où un paramètre peut très rapidement être (sans tenir count des pratiques OOP):

 internal class Parameter { public ssortingng Id; public object Value; } 

Maintenant, cela remplit la table de données:

 cmd.CommandText = "select * from Q25682067 where ID = @offerID and IsActive = @isActive"; 

ce n'est pas:

 cmd.CommandText = "select * from Q25682067_Offers where ID = @offerID and IsActive = @isActive"; 

Utiliser le constructor SqlParameter comme ça lie vos parameters à SqlDbType.Int et SqlDbType.Bit au lieu de SqlDbType.Variant, qui semble être votre arme de choix. C'est pourquoi votre code fonctionne avec la première définition de la table, et non la seconde.