2009-06-15 9 views
1

J'essaie d'exécuter un proc stocké SQL à partir de Visual Studio 2008 qui prend un paramètre UDT table comme une entrée. J'ai ajouté ce paramètre dans Visual Studio 2008 mais lorsque j'exécute ce programme, il obtient un "ArgumentException - Type spécifié n'est pas enregistré sur le serveur cible." J'ai donc googlé ce problème et pense que je dois créer une nouvelle classe dans Visual Studio 2008 correspondant aux propriétés de ce type de table à partir de SQL Server 2008. Mais je ne trouve aucun exemple sur Internet impliquant table UDT. Et j'ai essayé tous les exemples scalaires UDT, mais je n'étais pas sûr de savoir comment les modifier pour les rendre basés sur des tables. J'ai également lu que je peux avoir besoin de créer un assembly, bien que je ne sais pas si cela est requis uniquement pour importer un type dans SQL Server 2008 ou s'il peut également être utilisé pour importer un type dans Visual Studio. BTW, je ne vois aucun type répertorié à partir de l'Explorateur de serveur dans VS 2008, bien que je vois la base de données et ses SP. J'ai essayé d'actualiser la base de données, mais les types n'étaient toujours pas visibles. Ce que je dois faire est simple. J'ai un UDT de table comme ceci:sql table udt, vs 2008, csharp

CREATE TYPE [dbo].[parseInputFile] AS TABLE(
[NumCols] [int] IDENTITY(1,1) NOT NULL, 
[strRow] [varchar](500) NOT NULL, 
PRIMARY KEY CLUSTERED 

Et l'extrait de code de mon code C# est:

public static int AppendData(string[] myStringArray) 
    { 
      SqlConnection conn = new SqlConnection(connString); 
      SqlCommand cmd = conn.CreateCommand(); 
      cmd.CommandText = "dbo.uspAppendTableFromInput"; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Connection = conn; 
      SqlParameter param = cmd.Parameters.Add("@InputFileParam", SqlDbType.Udt); 
      param.UdtTypeName = "AdventureWorks.dbo.parseInputFile"; 
      param.Value = myStringArray; 
      conn.Open(); 
      RowsAffected = cmd.ExecuteNonQuery(); 

rowsAffected montrent zéro lignes affectées après l'exécution de cela. Qu'est-ce que je rate? Pouvez-vous me montrer un site Web qui montre un exemple simple de ceci. Ou me donner un pourboire? J'ai aussi essayé 'param.UdtTypeName = "parseInputFile";' pour l'extrait ci-dessus, mais cela a renvoyé la même erreur. BTW, "myStringArray" est essentiellement une table. C'est une série de cordes. par exemple. myStringArray [0] = "Bonjour | Bob | Comment | Faire", myStringArray [1] = "I | Am | Fin | Et", etc.

+0

exemple @ http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause/337864#337864 – ahains

+0

A quoi ressemble votre proc stocké comme? Principalement la liste des paramètres que vous avez déclarés –

+0

Et qu'essayez-vous exactement d'accomplir? Appeler le proc stocké avec un ensemble de paramètres dans le type de table défini par l'utilisateur? Ou appelez le proc stocké pour obtenir une telle table RETURNED ?? Pas tout à fait clair ... –

Répondre

2

Fondamentalement, vous avez presque votre configuration - à mi-chemin :-)

Jetez un coup d'œil sur ces articles d'introduction aux TVP - paramètres de table - que vous essayez, non?

Fondamentalement, ce que vous devez faire est la suivante:

  • créer un type de table défini par l'utilisateur - vous avoir déjà
  • créer une procédure stockée qui prend en charge ces types de table en tant que paramètre d'entrée READONLY (sans s si vous avez obtenu ceci - n'avez pas encore vu votre code)
  • pour appeler depuis .NET; vous devez créer une instance DataTable et recréer la même structure (en termes de champs et leurs types - indiqué dans l'article de l'équipe SQL)
  • remplissage qui DataTable
  • créer un SqlConnection et SqlCommand (de CommandType = stocké Proc) dans .NET qui définit les paramètres de type table de type "SqlDbType.Structured" dans .NET, et définit ses valeurs sur le DataTable créé ci-dessus
  • appel que proc stocké (empaqueté dans la SqlCommand) à partir de .NET

Cela aide-t-il du tout? Je recommande fortement l'article SQL Team - très instructif!

Marc

+0

test pour voir si cela fonctionne vraiment – salvationishere

+0

Merci pour les conseils, Marc! Je viens de poster une autre question concernant ce même problème. J'ai eu quelques problèmes avec ce site Web, donc je l'ai publié comme une question différente. Souhaitez-vous s'il vous plaît regarder cette autre question? Devrait être facile à trouver, puisque j'ai seulement posté deux questions sur ce site maintenant. Merci. – salvationishere