ADO.NET: Как иметь N параметров? - PullRequest
0 голосов
/ 08 октября 2010

мне нужно пометить пакет строк в базе данных как "обработанный".

В старые времена, когда все было проще, я создавал SQL-код, который гласил:

UPDATE Readings SET IsProcessed = 1 WHERE ReadingDateTime IN (
    "2010-10-07 22:02:13.327",
    "2010-10-07 22:02:14.213",
    "2010-10-07 22:02:15.595",
    ...
    "2010-10-07 23:03:36.981")

, просматривая список дат:

sql = "UPDATE Readings SET IsProcessed = 1 WHERE ReadingDateTime IN (";
foreach (DateTime datetime in dates)
{
   sql = sql + CRLF+ DateTimeToSql(datetime)+",";
}
sql = sql+")";

И выдать SQL:

ExecuteNonQuery(connection, sql);

И все было хорошо.

Теперь я хочу попытаться сделать что-то трудное; я хочу попробовать использовать параметры:

sql = ???;
command.CommandText = sql;

DbCommand command = connection.CreateCommand();
foreach (DateTime datetime in readings)
{
    command.Parameters.Add(new SqlParameter(???, SqlDbType.DateTime) {Value = datetime});
}
using (DbTransaction transaction = connection.BeginTransaction())
{
    command.Transaction = transaction;
    command.ExecuteNonQuery();
    transaction.Commit();
}

Единственная хитрость заключается в том, что помещать в строку sql и что помещать в каждую итерацию цикла параметров. Им нужно какое-то имя.

Какой рекомендуемый способ назвать произвольное количество параметров?

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Я думаю, что вы могли бы сделать что-то вроде этого: -

sql = "UPDATE Readings SET IsProcessed = 1 WHERE ReadingDateTime IN (";
for (int count=0; count<dates.Length; count++)
{
   sql = sql + CRLF + ":param" + count;
}
sql = sql+")";

for (int count=0; count<dates.Length; count++)
{
    command.Parameters.Add(new SqlParameter(":param" + count, SqlDbType.DateTime) {Value = datetime});
}

Однако, Я думаю, что наличие параметров конкретно в этом сценарии является своего рода ненужным.

Учитывая, что ваши динамические значения dates, а не strings, вы можете вместо этого проверить даты напрямую, используя TryParse, чтобы убедиться, что они являются правильными типами данных, прежде чем добавлять их в исходное решение !!

Я не знаю, достигаете ли вы чего-то большего, используя параметры в этом случае.

0 голосов
/ 08 октября 2010

Вы можете пойти как можно меньше: провайдер примет параметры с именами @0, @1 и т. Д. Но если вы хотите быть более информативным, просто используйте базовое имя @ReadingDateTime с целым числом суффикс от 0..n. Легкий горох.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...