2013-01-07 91 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