powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как очистить параметры для хранимой процедуры?
10 сообщений из 10, страница 1 из 1
Как очистить параметры для хранимой процедуры?
    #39840299
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Есть код ниже, который в цикле вызывает хранимую процедуру с параметрами, которая в свою очередь вставляет запись в таблицу. В первом цикле она отрабатывает нормально, на второй записи выбрасывает ошибку:
Код: xml
1.
System.Data.SqlClient.SqlException: 'Procedure or function uspInsertAccount has too many arguments specified.'



Я так понимаю надо как-то сбросить или обнулить параметры с первого запуска. А как это можно сделать?

Спасибо.


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
private void InsertAccounts()
        {
            var connectionString = ConfigurationManager.AppSettings["ConnectionString"];
            string insertAccountSQL = "dbo.uspInsertAccount";
            SqlConnection con = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(insertAccountSQL, con);
            cmd.CommandType = CommandType.StoredProcedure;

            List<Xero.Api.Core.Model.Account> accounts = Api.Accounts.Find().ToList();
            int count = accounts.Count;
            int total = count;
            //int page = 2;
            while (count >= 100)
            {
                accounts = Api.Accounts.Find().ToList();
                //saveAccounts(filename, accounts);
                //(@id uniqueidentifier,@code bigint,@name varchar(128),@status varchar(16),@type varchar(32),@taxtype varchar(32),@description varchar(512),@class varchar(32),@enablepaymentstoaccount varchar(10),@reportingcode varchar(32),
                //@showinexpenseclaims varchar(10),@bankaccounttype varchar(32),@reportingcodename varchar(128),@hasattachements varchar(10),@updateddateutc datetime)
                foreach (Xero.Api.Core.Model.Account account in accounts)
                {
                    //file.WriteLine(convertAccountsToString(account));
                    SqlParameter param;
                    param = cmd.Parameters.Add("@id", SqlDbType.UniqueIdentifier);
                    param.Value = account.Id;
                    param = cmd.Parameters.Add("@code", SqlDbType.BigInt);
                    param.Value = account.Code;
                    param = cmd.Parameters.Add("@name", SqlDbType.VarChar, 128);
                    param.Value = account.Name;
                    param = cmd.Parameters.Add("@status", SqlDbType.VarChar, 16);
                    param.Value = account.Status;
                    param = cmd.Parameters.Add("@type", SqlDbType.VarChar, 32);
                    param.Value = account.Type;
                    param = cmd.Parameters.Add("@taxtype", SqlDbType.VarChar, 32);
                    param.Value = account.TaxType;
                    param = cmd.Parameters.Add("@description", SqlDbType.VarChar, 512);
                    param.Value = account.Description;
                    param = cmd.Parameters.Add("@class", SqlDbType.VarChar, 32);
                    param.Value = account.Class;
                    param = cmd.Parameters.Add("@enablepaymentstoaccount", SqlDbType.VarChar, 10);
                    param.Value = account.EnablePaymentsToAccount;
                    param = cmd.Parameters.Add("@reportingcode", SqlDbType.VarChar, 32);
                    param.Value = account.ReportingCode;
                    param = cmd.Parameters.Add("@showinexpenseclaims", SqlDbType.VarChar, 10);
                    param.Value = account.ShowInExpenseClaims;
                    param = cmd.Parameters.Add("@bankaccounttype", SqlDbType.VarChar, 32);
                    param.Value = account.BankAccountType;
                    param = cmd.Parameters.Add("@reportingcodename", SqlDbType.VarChar, 128);
                    param.Value = account.ReportingCodeName;
                    param = cmd.Parameters.Add("@hasattachements", SqlDbType.VarChar, 10);
                    param.Value = account.HasAttachments;
                    param = cmd.Parameters.Add("@updateddateutc", SqlDbType.DateTime);
                    param.Value = account.UpdatedDateUTC;
                    //    return Account.Id + "," + Account.Code + "," + Account.Name + "," + Account.Status + "," + Account.Type + "," + Account.TaxType + ",\"" + Account.Description + "\"," + Account.Class +
                    //"," + Account.EnablePaymentsToAccount + "," + Account.ReportingCode + "," + Account.ShowInExpenseClaims + ","
                    //         + Account.BankAccountType + "," + Account.ReportingCode + ",\"" +
                    //         Account.ReportingCodeName + "\"," +
                    //         Account.HasAttachments + "," + Account.UpdatedDateUTC;
                    con.Open();
                    //int rowsAffected = 
                    _ = cmd.ExecuteNonQuery();
                    con.Close();
                }


                count = accounts.Count;
                total += count;
            }
        }
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840305
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно. Просто Parameters.Clear. Или можно (может даже лучше) пересоздать команду.
А con.Open(); и con.Close(); внутри цикла - лишнее. Открой до начала цикла и закрой после окончания. Да и вообще, на IDisposable надо использовать using!
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840319
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProКонечно. Просто Parameters.Clear. Или можно (может даже лучше) пересоздать команду.
А con.Open(); и con.Close(); внутри цикла - лишнее. Открой до начала цикла и закрой после окончания. Да и вообще, на IDisposable надо использовать using!

