将 datagridview 行插入 SQL table
Insert datagridview rows to SQL table
我正在尝试使用存储过程将行从 datagridview 保存到 SQL 服务器 table。
这是 C# 代码:
SqlConnection con = new SqlConnection("server= localhost;Database = Vehiculum ;integrated Security = true");
con.Open();
SqlCommand cmd = new SqlCommand("inserproducts", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlConnection con = new SqlConnection("server= localhost;Database = Vehiculum ;integrated Security = true");
con.Open();
SqlCommand cmd = new SqlCommand("insertservisi", con);
cmd.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < dtgservisimi.Rows.Count; i++)
{
cmd.Parameters.AddWithValue("@kategoria", dtgservisimi.Rows[i].Cells[0].Value);
cmd.Parameters.AddWithValue("@servisimi", dtgservisimi.Rows[i].Cells[1].Value);
cmd.Parameters.AddWithValue("@barkodi", dtgservisimi.Rows[i].Cells[2].Value);
cmd.Parameters.AddWithValue("@emertimi", dtgservisimi.Rows[i].Cells[3].Value);
cmd.Parameters.AddWithValue("@sasia", dtgservisimi.Rows[i].Cells[4].Value);
cmd.Parameters.AddWithValue("@garancioni", dtgservisimi.Rows[i].Cells[5].Value);
cmd.Parameters.AddWithValue("@emri", txtemri.Text);
cmd.Parameters.AddWithValue("@mbiemri", txtmbiemri.Text);
cmd.Parameters.AddWithValue("@telefoniI", txttelefoniI.Text);
cmd.Parameters.AddWithValue("@telefoniII", txttelefoniII.Text);
cmd.Parameters.AddWithValue("@adresa", txtadresa.Text);
cmd.Parameters.AddWithValue("@komuna", cmbkomuna.Text);
cmd.Parameters.AddWithValue("@prodhuesi", cmbprodhuesi.Text);
cmd.Parameters.AddWithValue("@modeli", cmbmodeli.Text);
cmd.Parameters.AddWithValue("@motorri", cmbmotori.Text);
cmd.Parameters.AddWithValue("@shasia", txtshasia.Text);
cmd.Parameters.AddWithValue("@tabela", txttabela.Text);
cmd.Parameters.AddWithValue("@viti", txtviti.Text);
cmd.Parameters.AddWithValue("@shenime", txtshenime.Text);
cmd.Parameters.AddWithValue("@data", DateTime.Now);
cmd.Parameters.AddWithValue("@punetori", lbluser.Text);
}
cmd.ExecuteNonQuery();
con.Close();
和存储过程代码:
使用[载具]
开始
ALTER procedure [dbo].[insertservisi]
@emri varchar(50) = null,
@mbiemri varchar (50) =null,
@telefoniI varchar (50) = null,
@telefoniII varchar (50) = null,
@adresa varchar (100) = null,
@komuna varchar (50) = null,
@prodhuesi varchar (50) = null,
@modeli varchar (50) = null,
@motorri varchar (50) = null,
@shasia varchar (50) = null,
@tabela varchar (50) = null,
@viti varchar (50) = null,
@kategoria varchar (100) = null,
@servisimi varchar (20) = null,
@barkodi int = null,
@emertimi varchar (max) = null,
@sasia int = null,
@garancioni varchar(200) = null,
@shenime varchar(max) = null,
@data datetime = null,
@punetori varchar(100) = null
as
declare @id int;
INSERT INTO
Servisimi_info
(Emri,
Mbiemri,
TelefoniI,
TelefoniII,
Adresa,
Komuna,
Prodhuesi,
Modeli,
Motorri,
Shasia,
Tabela,
Viti,
Data_servisimit,
Punetori)
VALUES (@emri,
@mbiemri,
@telefoniI,
@telefoniII,
@adresa,
@komuna,
@prodhuesi,
@modeli,
@motorri,
@shasia,
@tabela,
@viti,
@data,
@punetori)
set @id = scope_identity();
INSERT INTO Servisimi_produkti
(Kategoria,
Servisimi,
Barkodi,
Emertimi,
Sasia,
Garancion,
Shenime,
Id_servisimi)
VALUES
(@kategoria,
@servisimi,
@barkodi,
@emertimi,
@sasia,
@garancioni,
@shenime,
@id)
但是我得到这个错误
Procedure or function has too many arguments specified
I am trying to store data data in two tables. The second table has a foreign key connected to primary key(first table). Also datagridview has multiple rows that has to be stored in second table with the same id(from table 1)
Where is the thing I missed or did wrong?
在您的过程中,您明确指定的列多于您传递的值。
你的代码不是很一致.....
您的 INSERT INTO
列表中有 7 个参数,但 VALUES
集合只定义了 6 值.....
INSERT INTO products (Category, Model, Barcode, Name, Qty, Warranty, Shenime)
VALUES (@category, @model, @barcode, @name, @qty, @warranty)
您的 C# 代码甚至定义并设置了 10 参数 - 最后 3 个从未在您的存储过程中使用过(至少看起来不是那样, 来自您发布的片段):
// never used in the stored procedure, it seems
cmd.Parameters.AddWithValue("@id_fatura", txtid.Text);
cmd.Parameters.AddWithValue("@data", DateTime.Now);
cmd.Parameters.AddWithValue("@punetori", lbluser.Text);
您的代码中有 错字 - 在 C# 代码中,您的 错误 拼写@waranty
参数 - 只有一个 "r":
cmd.Parameters.AddWithValue("@waranty", warranty);
*********
在存储过程中,您使用 正确的 拼写 two "r":
VALUES (@category, @model, @barcode, @name, @qty, @warranty)
*********
您需要更加注意您的代码各方中提供的拼写以及参数和值的数量。尝试使这一切一致然后看看它是否有效
使用 using 块确保您的数据库对象已关闭和处置。
不要使用 .AddWithValue
。参见 http://www.dbdelta.com/addwithvalue-is-evil/
和
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
还有一个:
https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications
这是另一个
https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html
不要在循环的每次迭代中不断添加参数。在循环之前构建一次参数集合并分配在循环中更改的值。
您正在循环后执行命令。只会输入最后一组值。
private void AddToDatabase()
{
using (SqlConnection con = new SqlConnection("server= localhost;Database = Vehiculum ;integrated Security = true"))
using (SqlCommand cmd = new SqlCommand("inserproducts", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@mbiemri", SqlDbType.VarChar, 50).Value = txtmbiemri.Text;
cmd.Parameters.Add("@telefoniI", SqlDbType.VarChar, 50).Value = txttelefoniI.Text;
cmd.Parameters.Add("@telefoniII", SqlDbType.VarChar, 50).Value = txttelefoniII.Text;
cmd.Parameters.Add("@adresa", SqlDbType.VarChar, 100).Value = txtadresa.Text;
cmd.Parameters.Add("@komuna", SqlDbType.VarChar, 50).Value = cmbkomuna.Text;
cmd.Parameters.Add("@prodhuesi", SqlDbType.VarChar, 50).Value = cmbprodhuesi.Text;
cmd.Parameters.Add("@modeli", SqlDbType.VarChar, 50).Value = cmbmodeli.Text;
cmd.Parameters.Add("@motorri", SqlDbType.VarChar, 50).Value = cmbmotori.Text;
cmd.Parameters.Add("@shasia", SqlDbType.VarChar, 50).Value = txtshasia.Text;
cmd.Parameters.Add("@tabela", SqlDbType.VarChar, 50).Value = txttabela.Text;
cmd.Parameters.Add("@viti", SqlDbType.VarChar, 50).Value = txtviti.Text;
cmd.Parameters.Add("@kategoria", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@servisimi", SqlDbType.VarChar, 20);
cmd.Parameters.Add("@barkodi", SqlDbType.Int);
cmd.Parameters.Add("@emertimi", SqlDbType.VarChar, -1).Value = txtemri.Text; ;
cmd.Parameters.Add("@sasia", SqlDbType.Int);
cmd.Parameters.Add("@garancioni", SqlDbType.VarChar, 200);
cmd.Parameters.Add("@shenime", SqlDbType.VarChar, -1).Value = txtshenime.Text;
cmd.Parameters.Add("@data", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@punetori", SqlDbType.VarChar, 100).Value = lbluser.Text;
con.Open();
for (int i = 0; i < dtgservisimi.Rows.Count -1; i++)
{
cmd.Parameters["@servisimi"].Value = dtgservisimi.Rows[i].Cells[1].Value;
cmd.Parameters["@barkodi"].Value = (int)dtgservisimi.Rows[i].Cells[2].Value;
cmd.Parameters["@emertimi"].Value = dtgservisimi.Rows[i].Cells[3].Value;
cmd.Parameters["@sasia"].Value = (int)dtgservisimi.Rows[i].Cells[4].Value;
cmd.Parameters["@garancioni"].Value = dtgservisimi.Rows[i].Cells[5].Value;
cmd.ExecuteNonQuery();
}
}
}
我正在尝试使用存储过程将行从 datagridview 保存到 SQL 服务器 table。
这是 C# 代码:
SqlConnection con = new SqlConnection("server= localhost;Database = Vehiculum ;integrated Security = true");
con.Open();
SqlCommand cmd = new SqlCommand("inserproducts", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlConnection con = new SqlConnection("server= localhost;Database = Vehiculum ;integrated Security = true");
con.Open();
SqlCommand cmd = new SqlCommand("insertservisi", con);
cmd.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < dtgservisimi.Rows.Count; i++)
{
cmd.Parameters.AddWithValue("@kategoria", dtgservisimi.Rows[i].Cells[0].Value);
cmd.Parameters.AddWithValue("@servisimi", dtgservisimi.Rows[i].Cells[1].Value);
cmd.Parameters.AddWithValue("@barkodi", dtgservisimi.Rows[i].Cells[2].Value);
cmd.Parameters.AddWithValue("@emertimi", dtgservisimi.Rows[i].Cells[3].Value);
cmd.Parameters.AddWithValue("@sasia", dtgservisimi.Rows[i].Cells[4].Value);
cmd.Parameters.AddWithValue("@garancioni", dtgservisimi.Rows[i].Cells[5].Value);
cmd.Parameters.AddWithValue("@emri", txtemri.Text);
cmd.Parameters.AddWithValue("@mbiemri", txtmbiemri.Text);
cmd.Parameters.AddWithValue("@telefoniI", txttelefoniI.Text);
cmd.Parameters.AddWithValue("@telefoniII", txttelefoniII.Text);
cmd.Parameters.AddWithValue("@adresa", txtadresa.Text);
cmd.Parameters.AddWithValue("@komuna", cmbkomuna.Text);
cmd.Parameters.AddWithValue("@prodhuesi", cmbprodhuesi.Text);
cmd.Parameters.AddWithValue("@modeli", cmbmodeli.Text);
cmd.Parameters.AddWithValue("@motorri", cmbmotori.Text);
cmd.Parameters.AddWithValue("@shasia", txtshasia.Text);
cmd.Parameters.AddWithValue("@tabela", txttabela.Text);
cmd.Parameters.AddWithValue("@viti", txtviti.Text);
cmd.Parameters.AddWithValue("@shenime", txtshenime.Text);
cmd.Parameters.AddWithValue("@data", DateTime.Now);
cmd.Parameters.AddWithValue("@punetori", lbluser.Text);
}
cmd.ExecuteNonQuery();
con.Close();
和存储过程代码:
使用[载具] 开始
ALTER procedure [dbo].[insertservisi]
@emri varchar(50) = null,
@mbiemri varchar (50) =null,
@telefoniI varchar (50) = null,
@telefoniII varchar (50) = null,
@adresa varchar (100) = null,
@komuna varchar (50) = null,
@prodhuesi varchar (50) = null,
@modeli varchar (50) = null,
@motorri varchar (50) = null,
@shasia varchar (50) = null,
@tabela varchar (50) = null,
@viti varchar (50) = null,
@kategoria varchar (100) = null,
@servisimi varchar (20) = null,
@barkodi int = null,
@emertimi varchar (max) = null,
@sasia int = null,
@garancioni varchar(200) = null,
@shenime varchar(max) = null,
@data datetime = null,
@punetori varchar(100) = null
as
declare @id int;
INSERT INTO
Servisimi_info
(Emri,
Mbiemri,
TelefoniI,
TelefoniII,
Adresa,
Komuna,
Prodhuesi,
Modeli,
Motorri,
Shasia,
Tabela,
Viti,
Data_servisimit,
Punetori)
VALUES (@emri,
@mbiemri,
@telefoniI,
@telefoniII,
@adresa,
@komuna,
@prodhuesi,
@modeli,
@motorri,
@shasia,
@tabela,
@viti,
@data,
@punetori)
set @id = scope_identity();
INSERT INTO Servisimi_produkti
(Kategoria,
Servisimi,
Barkodi,
Emertimi,
Sasia,
Garancion,
Shenime,
Id_servisimi)
VALUES
(@kategoria,
@servisimi,
@barkodi,
@emertimi,
@sasia,
@garancioni,
@shenime,
@id)
但是我得到这个错误
Procedure or function has too many arguments specified I am trying to store data data in two tables. The second table has a foreign key connected to primary key(first table). Also datagridview has multiple rows that has to be stored in second table with the same id(from table 1) Where is the thing I missed or did wrong?
在您的过程中,您明确指定的列多于您传递的值。
你的代码不是很一致.....
您的
INSERT INTO
列表中有 7 个参数,但VALUES
集合只定义了 6 值.....INSERT INTO products (Category, Model, Barcode, Name, Qty, Warranty, Shenime) VALUES (@category, @model, @barcode, @name, @qty, @warranty)
您的 C# 代码甚至定义并设置了 10 参数 - 最后 3 个从未在您的存储过程中使用过(至少看起来不是那样, 来自您发布的片段):
// never used in the stored procedure, it seems cmd.Parameters.AddWithValue("@id_fatura", txtid.Text); cmd.Parameters.AddWithValue("@data", DateTime.Now); cmd.Parameters.AddWithValue("@punetori", lbluser.Text);
您的代码中有 错字 - 在 C# 代码中,您的 错误 拼写
@waranty
参数 - 只有一个 "r":cmd.Parameters.AddWithValue("@waranty", warranty); *********
在存储过程中,您使用 正确的 拼写 two "r":
VALUES (@category, @model, @barcode, @name, @qty, @warranty) *********
您需要更加注意您的代码各方中提供的拼写以及参数和值的数量。尝试使这一切一致然后看看它是否有效
使用 using 块确保您的数据库对象已关闭和处置。
不要使用 .AddWithValue
。参见 http://www.dbdelta.com/addwithvalue-is-evil/
和
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
还有一个:
https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications
这是另一个
https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html
不要在循环的每次迭代中不断添加参数。在循环之前构建一次参数集合并分配在循环中更改的值。
您正在循环后执行命令。只会输入最后一组值。
private void AddToDatabase()
{
using (SqlConnection con = new SqlConnection("server= localhost;Database = Vehiculum ;integrated Security = true"))
using (SqlCommand cmd = new SqlCommand("inserproducts", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@mbiemri", SqlDbType.VarChar, 50).Value = txtmbiemri.Text;
cmd.Parameters.Add("@telefoniI", SqlDbType.VarChar, 50).Value = txttelefoniI.Text;
cmd.Parameters.Add("@telefoniII", SqlDbType.VarChar, 50).Value = txttelefoniII.Text;
cmd.Parameters.Add("@adresa", SqlDbType.VarChar, 100).Value = txtadresa.Text;
cmd.Parameters.Add("@komuna", SqlDbType.VarChar, 50).Value = cmbkomuna.Text;
cmd.Parameters.Add("@prodhuesi", SqlDbType.VarChar, 50).Value = cmbprodhuesi.Text;
cmd.Parameters.Add("@modeli", SqlDbType.VarChar, 50).Value = cmbmodeli.Text;
cmd.Parameters.Add("@motorri", SqlDbType.VarChar, 50).Value = cmbmotori.Text;
cmd.Parameters.Add("@shasia", SqlDbType.VarChar, 50).Value = txtshasia.Text;
cmd.Parameters.Add("@tabela", SqlDbType.VarChar, 50).Value = txttabela.Text;
cmd.Parameters.Add("@viti", SqlDbType.VarChar, 50).Value = txtviti.Text;
cmd.Parameters.Add("@kategoria", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@servisimi", SqlDbType.VarChar, 20);
cmd.Parameters.Add("@barkodi", SqlDbType.Int);
cmd.Parameters.Add("@emertimi", SqlDbType.VarChar, -1).Value = txtemri.Text; ;
cmd.Parameters.Add("@sasia", SqlDbType.Int);
cmd.Parameters.Add("@garancioni", SqlDbType.VarChar, 200);
cmd.Parameters.Add("@shenime", SqlDbType.VarChar, -1).Value = txtshenime.Text;
cmd.Parameters.Add("@data", SqlDbType.DateTime).Value = DateTime.Now;
cmd.Parameters.Add("@punetori", SqlDbType.VarChar, 100).Value = lbluser.Text;
con.Open();
for (int i = 0; i < dtgservisimi.Rows.Count -1; i++)
{
cmd.Parameters["@servisimi"].Value = dtgservisimi.Rows[i].Cells[1].Value;
cmd.Parameters["@barkodi"].Value = (int)dtgservisimi.Rows[i].Cells[2].Value;
cmd.Parameters["@emertimi"].Value = dtgservisimi.Rows[i].Cells[3].Value;
cmd.Parameters["@sasia"].Value = (int)dtgservisimi.Rows[i].Cells[4].Value;
cmd.Parameters["@garancioni"].Value = dtgservisimi.Rows[i].Cells[5].Value;
cmd.ExecuteNonQuery();
}
}
}