Защо не използвате параметър с таблична стойност ?
Създайте дефинирана от потребителя таблица от тип DateTimes
на SQL
create type DateTimes as table
(
[Value] datetime
)
След това променете съхранената си процедура:
ALTER PROCEDURE spSelectPlacementData
(
@ClientID SMALLINT,
@SourceFileDates DateTimes readonly -- must be readonly
)
Сега можете да третирате @SourceFileDates
като таблична променлива само за четене.
Когато указвате своя SqlCommand
параметри, параметър със стойност на таблица е посочен като SqlDbType.Structured
и се предава като DataTable
или DataRowcollection
. Така че можете да го попълните така:
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
});
Сега всичко е хубаво и правилно въведено... и не е необходимо да правите анализ или кастинг на низове.
Като странична бележка, можете да продължите и да създадете Strings
и Integers
видове също; Ще се пристрастите към TVP и ще ги използвате навсякъде.