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?
Vous pouvez vérifier cela dans le serveur SQL profileur et de voir ce qui se passe réellement à travers le fil. –
Great Code Exemple merci! – scarpacci