2009-12-07 38 views
1

我试图通过调用使用ADO.NET的存储过程来测试SQL 2008的新的表值参数功能,但我遇到了一个问题,其中参数似乎不包含任何行,当它到达存储过程。该UDT如下:为什么我的表值参数在到达数据库时为空?

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

存储的过程是这样的:

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 

最后,.NET代码是这样的(振作起来,这是一个很大):

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 
} 

我用this博客文章为例。我总是会得到“不包含行”,但查看Visual Studio调试器显示我传入的集合包含我放入的两个值。有任何想法吗?我错过了什么?

+1

你可以在SQL Server设置检查了这一点,看看什么东西跨线实际去。 – 2009-12-07 21:36:32

+0

伟大的代码示例谢谢! – scarpacci 2011-12-04 23:26:05

回答

4

补充一点:

cmd.CommandType = CommandType.StoredProcedure; 
+0

良好的通话!你可以告诉它已经有一段时间了,因为我已经完成了原始的ADO.NET!这些天我使用NHibernate或企业库。 – 2009-12-08 01:41:59

相关问题