繁体   English   中英

从Datagridview C#在Sql Server Datable中插入数据

[英]Insert data in Sql Server datable from Datagridview c#

我在从datagridview的datatable中插入数据时遇到问题,这是我的代码:

SqlConnection con1 = new SqlConnection();
con1.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\GestStock.mdf;Integrated Security=True;User Instance=True";
con1.Open();
string insertcmd = "INSERT INTO [Article] (CodeArticle,LibelleFr,LibelleAr,IdCategorie,InfomationsDetaille,Quantite,StockActuel,StockMinimum,PrixAchat,DateAchat,NumeroFacture)" +
                     "VALUES(@CodeArticle1,@LibelleFr1,@LibelleAr1,@IdCategorie1 ,@InfomationsDetaille1,@Quantite1,@StockActuel1,@StockMinimum1,@PrixAchat1,@DateAchat1,@NumeroFacture1)";
using (SqlCommand cmd = new SqlCommand(insertcmd,con1))
{
  cmd.Parameters.Add("@CodeArticle1", SqlDbType.NVarChar);
  cmd.Parameters.Add("@LibelleFr1",SqlDbType.NVarChar);
  cmd.Parameters.Add("@LibelleAr1",SqlDbType.NVarChar);
  cmd.Parameters.Add("@IdCategorie1",SqlDbType.Int);
  cmd.Parameters.Add("@InfomationsDetaille1",SqlDbType.NVarChar);
  cmd.Parameters.Add("@Quantite1",SqlDbType.Int);
  cmd.Parameters.Add("@StockActuel1",SqlDbType.Int);
  cmd.Parameters.Add("@StockMinimum1",SqlDbType.Int);
  cmd.Parameters.Add("@PrixAchat1",SqlDbType.Int);
  cmd.Parameters.Add("@DateAchat1",SqlDbType.Date);
  cmd.Parameters.Add("@NumeroFacture1",SqlDbType.NVarChar);
  for(int i = 0; i < dataGridView2.Rows.Count; i++)
   {
      cmd.Parameters["@CodeArticle1"].Value= dataGridView2.Rows[i].Cells["codeArticleDataGridViewTextBoxColumn"].Value;
      cmd.Parameters["@LibelleFr1"].Value= dataGridView2.Rows[i].Cells["libelleFrDataGridViewTextBoxColumn"].Value;
      cmd.Parameters["@LibelleAr1"].Value= dataGridView2.Rows[i].Cells["libelleArDataGridViewTextBoxtColumn"].Value;
      cmd.Parameters["@IdCategorie1"].Value= dataGridView2.Rows[i].Cells["idCategorieDataGridViewTexBoxColumn"].Value;
      cmd.Parameters["@InfomationsDetaille1"].Value= dataGridView2.Rows[i].Cells["InfomationsDetailleDataGridViewTextBoxColumn"].Value;
      cmd.Parameters["@Quantite1"].Value= dataGridView2.Rows[i].Cells["QuantiteDataGridViewTextBoxColumn"].Value;
      cmd.Parameters["@StockActuel1"].Value= dataGridView2.Rows[i].Cells["StockActuelDataGridViewTextBoxColumn"].Value;
      cmd.Parameters["@StockMinimum1"].Value= dataGridView2.Rows[i].Cells["StockMinimumDataGridViewTextBoxColumn"].Value;
      cmd.Parameters["@PrixAchat1"].Value= dataGridView2.Rows[i].Cells["PrixAchatDataGridViewTextBoxColumn"].Value;
      cmd.Parameters["@DateAchat1"].Value= dataGridView2.Rows[i].Cells["DateAchatDataGridViewTextBoxColumn"].Value;
      cmd.Parameters["@NumeroFacture1"].Value= dataGridView2.Rows[i].Cells["NumeroFactureDataGridViewTextBoxColumn"].Value;
  }
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
con1.Close();
}
MessageBox.Show("données enregistrés");          

