Member 14947303 Ответов: 2

Дополнительная информация: процедура или функция insertimi имеет слишком много заданных аргументов( процесс вставки C# SQL)


Я работаю с небольшим POS-приложением, но у меня возникла проблема при вставке данных из формы win в базу данных SQL . Чтобы быть более ясным, я получаю такую ошибку "дополнительная информация: процедура или функция insertimi имеет слишком много заданных аргументов."

Что я должен изменить в своем коде C#, чтобы исправить ошибку? Может быть, код цикла, как я получаю данные из datagridview. Если бы кто-нибудь мог мне помочь, насчет этой проблемы.

Спасибо вам всем

Что я уже пробовал:

    conn.Open();
    SqlCommand cmd = new SqlCommand("insertimi", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Clear();
    cmd.Parameters.Add(new SqlParameter("@shenime", txtshenime.Text));
    cmd.Parameters.Add(new SqlParameter("@data", DateTime.Now));
    cmd.Parameters.Add(new SqlParameter("@kasieri", lbluser.Text));
    cmd.Parameters.Add(new SqlParameter("@emri_sh", lblshitesiemri.Text));
    cmd.Parameters.Add(new SqlParameter("@niptsh", int.Parse(lblshitesinipt.Text)));
    cmd.Parameters.Add(new SqlParameter("@adresash", lbladresashitesi.Text));
    cmd.Parameters.Add(new SqlParameter("@telefonish", lblshitesitelefon.Text));
    cmd.Parameters.Add(new SqlParameter("@emri_b", cmbbleresi.Text));
    cmd.Parameters.Add(new SqlParameter("@niptb", lblbleresinipt.Text));
    cmd.Parameters.Add(new SqlParameter("@adresab", lblbleresiadresa.Text));
    cmd.Parameters.Add(new SqlParameter("@telefonib", lblbleresitelefoni.Text));
    cmd.Parameters.Add(new SqlParameter("@nentotali", lblnentotali.Text));
    cmd.Parameters.Add(new SqlParameter("@vleratvsh", lblvleratvsh.Text));
    cmd.Parameters.Add(new SqlParameter("@zbritja", txtzbritja.Text));
    cmd.Parameters.Add(new SqlParameter("@totali", lbltotali.Text));

    foreach (DataGridViewRow row in dtgprofatura.Rows)
    {
        if (!row.IsNewRow)
        {

            cmd.Parameters.Add(new SqlParameter("@barkodi", row.Cells[0].Value));
            cmd.Parameters.Add(new SqlParameter("@emertimi", row.Cells[1].Value));
            cmd.Parameters.Add(new SqlParameter("@sasia", row.Cells[3].Value));
            cmd.Parameters.Add(new SqlParameter("@cmimi", row.Cells[2].Value));
            cmd.Parameters.Add(new SqlParameter("@totaliPCS", row.Cells[5].Value));
            cmd.Parameters.Add(new SqlParameter("@tvsh", row.Cells[4].Value));
            cmd.Parameters.Add(new SqlParameter("@vleratvshpcs", row.Cells[7].Value));
            cmd.Parameters.Add(new SqlParameter("@patvshpcs", row.Cells[6].Value));

        }
    }
    cmd.ExecuteNonQuery();                    
    conn.Close();
    clear();
    kRIJOToolStripMenuItem.PerformClick();
}
И код SP:
 ALTER procedure [dbo].[insertimi]

@shenime varchar(max),
@data datetime,
@kasieri varchar(50),
@emri_sh varchar(50),
@niptsh varchar(50),
@adresash varchar(100),
@telefonish varchar(50),
@emri_b varchar(50),
@niptb varchar(50),
@adresab varchar(100),
@telefonib varchar(50),
@nentotali float,
@zbritja float,
@vleratvsh float,
@totali float,
@barkodi int,
@emertimi varchar(200),
@sasia int, 
@cmimi float,
@totaliPCS float,
@tvsh float,
@vleratvshpcs float,
@patvshpcs float
as


declare @lastId int;
insert into tblprofatura (Shenime,Data,Kasieri,Emri_sh,NIPT_sh,Adresa_sh,Telefoni_sh,Emri_b,NIPT_b,Adresa_b,Telefoni_b,Nentotali,Zbritja,VleraTVSH,Totali)


values(@shenime,@data,@kasieri,@emri_sh,@niptsh,@adresash,@telefonish,@emri_b,@niptb,@adresab,@telefonib,@nentotali,@zbritja,@vleratvsh,@totali)
set @lastId = SCOPE_IDENTITY();


insert into tblproofatura_details(NR_F,Barkodi,Emertimi,Cmimi,Sasia,TVSH,Totali,PaTVSHpcs,VleraTVSHpcs)
values (@lastId,@barkodi,@emertimi,@cmimi,@sasia,@tvsh,@totaliPCS,@patvshpcs,@vleratvsh)

2 Ответов

Рейтинг:
2

OriginalGriff

Если вы не понимаете сообщение об ошибке, погуглите его: процедура или функция insertimi имеет слишком много аргументов, указанных - поиск Google[^]
Маловероятно, что вы первый человек, который столкнулся с этой проблемой, и самое быстрое решение-это поиск других и то, как они ее исправили.

В этом случае Google хорошо помогает: вы получаете ошибку, когда предоставляете больше параметров, чем определено для принятия хранимой процедурой: вы предоставляете 15 плюс дополнительные 8 для каждой отдельной строки в DataGridView, в то время как SP определяется как принимающий 23. Если в DGV есть более одной строки, он потерпит неудачу.

Вы должны думать о том, что именно вы пытаетесь сделать: вы не можете пройти несколько строк, как это!


Member 14947303

Но как вставить данные из datagridview в базу данных SQL другим способом? Я попробовал цикл для вставки данных из datagridview, который datagridview может иметь более одной строки. Я не могу вставить по-другому, просто зацикливая каждую строку

OriginalGriff

Зацикливайтесь на строках или используйте DataAdapter:
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/modifying-data-with-stored-procedures

Рейтинг:
2

Richard Deeming

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

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

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

SqlParameter pBarkodi = cmd.Parameters.Add("@barkodi", SqlDbType.???);
SqlParameter pEmertimi = cmd.Parameters.Add("@emertimi", SqlDbType.???);
// Repeat for other parameters...

foreach (DataGridViewRow row in dtgprofatura.Rows)
{
    if (!row.IsNewRow)
    {
        pBarkodi.Value = row.Cells[0].Value;
        pEmerimi.Value = row.Cells[1].Value;
        // Set for other parameters...
        cmd.ExecuteNonQuery();
    }
}