2013-04-01 72 views
0

EDITED !:將datagridveiw數據插入到sql數據庫中。 「解析查詢時出錯」

我正在寫一個程序,它具有將excel文件加載到datagridview中的功能。 Excel文件包含十列的產品列表。至於現在它工作正常。文件加載正常。但是在這個加載之後,程序應該用來自datagridview的數據填充SQL Server CE數據庫。因此,下次我打開這個表單時,datagridview應該填充來自數據庫的數據。 (這種Excel加載功能是當我的公司更改某些內容時更新產品列表)。

我在將數據插入數據庫時​​遇到問題。

我有一個錯誤:

There was an error parsing the query. [Token line number = 1, Token line offset = 67, Token in error = Taq]

DNA是在Excel文件(行1列3( 「ITEM」)的小區中的單詞單元的全部內容是AB-AB-0192/A的Taq DNA聚合酶(許可證)我認爲問題與TAQ之前的空間有某種關係,我測試了這一點:當我刪除空間時,問題信息從Taq變爲DNA,那麼我怎樣才能避免這種情況?被設置爲文本,和SQL Server CE數據庫列nvarchar類型。

EDIT!

玉傢伙,你把我在正確的道路上:)

這工作:

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(); 

數據庫充滿了正確的數據,當我重新啓動程序的數據庫已經填滿。現在我只需要在添加新內容之前清除數據庫。

雖然有一個問題。獲取消息: 從一種數據類型轉換爲另一種數據時,數據被截斷。 [功能名稱(如果知道)=]

+0

是的,有你的語句** **巨大的問題 - 你**不使用參數!**,因此對於SQL注入攻擊而言你是開放的。 **不要連接你的SQL語句!**從來沒有。使用參數化查詢 - **總是**。 –

+0

好的,有關如何做到這一點的任何鏈接?還是一個例子? –

+0

有**百萬**的例子 - [只是在Google上搜索!](https://www.google.ch/search?q=ado.net+parametrized+queries) –

回答

1
SqlCeCommand cmd = new SqlCeCommand(); 
       cmd.CommandText = "your insert statemnt (@[email protected],@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(); 

然後,您只需在聲明它們後從數據集中拉出數值即可。

+0

由於OP使用SQL Server ** Compact **,你需要使用'SqlCeConnection'和'SqlCeCommand'(而不是'SqlConnection'和'SqlCommand' .....) –

+0

好的捕獲,我沒注意到 – briskovich

+0

這個解決方案是我做的一個基礎。 。不得不改變它,因爲在迭代過程中我添加了相同的參數,所以必須在迭代之外定義參數並且只留下值定義。 –

1

嘗試這樣 - 在您的ADO.NET查詢中使用參數!並把所有的一次性項目,如SqlCeConnectionSqlCeCommandusing(...) { .... }塊,以確保他們妥善處置:

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()); 
     } 
    } 
+0

謝謝你的幫助,我也用這個解決方案作爲基礎。 –

相關問題