2009-12-07 3 views
1

J'essaie de tester la nouvelle fonctionnalité de paramètre table de SQL 2008 en appelant une procédure stockée à l'aide d'ADO.NET, mais je rencontre un problème où le paramètre semble ne contenir aucune ligne quand il arrive à la procédure stockée. Le UDT ressemble à ceci:Pourquoi mon paramètre table est-il vide lorsque j'atteins la base de données?

CREATE TYPE [dbo].[PersonType] AS TABLE(
[FirstName] [varchar](50) NULL, 
[LastName] [varchar](50) NULL, 
[Birthdate] [date] NULL) 

La procédure stockée ressemble à ceci:

CREATE PROCEDURE [dbo].[AddPeople] 
(@peopleToAdd dbo.PersonType READONLY) 
AS 
BEGIN 
     IF (SELECT COUNT(*) FROM @peopleToAdd) > 0 
     BEGIN 
      SELECT 'Has rows' 
     END 
     ELSE 
     BEGIN 
      SELECT 'Does NOT have rows' 
     END 
END 

Et enfin, le code .NET est ce (accrochez-vous, il est beaucoup):

public class Program 
{ 
    static void Main(string[] args) 
    { 
     PersonCollection people = 
      new PersonCollection() 
       { 
       new Person 
       { 
        FirstName = "John", 
        LastName = "Doe", 
        Birthdate = new DateTime(1975, 12, 1) 
       }, 
       new Person 
       { 
        FirstName = "Randall", 
        LastName = "Stevens", 
        Birthdate = new DateTime(1935, 7, 10) 
       } 
       }; 

     using(SqlConnection conn = new SqlConnection("Data Source=localhost\\sqlexpress;Initial Catalog=TVPExample;Integrated Security=SSPI;")) 
     { 
      conn.Open(); 

      SqlCommand cmd = new SqlCommand("AddPeople", conn); 

      SqlParameter parameter = cmd.Parameters.AddWithValue("@peopleToAdd", people); 
      parameter.SqlDbType = SqlDbType.Structured; 
      parameter.TypeName = "dbo.PersonType"; 

      string result = cmd.ExecuteScalar().ToString(); 

      Console.WriteLine(result); 
     } 
    } 
} 

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime Birthdate { get; set; } 
} 

public class PersonCollection : List<Person>, IEnumerable<SqlDataRecord> 
{ 
    #region Implementation of IEnumerable<SqlDataRecord> 
    IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator() 
    { 
     SqlDataRecord rec = new SqlDataRecord(
      new SqlMetaData("FirstName", SqlDbType.VarChar, 50), 
      new SqlMetaData("LastName", SqlDbType.VarChar, 50), 
      new SqlMetaData("Birthdate",SqlDbType.Date)); 

     foreach (Person person in this) 
     { 
      rec.SetString(0, person.FirstName); 
      rec.SetString(1, person.LastName); 
      rec.SetDateTime(2, person.Birthdate); 
      yield return rec; 
     } 
    } 
    #endregion 
} 

J'ai utilisé le blog this comme exemple. Je reçois toujours "Ne contient pas de lignes" en conséquence, mais en regardant le débogueur Visual Studio montre que la collection que je passe contient les deux valeurs que je mets dedans. Des idées? Qu'est-ce que je rate?

+1

Vous pouvez vérifier cela dans le serveur SQL profileur et de voir ce qui se passe réellement à travers le fil. –

+0

Great Code Exemple merci! – scarpacci

Répondre

4

Ajouter ceci:

cmd.CommandType = CommandType.StoredProcedure; 
+0

Bon appel! Vous pouvez dire que ça fait un moment que j'ai fait ADO.NET brut! Ces jours-ci, je suis soit en utilisant NHibernate ou la bibliothèque d'entreprise. –

Questions connexes