Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 选择并插入命令OLEDB命令c_C#_Oledb - Fatal编程技术网

C# 选择并插入命令OLEDB命令c

C# 选择并插入命令OLEDB命令c,c#,oledb,C#,Oledb,我有一个带有两个选项卡的excel工作表,所以我想从一个选项卡中获取一行并插入到另一个选项卡中,我认为这与sqlserver或mysql中的情况相同。只需选择并插入 我正在使用这个查询,但它表示语法错误,不确定其中有什么错误 testCommand.CommandText = "Insert into [ActiveLicenses$]( Select * from [companies$] where [License Numbe

我有一个带有两个选项卡的excel工作表,所以我想从一个选项卡中获取一行并插入到另一个选项卡中,我认为这与sqlserver或mysql中的情况相同。只需选择并插入

我正在使用这个查询,但它表示语法错误,不确定其中有什么错误

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

  testCommand.ExecuteNonQuery();
更新


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

您可以使用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 Insert命令指定要写入的单元格,它将自动转到指定列中打开的下一行。您可以使用update语句解决此问题:

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";
一种更快的方法

我将所有许可证放入一个数据表,删除不需要的许可证只需不到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);
                    }
                }

            }

我需要一个接一个地获得近500k行,这样可能会非常慢,,,,,使用OleDB单独插入行听起来非常慢,建议使用VSTO将提高性能,特别是如果您使用此技术:也请检查我的答案,这看起来正确吗,RITE方法
  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();

            }

        }

    }