Команда ExecuteNonQueryAsync sql дает SP с несколькими наборами параметров в БД - PullRequest
2 голосов
/ 16 апреля 2019

Я читаю Джсона и вставляю его в стол. Я хотел ускорить программу, не заставляя ее ждать, поскольку каждая вставка будет уникальной.

поэтому для тестирования я создал цикл

for (int i = 0; i < 10; i++)
{
    insert.Parameters.AddWithValue("@id", i);
    insert.Parameters.AddWithValue("@type", "test");

    insert.ExecuteNonQueryAsync();
}

Я запускаю это, и БД плюет обратно, когда я делаю трассировку.

exec SP_Insert @id = 1, @type = 'test',@id = 2, @type = 'test',@id = 3, @type = 'test'

это затем не может быть вставлено, поскольку SP думает, что я дал его многим параметрам.

Есть ли способ исправить это?

Ответы [ 2 ]

4 голосов
/ 16 апреля 2019

Добавьте await и не добавляйте новые параметры в каждый цикл.

При повторном использовании параметров, как показано ниже, необходимо установить правильный Размер для параметра.

insert.Parameters.Add("@id", SqlDbType.Int);
// Note: Set length of the target column. NVarChar -1 maps to nVarchar(max) 
insert.Parameters.Add("@type", SqlDbType.NVarChar, -1);

for (int i = 0; i < 10; i++)
{
    insert.Parameters["@id"].Value = i;
    insert.Parameters["@type"].Value = "test";

    await insert.ExecuteNonQueryAsync();
}
0 голосов
/ 16 апреля 2019

Если вы можете вставлять данные непосредственно в таблицу или если вы можете создать промежуточную таблицу гораздо быстрее, вместо этого будут использоваться DataTable и bulkCopy.

Таким образом, вы сначала загрузите данные в память клиента, а затем отправите все строки в одной массовой операции на SQL Server.

Хороший учебник, как это сделать, есть:

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/single-bulk-copy-operations

Метод использования: WriteToServer(DataTable)

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlbulkcopy.writetoserver

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