【问题标题】:Inserting datagridveiw data into sql database. "there was an error parsing the query"将 datagridveiw 数据插入 sql 数据库。 “解析查询时出错”
【发布时间】:2013-04-01 15:55:45
【问题描述】:

已编辑!:

我正在编写一个程序,该程序具有将 excel 文件加载到 datagridview 中的功能。 Excel 文件包含十列的产品列表。至于现在它工作正常。文件加载正常。但是在这个加载之后,程序应该用来自 datagridview 的数据填充 SQL Server CE 数据库。因此,下次我打开此表单时,应使用数据库中的数据填充 datagridview。 (此excel加载功能是在我公司发生变化时更新产品列表)。

我在将此数据插入数据库时​​遇到问题。

我有一个错误:

解析查询时出错。 [Token line number = 1, Token line offset = 67, Token in error = Taq]

DNA 是 Excel 文件单元格中的一个单词(第 1 行第 3 列(“ITEM”)。单元格的完整内容是 AB-AB-0192/A Taq DNA Polymerase (licensed)。我认为有问题在 TAQ 之前不知何故有空格。我测试了这个:当我删除那里的空间时,问题信息从 Taq 更改为 DNA。那么我该如何避免这种情况?excel 文件中的所有列都设置为文本,SQL Server CE 数据库列是输入nvarchar

编辑!

好吧,伙计们,你让我走上了正确的道路:)

这行得通:

