Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么我的表值参数在到达数据库时为空?_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 为什么我的表值参数在到达数据库时为空?

Sql server 为什么我的表值参数在到达数据库时为空?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我试图通过使用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] (@pe

我试图通过使用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
存储的进程如下所示:

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代码是这样的(振作起来,这是很多):

公共类程序
{
静态void Main(字符串[]参数)
{
人员集合人员=
新PersonCollection()
{
新人
{
FirstName=“约翰”,
LastName=“Doe”,
生日=新的日期时间(1975年12月1日)
},
新人
{
FirstName=“Randall”,
LastName=“史蒂文斯”,
生日=新的日期时间(1935,7,10)
}
};
使用(SqlConnection conn=newsqlconnection(“数据源=localhost\\sqlexpress;初始目录=TVPExample;集成安全性=SSPI;”)
{
conn.Open();
SqlCommand cmd=新的SqlCommand(“AddPeople”,康涅狄格州);
SqlParameter=cmd.Parameters.AddWithValue(“@peopleToAdd”,people);
parameter.SqlDbType=SqlDbType.Structured;
parameter.TypeName=“dbo.PersonType”;
字符串结果=cmd.ExecuteScalar().ToString();
控制台写入线(结果);
}
}
}
公共阶层人士
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共日期时间出生日期{get;set;}
}
公共类PersonCollection:列表,IEnumerable
{
#IEnumerable的区域实现
IEnumerator IEnumerable.GetEnumerator()
{
SqlDataRecord rec=新的SqlDataRecord(
新的SqlMetaData(“FirstName”,SqlDbType.VarChar,50),
新的SqlMetaData(“LastName”,SqlDbType.VarChar,50),
新的SqlMetaData(“Birthdate”,SqlDbType.Date));
foreach(本文件中的人员)
{
rec.SetString(0,person.FirstName);
rec.SetString(1,person.LastName);
记录SetDateTime(2,个人出生日期);
收益率收益率;
}
}
#端区
}
我以博客帖子为例。我总是得到“不包含行”的结果,但查看VisualStudio调试器显示,我传入的集合包含我在其中输入的两个值。有什么想法吗?我缺少什么?

添加以下内容:

cmd.CommandType = CommandType.StoredProcedure;

您可以在SQL server profiler中查看这一点,看看实际发生了什么。打得好!你可以看出我已经有一段时间没有使用原始ADO.NET了!这些天我不是在使用NHibernate就是在使用企业库。