Почему мой табличный параметр пуст при достижении базы данных? - PullRequest
1 голос
/ 08 декабря 2009

Я пытаюсь проверить функциональность нового табличного параметра в SQL 2008, вызвав хранимую процедуру с помощью ADO.NET, но я столкнулся с проблемой, когда параметр, кажется, не содержит строк при получении хранимая процедура. 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
}

Я использовал это сообщение в блоге в качестве примера. В результате я всегда получаю «Не содержит строк», но просмотр отладчика Visual Studio показывает, что передаваемая мной коллекция содержит два значения, которые я туда поместил. Есть идеи? Чего мне не хватает?

1 Ответ

4 голосов
/ 08 декабря 2009

Добавить это:

cmd.CommandType = CommandType.StoredProcedure;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...