Warum nicht einen Table-Valued Parameter verwenden ?
Erstellen Sie einen benutzerdefinierten Tabellentyp DateTimes
auf SQL
create type DateTimes as table
(
[Value] datetime
)
Dann ändern Sie Ihre gespeicherte Prozedur:
ALTER PROCEDURE spSelectPlacementData
(
@ClientID SMALLINT,
@SourceFileDates DateTimes readonly -- must be readonly
)
Jetzt können Sie @SourceFileDates
behandeln als schreibgeschützte Tabellenvariable.
Bei der Angabe Ihres SqlCommand
-Parameter wird ein Tabellenwertparameter als SqlDbType.Structured
und als DataTable
übergeben
oder DataRowcollection
. Sie können es also folgendermaßen füllen:
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
});
Jetzt ist alles schön und richtig typisiert ... und Sie müssen keine Zeichenfolgenanalyse oder -umwandlung durchführen.
Als Nebenbemerkung können Sie genauso gut fortfahren und Strings
erstellen und Integers
auch Typen; Sie werden süchtig nach TVPs und verwenden sie überall.