但是我得到了这个错误信息:

参数化查询'((@ CodeArticle1 nvarchar(4000),@ LibelleFr1 nvarchar(4000),@ Libell)期望未提供参数'@ CodeArticle1'。

编辑:

我在for循环中将此条件添加到所有参数:

if (dataGridView2.Rows[i].Cells["codeArticleDataGridViewTextBoxColumn"].Value == null)
                        {
                            cmd.Parameters["@CodeArticle1"].Value = DBNull.Value;
                        }
                        else
                        {
                            cmd.Parameters["@CodeArticle1"].Value = dataGridView2.Rows[i].Cells["codeArticleDataGridViewTextBoxColumn"].Value;
                        }

我收到此错误消息:

不能将值NULL插入表'C:\\ DOCUMENTS AND SETTINGS \\ ADMINISTRATEUR \\ MES DOCUMENTS \\ GESTIONSTOCK \\ GESTIONSTOCK \\ BIN \\ DEBUG \\ GESTSTOCK.MDF.dbo.Article'列的'CodeArticle'中; 列不允许为空。 INSERT失败。 该语句已终止

有人可以解决吗?

谢谢

您的代码可能不会进入for循环,因为dataGridView2可能为空。
您的后续问题很可能是,由于仅执行最后一行,因此只会保存dataGridView2中的最后一个条目。

更新:
您不应该更改您的问题。 最好发布一个新的。

但是您的新问题是数据库问题。 您将列声明为不可为空,然后尝试插入空值。 更改您的列的数据库表定义。

它显示了我提到的后续问题。 您的dataGridView行比您想象的多。 这是“添加新”行(该行前面带有星号的行)。 这也是一行,并为您提供所有空值。 它是最后一行,因此它是写入参数的最后一个值。

试试这个代码:

SqlConnection con1 = new SqlConnection();
                con1.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\GestStock.mdf;Integrated Security=True;User Instance=True";


                string insertcmd = "INSERT INTO [Article] (CodeArticle,LibelleFr,LibelleAr,IdCategorie,InfomationsDetaille,Quantite,StockActuel,StockMinimum,PrixAchat,DateAchat,NumeroFacture)" +
                     "VALUES(@CodeArticle1,@LibelleFr1,@LibelleAr1,@IdCategorie1 ,@InfomationsDetaille1,@Quantite1,@StockActuel1,@StockMinimum1,@PrixAchat1,@DateAchat1,@NumeroFacture1)";
                SqlCommand cmd=new SqlCommand(insertcmd,con1);
                con1.Open();
                for (int i = 0; i < dataGridView2.Rows.Count - 1; i++)
                {
                    cmd.Parameters.AddWithValue("@CodeArticle1", dataGridView2.Rows[i].Cells["codeArticleDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@LibelleFr1",dataGridView2.Rows[i].Cells["libelleFrDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@LibelleAr1",dataGridView2.Rows[i].Cells["libelleArDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@IdCategorie1",dataGridView2.Rows[i].Cells["idCategorieDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@InfomationsDetaille1",dataGridView2.Rows[i].Cells["InfomationsDetailleDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@Quantite1",dataGridView2.Rows[i].Cells["QuantiteDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@StockActuel1",dataGridView2.Rows[i].Cells["StockActuelDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@StockMinimum1",dataGridView2.Rows[i].Cells["StockMinimumDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@PrixAchat1",dataGridView2.Rows[i].Cells["PrixAchatDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@DateAchat1",dataGridView2.Rows[i].Cells["DateAchatDataGridViewTextBoxColumn"].Value);
                    cmd.Parameters.AddWithValue("@NumeroFacture1",dataGridView2.Rows[i].Cells["NumeroFactureDataGridViewTextBoxColumn"].Value);
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
                MessageBox.Show("données enregistrés");
                con1.Close();

并确保在检查数据库时位于位于DataDirectory路径而不位于项目文件夹路径中的数据库中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM