2010-09-15 272 views
0

我想读一个Excel工作表,然后创建另一个通过OleDb的插入从另一个Excel工作表中的Excel工作表

Excel工作表在此另一个Excel工作表,我做了一些colums像名称char(10),年龄号码

现在,当我读取该excel表格并尝试在这个另一个excel表格中插入值时,值正在插入,但也包含一个额外的字符,即单引号(')作为第一个字符。

为什么所有的值都被单引号与实际值相比较?如何摆脱它?我为此使用c#.net。

@Edit

OleDbCommand cmd = new OleDbCommand(); 
        cmd.CommandType = System.Data.CommandType.Text; 
        cmd.Connection = con; 
        cmd.CommandText = "CREATE TABLE Data1 (Name char(10), Age char(10)) "; 

        cmd.ExecuteNonQuery(); 

foreach (DataRow row in someDataTable.Rows) 
{ 

     cmd.CommandText = "INSERT INTO Data1 values ('" + row["Name"] + 
         "','" + row["Age"] + "')"; 

     cmd.ExecuteNonQuery(); 
} 

我有someDataTable在Excel exactlly相同的数据,我需要复制。

+0

我需要更多信息才能找到答案,请张贴一些示例代码。 – Treb

+0

我也给了一些代码,... – Nits

+1

我找不到你的代码中的任何错误。尝试在调试器中逐步完成它。对于第一次尝试,将您的'CommandText'设置为''INSERT INTO Data1值('Bart Simpson','12')“;'。如果错误消失了,原因是在查询的构建中。如果不是,则使用SQL语法。 – Treb

回答

2

这将是奇怪的,但也许它是某种尝试OleDb避免SQL注入? (如果row["Name"]包含单引号会怎么样?)即使它没有解释,就像@Treb所说的那样,为什么只有前导引号,而没有后引号。

如果您尝试使用查询与参数会发生什么情况,即:

using (OleDbCommand addLine = new OleDbCommand("INSERT INTO Data1 values (@name, @age)")) 
{ 
    addLine.Parameters.AddWithValue("@name", row["Name"]); 
    addLine.Parameters.AddWithValue("@age", row["Age"]); 
    int affectedRows = addLine.ExecuteNonQuery(); 
    Debug.Assert(1 == affectedRows); 
} 

尝试几次后,我仍然无法重现观察到的行为。我建议做几件事情:

  • 发表你的问题的整个源代码产生的单引号问题,

  • 试试下面的源(控制台应用程序),看看会发生什么。在我的情况下,值插入很好,没有任何前导单引号。唯一的问题是年龄,插入为文本,而不是数字(这也许可以通过显式指定该行的类型来解决):

的源代码:

namespace Demos.StackOverflow.ExcelUpdate 
{ 
    using System; 
    using System.Collections.ObjectModel; 
    using System.Data.OleDb; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // -> Change the following name of the file to use. 
      string fullPath = @"C:\Users\Arsene\Desktop\Book1.xlsx"; 
      string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0'", fullPath); 

      Collection<Tuple<string, int>> dataToPut = new Collection<Tuple<string, int>>(); 

      dataToPut.Add(new Tuple<string, int>("Some name", 34)); 
      dataToPut.Add(new Tuple<string, int>("Other name here", 41)); 
      dataToPut.Add(new Tuple<string, int>("Last one", 36)); 

      using (OleDbConnection oleConnection = new OleDbConnection(connectionString)) 
      { 
       oleConnection.Open(); 

       using (OleDbCommand createTable = new OleDbCommand("create table Data1 (Name char(10), Age char(10))", oleConnection)) 
       { 
        createTable.ExecuteNonQuery(); 
       } 

       foreach (var t in dataToPut) 
       { 
        using (OleDbCommand addItem = new OleDbCommand("insert into Data1 values (@name, @age)", oleConnection)) 
        { 
         addItem.Parameters.AddWithValue("@name", t.Item1); 
         addItem.Parameters.AddWithValue("@age", t.Item2); 
         addItem.ExecuteNonQuery(); 
        } 
       } 
      } 
     } 
    } 
} 
+0

我调试通过行[“名称”]它包含的值检查,没有任何报价,但在插入它表明在擅长 – Nits

+0

@Nits价值劲儿报价:我知道。在所有情况下,您在该问题的第三条评论中都尝试了@Treb的建议,并且在它应该的时候它不起作用。那么,尝试使用参数,看看它是否工作。 –

+0

即使字段名称也带有单引号前缀。像“名称和”年龄 – Nits

0

我已经经历相同的问题,插入的字段会得到一个领先的单引号。我发现这只是使用JET 4.0库时的情况,当我切换到ACE 12.0库时,问题就解决了。

相关问题