DataTable
, DbDataReader
ou IEnumerable<SqlDataRecord>
peuvent être utilisés pour remplir un paramètre à valeur de table, conformément à l'article MSDN Paramètres évalués par table dans SQL Server 2008 (ADO.NET) .
L'exemple suivant illustre l'utilisation d'un DataTable
ou un IEnumerable<SqlDataRecord>
:
Code SQL :
CREATE TABLE dbo.PageView
(
PageViewID BIGINT NOT NULL CONSTRAINT pkPageView PRIMARY KEY CLUSTERED,
PageViewCount BIGINT NOT NULL
);
CREATE TYPE dbo.PageViewTableType AS TABLE
(
PageViewID BIGINT NOT NULL
);
CREATE PROCEDURE dbo.procMergePageView
@Display dbo.PageViewTableType READONLY
AS
BEGIN
MERGE INTO dbo.PageView AS T
USING @Display AS S
ON T.PageViewID = S.PageViewID
WHEN MATCHED THEN UPDATE SET T.PageViewCount = T.PageViewCount + 1
WHEN NOT MATCHED THEN INSERT VALUES(S.PageViewID, 1);
END
Code C# :
private static void ExecuteProcedure(bool useDataTable,
string connectionString,
IEnumerable<long> ids)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "dbo.procMergePageView";
command.CommandType = CommandType.StoredProcedure;
SqlParameter parameter;
if (useDataTable) {
parameter = command.Parameters
.AddWithValue("@Display", CreateDataTable(ids));
}
else
{
parameter = command.Parameters
.AddWithValue("@Display", CreateSqlDataRecords(ids));
}
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "dbo.PageViewTableType";
command.ExecuteNonQuery();
}
}
}
private static DataTable CreateDataTable(IEnumerable<long> ids)
{
DataTable table = new DataTable();
table.Columns.Add("ID", typeof(long));
foreach (long id in ids)
{
table.Rows.Add(id);
}
return table;
}
private static IEnumerable<SqlDataRecord> CreateSqlDataRecords(IEnumerable<long> ids)
{
SqlMetaData[] metaData = new SqlMetaData[1];
metaData[0] = new SqlMetaData("ID", SqlDbType.BigInt);
SqlDataRecord record = new SqlDataRecord(metaData);
foreach (long id in ids)
{
record.SetInt64(0, id);
yield return record;
}
}
0 votes
Consultez cette solution : Procédure stockée avec paramètre évalué par la table dans EF. code.msdn.microsoft.com/Stored-Procedure-with-6c194514
0 votes
Dans un cas comme celui-ci, j'ai l'habitude de concaténer des chaînes de caractères et de les diviser du côté du serveur ou de passer même un xml si j'ai plusieurs colonnes. Sql est très rapide lors du traitement du xml. Vous pouvez essayer toutes les méthodes et vérifier le temps de traitement et après cela choisir la meilleure méthode. Un XML ressemblerait à <Items><Item value="sdadas"/><Item value="sadsad"/>...</Items>. Le processus sur Sql Server est également simple. En utilisant cette méthode, vous pouvez toujours ajouter un nouvel attribut à <item> si vous avez besoin de plus d'informations.
4 votes
@NituAlexandru, "Sql c'est très rapide quand on traite du xml.". Pas du tout.