Я поставил Parameters.Clear, выходит ошибка:
"The name 'Parameters' does not exist in the current context"

на IDisposable надо использовать using!
А вот про это можно поподробней? Как это написать?
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840328
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

cmd.Parameters.Clear();
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840370
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то вместо того, чтобы в цикле на каждом обороте делать

Код: c#
1.
2.
3.
   con.Open();
    _ = cmd.ExecuteNonQuery();
    con.Close();



можно до цикла сделать препаре и потом уже менять параметры и экзэкуте
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840382
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинВообще-то вместо того, чтобы в цикле на каждом обороте делать

Код: c#
1.
2.
3.
   con.Open();
    _ = cmd.ExecuteNonQuery();
    con.Close();



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

А можно поподробнее, как это написать?
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840447
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

подробнее в книжках и онлайн курсах
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840556
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинВообще-то вместо того, чтобы в цикле на каждом обороте делать

Код: c#
1.
2.
3.
   con.Open();
    _ = cmd.ExecuteNonQuery();
    con.Close();



можно до цикла сделать препаре и потом уже менять параметры и экзэкуте
препаре нафик не нужен.
и менять нужно не параметры, их value
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840714
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

подытоживая всё выше сказанное:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
private void InsertAccounts()
{
    var connectionString = ConfigurationManager.AppSettings["ConnectionString"];
    string insertAccountSQL = "dbo.uspInsertAccount";

    using (var con = new SqlConnection(connectionString))
    using (var cmd = new SqlCommand(insertAccountSQL, con))
    {
        con.Open();
        cmd.CommandType = CommandType.StoredProcedure;

        var accounts = Api.Accounts.Find().ToList();
        int count = accounts.Count;
        int total = count;

        var paramId = cmd.Parameters.Add("@id", SqlDbType.UniqueIdentifier);
        var paramCode = cmd.Parameters.Add("@code", SqlDbType.BigInt);
        //...

        while (count >= 100)
        {
            accounts = Api.Accounts.Find().ToList();

            foreach (var account in accounts)
            {
                paramId.Value = account.Id;
                paramCode.Value = account.Code;
                //...

                _ = cmd.ExecuteNonQuery();
            }

            count = accounts.Count;
            total += count;
        }
    }
}
...
Рейтинг: 0 / 0
Как очистить параметры для хранимой процедуры?
    #39840838
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВРолг ХупинВообще-то вместо того, чтобы в цикле на каждом обороте делать

Код: c#
1.
2.
3.
   con.Open();
    _ = cmd.ExecuteNonQuery();
    con.Close();



можно до цикла сделать препаре и потом уже менять параметры и экзэкуте
препаре нафик не нужен.
и менять нужно не параметры, их value

да, значения, естествено
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как очистить параметры для хранимой процедуры?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]