附加信息:过程或函数insertimi指定的参数太多(C#SQL插入过程)
我正在使用一个小型POS应用程序,但在将数据从win表单插入SQL数据库的过程中遇到了问题。更清楚地说,我得到了这种错误“附加信息:过程或函数insertimi指定的参数太多。” . 我用来插入数据的代码如下所示:附加信息:过程或函数insertimi指定的参数太多(C#SQL插入过程),c#,sql,C#,Sql,我正在使用一个小型POS应用程序,但在将数据从win表单插入SQL数据库的过程中遇到了问题。更清楚地说,我得到了这种错误“附加信息:过程或函数insertimi指定的参数太多。” . 我用来插入数据的代码如下所示: conn.Open(); SqlCommand cmd = new SqlCommand("insertimi", conn); cmd.CommandType = CommandType.Sto
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,是的。我知道。我只是重新格式化了代码以澄清他的问题。我会更新我的答案