string strQuery = @"INSERT INTO TabelaProdukty VALUES (@VD, @ItemCode, @Item, @Qty, @Ppcur, @StandardPrice, @CeMarked, @Description, @Description2, @Edma)";
        sqlconnection.Open();
        using (System.Data.SqlServerCe.SqlCeCommand comm = new System.Data.SqlServerCe.SqlCeCommand(strQuery, sqlconnection))
        {
          comm.Parameters.Add("@VD", SqlDbType.NVarChar);
          comm.Parameters.Add("@ItemCode", SqlDbType.NVarChar);
          comm.Parameters.Add("@Item", SqlDbType.NVarChar);
          comm.Parameters.Add("@Qty", SqlDbType.NVarChar);
          comm.Parameters.Add("@Ppcur", SqlDbType.NVarChar);
          comm.Parameters.Add("@StandardPrice", SqlDbType.NVarChar);
          comm.Parameters.Add("@CeMarked", SqlDbType.NVarChar);
          comm.Parameters.Add("@Description", SqlDbType.NVarChar);
          comm.Parameters.Add("@Description2", SqlDbType.NVarChar);
          comm.Parameters.Add("@Edma", SqlDbType.NVarChar);

          for (int i = 0; i < dataGridView1.Rows.Count; i++)
          {

            comm.Parameters["@VD"].Value =  dataGridView1.Rows[i].Cells["VD"].Value;
            comm.Parameters["@ItemCode"].Value = dataGridView1.Rows[i].Cells["ItemCode"].Value;
            comm.Parameters["@Item"].Value = dataGridView1.Rows[i].Cells["ITEM"].Value;
            comm.Parameters["@Qty"].Value = dataGridView1.Rows[i].Cells["QUANTITY"].Value;
            comm.Parameters["@Ppcur"].Value = dataGridView1.Rows[i].Cells["PPCUR"].Value;
            comm.Parameters["@StandardPrice"].Value = dataGridView1.Rows[i].Cells["STANDARD_SELL_PRICE"].Value;
            comm.Parameters["@CeMarked"].Value = dataGridView1.Rows[i].Cells["CE-MARKED"].Value;
            comm.Parameters["@Description"].Value =  dataGridView1.Rows[i].Cells["ITEM_DESCRIPTION"].Value;
            comm.Parameters["@Description2"].Value = dataGridView1.Rows[i].Cells["ITEM_DESCRIPTION2"].Value;
            comm.Parameters["@Edma"].Value = dataGridView1.Rows[i].Cells["EDMA"].Value;


            comm.ExecuteNonQuery();

          }
          sqlconnection.Close();

数据库填充了正确的数据,当我重新启动程序时,数据库已经填充了。现在我只需要在添加新内容之前清除数据库。

一个问题。获取消息: 从一种数据类型转换为另一种数据类型时,数据被截断。 [函数名称(如果知道)=]

【问题讨论】:

  • 是的,您的语句中存在 大量 问题 - 您没有使用参数! 因此您对 SQL 注入持开放态度攻击。 不要将您的 SQL 语句连接在一起! 永远不要。使用参数化查询 - 总是
  • 好的,有关于如何做到这一点的链接吗?还是一个例子?
  • 数百万 个示例 - just search on Google!
  • 是这样的吗:sqladapter.InsertCommand.Parameters.Add("@ITEM", SqlDbType.VarChar) ?
  • 请改用sqladapter.InsertCommand.AddWithValue(@item, @paramvalue);,除非您也没有告诉您在插入语句中添加什么Values(

标签: c# sql database datagridview insert


【解决方案1】:
 SqlCeCommand cmd = new SqlCeCommand();
                cmd.CommandText =  "your insert statemnt (@param1.@param2,@param3) " ;


 cmd.Connection = this.sqlConnection1; //initialize your connection on page load 
                this.sqlConnection1.Open();

                  // add params 
                cmd.Parameters.Add("@param1", SqlDbType.VarChar).Value = your_control.Text; 
                cmd.Parameters.Add("@param2", SqlDbType.VarChar).Value = your_control.Text; 
                cmd.Parameters.Add("@param3", SqlDbType.VarChar).Value = your_control.Text; 

 cmd.ExecuteNonQuery();

this.sqlConnection1.Close();

您所要做的就是在声明它们之后将值从数据集中提取出来。

【讨论】:

  • 由于 OP 使用的是 SQL Server Compact,因此您需要使用 SqlCeConnectionSqlCeCommand(而不是 SqlConnectionSqlCommand.... .)
  • 这个解决方案是我所做的基础。谢谢。不得不改变它,因为在迭代过程中我添加了相同的参数,所以必须在迭代之外定义参数,然后把值定义留在那里。
  • 太好了,我只是在循环中执行参数的添加和执行部分。很高兴我能帮忙:)
【解决方案2】:

试试这样的方法 - 在您的 ADO.NET 查询中使用 parameters!并将SqlCeConnectionSqlCeCommand 等所有一次性物品放入using(...) { .... } 块中,以确保它们得到妥善处理:

private void button1_Click(object sender, EventArgs e) // wczytanie excela 
{
    OpenFileDialog openFileDialog1 = new OpenFileDialog();

    var dialogResult = openFileDialog1.ShowDialog();
    string sWybranyPlik;

    if (dialogResult  == DialogResult.OK)
    {
      sWybranyPlik = openFileDialog1.FileName;

      try
      {
         using(OleDbConnection ExcelConnection = new OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + sWybranyPlik + "';Extended Properties=Excel 8.0;"))
         {
         OleDbDataAdapter OleDBAdapter = new OleDbDataAdapter("select * from [Tabelle1$]", ExcelConnection);

         OleDBAdapter.Fill(DtSet.Tables[0]);
         dataGridView1.DataSource = DtSet.Tables[0];

             -- recommendation: always explicitly *specify* the columns of the table
             -- that you're inserting into
         string strQuery = @"INSERT INTO TabelaProdukty(col1, col2, col3,....., colN)
                     VALUES (@VD, @ItemCode, @Item, @Qty, @Ppcur, @StandardPrice, @CeMarked, @Description, @Description2, @Edma)";

                 using(sqlconnection = new SqlCeConnection("Data Source = C:\\Users\\user\\Documents\\Visual Studio 2010\\Projects\\BMGRP\\Oferty BMGRP\\Oferty BMGRP\\bin\\Debug\\BazaDanych.sdf"))
         using(SqlCeCommand comm = new SqlCeCommand(strQuery, sqlconnection))
         {
             comm.Parameters.AddWithValue("@VD", dataGridView1.Rows[i].Cells["VD"].Value);
             comm.Parameters.AddWithValue("@ItemCode", dataGridView1.Rows[i].Cells["ItemCode"].Value);
             comm.Parameters.AddWithValue("@Item", dataGridView1.Rows[i].Cells["ITEM"].Value);
             comm.Parameters.AddWithValue("@Qty", dataGridView1.Rows[i].Cells["QUANTITY"].Value);
             comm.Parameters.AddWithValue("@Ppcur", dataGridView1.Rows[i].Cells["PPCUR"].Value);
             comm.Parameters.AddWithValue("@StandardPrice", dataGridView1.Rows[i].Cells["STANDARD_SELL_PRICE"].Value);
             comm.Parameters.AddWithValue("@CeMarked", dataGridView1.Rows[i].Cells["CE-MARKED"].Value);
             comm.Parameters.AddWithValue("@Description", dataGridView1.Rows[i].Cells["ITEM_DESCRIPTION"].Value);
             comm.Parameters.AddWithValue("@Description2", dataGridView1.Rows[i].Cells["ITEM_DESCRIPTION2"].Value);
             comm.Parameters.AddWithValue("@Edma", dataGridView1.Rows[i].Cells["EDMA"].Value);

             sqlconnection.Open();
             comm.ExecuteNonQuery();
             sqlconnection.Close();
         }

         ExcelConnection.Close();
          }      
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.ToString());
      }
    }

【讨论】:

  • 感谢您的帮助,我也以此解决方案为基础。
猜你喜欢
  • 1970-01-01
  • 2015-06-26
  • 2016-02-24
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2014-11-15
相关资源
最近更新 更多