附加信息:过程或函数insertimi指定的参数太多(C#SQL插入过程)

附加信息:过程或函数insertimi指定的参数太多(C#SQL插入过程),c#,sql,C#,Sql,我正在使用一个小型POS应用程序,但在将数据从win表单插入SQL数据库的过程中遇到了问题。更清楚地说,我得到了这种错误“附加信息:过程或函数insertimi指定的参数太多。” . 我用来插入数据的代码如下所示: conn.Open(); SqlCommand cmd = new SqlCommand("insertimi", conn); cmd.CommandType = CommandType.Sto

我正在使用一个小型POS应用程序,但在将数据从win表单插入SQL数据库的过程中遇到了问题。更清楚地说,我得到了这种错误“附加信息:过程或函数insertimi指定的参数太多。” . 我用来插入数据的代码如下所示:

          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)
我应该在C#代码中更改什么来修复错误?可能是我如何从datagridview获取数据的循环代码。如果有人能帮我解决这个问题


谢谢大家

由于foreach循环,传递给存储过程的参数太多了。您可以在foreach循环中使用此逻辑

foreach(dtgprofatura.Rows中的DataGridViewRow行)
{
如果(!row.IsNewRow)
{
cmd.Parameters.Clear();
Add(新的SqlParameter(“@shenime”,txtshenime.Text));
Add(新的SqlParameter(“@data”,DateTime.Now));
Add(新的SqlParameter(“@kasieri”,lbluser.Text));
Add(新的SqlParameter(“@emri_sh”,lblshitesiemri.Text));
Add(新的SqlParameter(“@niptsh”,int.Parse(lblshitesinipt.Text));
Add(新的SqlParameter(“@adresash”,lbladresashitesi.Text));
Add(新的SqlParameter(“@telefonish”,lblshitesitelefon.Text));
cmd.Parameters.Add(新的SqlParameter(“@emri_b”,cmbbleresi.Text));
Add(新的SqlParameter(“@niptb”,lblbleresinipt.Text));
Add(新的SqlParameter(“@adresab”,lblbleresiadresa.Text));
Add(新的SqlParameter(“@telefonib”,lblbleresitelefoni.Text));
cmd.Parameters.Add(新的SqlParameter(“@nentotali”,lblnentotali.Text));
cmd.Parameters.Add(新的SqlParameter(“@vleratvsh”,lblvleratvsh.Text));
Add(新的SqlParameter(“@zbritja”,txtzbritja.Text));
Add(新的SqlParameter(“@totali”,lbltotali.Text));
cmd.Parameters.Add(新的SqlParameter(“@barkodi”,row.Cells[0].Value));
cmd.Parameters.Add(新的SqlParameter(“@emertimi”,row.Cells[1].Value));
cmd.Parameters.Add(新的SqlParameter(“@sasia”,row.Cells[3].Value));
cmd.Parameters.Add(新的SqlParameter(@cmimi),row.Cells[2].Value));
cmd.Parameters.Add(新的SqlParameter(“@totaliPCS”,row.Cells[5].Value));
cmd.Parameters.Add(新的SqlParameter(“@tvsh”,row.Cells[4].Value));
cmd.Parameters.Add(新的SqlParameter(“@vleratvshpcs”,row.Cells[7].Value));
cmd.Parameters.Add(新的SqlParameter(“@patvshpcs”,row.Cells[6].Value));
cmd.ExecuteNonQuery();
}
}
您不需要每次都添加参数。您可以在foreach循环开始之前将它们映射一次到command,并在foreach循环中每次分配它们

cmd.Parameters.Add(“@barkodi”,SqlDbType.Int);
.
.
.
foreach(dtgprofatura.Rows中的DataGridViewRow行)
{
如果(!row.IsNewRow)
{
cmd.Parameters[“@ID”].Value=row.Cells[0].Value;
.
.
.
cmd.ExecuteNonQuery();
}
}

错误消息很清楚,参数太多,但实际问题首先是使用此存储过程。14个参数太多了。把它们混在一起很容易。为什么要为此插入使用存储过程?首先,数据不是存储在网格中,而是存储在集合、对象和数据表中。将数据绑定到网格,并管理数据,而不是网格行。如果使用DataTables或Dataset,则可能用于加载数据的DbDataAdapter也可以执行更新和插入,如果要执行此操作,还可以使用AddWithValue。forloop中存在的问题。如果它始终是新行,它将继续添加这些参数。您知道可以为现有参数设置新值吗?不需要每次都添加它们
cmd.Parameters[“@shenime”].Value=txtshenime.Text@CaiusJard,是的。我知道。我只是重新格式化了代码以澄清他的问题。我会更新我的答案