Dlaczego nie użyć parametru o wartościach tabelarycznych ?
Utwórz zdefiniowaną przez użytkownika tabelę typu DateTimes
na SQL
create type DateTimes as table
(
[Value] datetime
)
Następnie zmień procedurę składowaną:
ALTER PROCEDURE spSelectPlacementData
(
@ClientID SMALLINT,
@SourceFileDates DateTimes readonly -- must be readonly
)
Teraz możesz traktować @SourceFileDates
jako zmienna tabelowa tylko do odczytu.
Podczas określania SqlCommand
parametrów, parametr z wartościami przechowywanymi w tabeli jest określony jako SqlDbType.Structured
i przekazany jako DataTable
lub DataRowcollection
. Możesz więc wypełnić to tak:
var sourceFileDates = new DataTable();
sourceFileDates.Columns.Add("Value", typeof(DateTime));
foreach (DateTime file in job.sourceFiles)
{
sourceFileDates.Rows.Add(file);
}
selectRunCommand.Parameters.Add(new SqlParameter {
ParameterName = "@SourceFileDates",
Value = sourceFileDates,
SqlDbType = SqlDbType.Structured // make sure you specify structured
});
Teraz wszystko jest ładne i poprawnie napisane... i nie musisz robić żadnego parsowania ani rzutowania łańcuchów.
Na marginesie, równie dobrze możesz iść dalej i stworzyć Strings
i Integers
typy również; Wciągniesz się w programy TVP i będziesz ich używać w każdym miejscu.