2013-01-07 46 views
2

我有一个带有两个选项卡的excel表,所以我想从一个选项卡获取一行并插入另一个选项卡,我认为它将与sqlserver或mysql中的相同。只需选择并插入..选择并插入命令OLEDB命令c#

我正在使用此查询,但它说语法错误不知道它有什么问题。

testCommand.CommandText = "Insert into [ActiveLicenses$](Select * from [companies$] 
          where [License Number] = '" + lnumber + "')"; 

    testCommand.ExecuteNonQuery(); 

UPDATE

有没有办法直接从Excel工作表中删除行?

回答

0

更快的方法。

我把所有的许可证放入一个DataTable中,删除那些不需要的时间不到1分钟。然后只需将DataTable导出到Csv,以便在不到1分钟的时间内准备好文件。下面

样品:

static List<string> licensecAll = new List<string>(); 
DataTable dt = new DataTable(); 
      OleDbDataAdapter dp = new OleDbDataAdapter("select * from [companies$]", testCnn); 
      dp.Fill(dt); 
      if (dt.Rows.Count > 0) 
      { 
       for (int i = dt.Rows.Count-1; i >= 0; i--) 
       { 
        string lnum = dt.Rows[i][0].ToString(); 
        Console.WriteLine("LICENSE NUMBER" + lnum); 
        if (!licensecAll.Contains(lnum)) 
        { 
         Console.WriteLine("ROW REMOVED"); 
         dt.Rows.RemoveAt(i); 
        } 
       } 

      } 

然后只需运行数据表到CSV ....

public static void DataTable2CSV(DataTable table, string filename, string seperateChar) 
    { 

     StreamWriter sr = null; 

     try 
     { 

      sr = new StreamWriter(filename); 
      string seperator = ""; 
      StringBuilder builder = new StringBuilder(); 
      foreach (DataColumn col in table.Columns) 
      { 

       builder.Append(seperator).Append(col.ColumnName); 

       seperator = seperateChar; 
      } 

      sr.WriteLine(builder.ToString()); 

      foreach (DataRow row in table.Rows) 
      { 

       seperator = ""; 
       builder = new StringBuilder(); 
       foreach (DataColumn col in table.Columns) 
       { 

        builder.Append(seperator).Append(row[col.ColumnName]); 
        seperator = seperateChar; 

       } 

       sr.WriteLine(builder.ToString()); 

      } 

     } 

     finally 
     { 

      if (sr != null) 
      { 

       sr.Close(); 

      } 

     } 

    } 
0

您可以使用SQL从Excel中提取数据:

 using (OleDbDataAdapter da = new OleDbDataAdapter(
    "SELECT " + columns + " FROM [" + worksheetName + "$]", conn)) 
    { 
     DataTable dt = new DataTable(tableName); 
     da.Fill(dt); 
     ds.Tables.Add(dt); 
    } 

不幸的是插入Excel不以这种方式工作。我很确定你不能指定一个单元格来写入使用OleDb插入命令,它会自动转到指定列中的下一个打开的行。你可以用更新声明来解决它:

sql = "Update [Sheet1$A1:A10] SET A10 = 'YourValue'"; 
myCommand.CommandText = sql; 
myCommand.ExecuteNonQuery(); 

我个人会使用VSTO而不是oleDB。一旦您提取了单元格,只需用代码打开电子表格并插入数据:

Excel.Workbook wb = xlApp.Workbooks.Open(filePath); 
rng = wb.Range["A1"]; 
rng.Value2 = "data"; 
+0

我需要近50万行逐一所以这可能使它成为现实慢,,, , – confusedMind

+0

使用OleDB单独插入行听起来会很慢,建议使用VSTO会提高性能,特别是如果您使用此技术:http://stackoverflow.com/a/2294087/495455 –

+0

请检查我的答案以及是否请求看起来是正确的和RITE方法 – confusedMind