将 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?

在您的过程中,您明确指定的列多于您传递的值。

你的代码不是很一致.....

  1. 您的 INSERT INTO 列表中有 7 个参数,但 VALUES 集合只定义了 6 值.....

    INSERT INTO products (Category, Model, Barcode, Name, Qty, Warranty, Shenime)
    VALUES (@category, @model, @barcode, @name, @qty, @warranty)
    
  2. 您的 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);
    
  3. 您的代码中有 错字 - 在 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();
            }
        }
    }