2013-04-01 4 views
0

EDITED! :SQL 데이터베이스에 datagridveiw 데이터 삽입. "쿼리를 구문 분석하는 동안 오류가 발생했습니다."

Excel 용 파일을 DataGridview에로드하는 기능을 가진 프로그램을 작성하고 있습니다. Excel 파일에는 열이 10 개인 제품 목록이 포함되어 있습니다. 지금은 잘 작동합니다. 파일이 잘로드되었습니다. 그러나이로드가 끝나면 프로그램은 SQL Server CE 데이터베이스를 datagridview의 데이터로 채 웁니다. 따라서 다음에이 양식을 열면 datagridview가 데이터베이스의 데이터로 채워 져야합니다. (이 기능은 회사에서 변경된 제품 목록을 업데이트하는 기능입니다.)

이 데이터를 데이터베이스에 삽입하는 데 문제가 있습니다.

나는 오류가 있습니다.

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 polymerase (licensed) : 문제는 TAQ 이전의 공간과 어떻게 든 연결되어 있다고 생각합니다. 나는 이것을 테스트했습니다. 공간을 삭제하면 Taq에서 DNA로 문제 정보가 바뀝니다. 어떻게 이것을 피할 수 있습니까? 텍스트로 설정하고, SQL 서버 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(); 

데이터베이스가 올바른 데이터로 가득 내가 프로그램 데이터베이스를 다시 시작할 때 이미 가득 차 있습니다. 이제 새로운 콘텐츠를 추가하기 전에 데이터베이스를 정리하면됩니다.

하나의 문제. 메시지 받기 : 한 데이터 유형에서 다른 데이터 유형으로 변환하는 동안 데이터가 잘 렸습니다. [함수 이름 (알려진 경우) =]

+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'과'SqlCeand'가 아닌'SqlCeConnection'과'SqlCeCommand'를 사용해야합니다. –

+0

좋은 캐치, 그걸 알아 차리지 못했습니다 – briskovich

+0

이 솔루션은 내가 한 일의 기초입니다. iteration을 변경하는 동안 동일한 매개 변수를 추가했기 때문에 반복 외부의 매개 변수를 정의하고 거기에 값 정의를 남겨 두어야했기 때문에 변경해야했습니다. –

1

ADO.NET 쿼리에서 매개 변수을 사용하십시오! 그리고 그들은 적절하게 배치하고 있는지 확인 using(...) { .... } 블록에 SqlCeConnectionSqlCeCommand 같은 모든 일회용 항목을 넣어 :

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

도움을 주셔서 감사합니다. 나는이 해결책도 기초로 사용했습니다. –

관련 문제