【问题标题】:Why doesn't the update OLEDB query do nothing?为什么更新 OLEDB 查询不执行任何操作?
【发布时间】:2020-04-19 01:51:19
【问题描述】:

我在我的程序中使用 OLEDB 来更新 Excel 工作表。 Execute 返回 1 作为行更新计数,但不会改变任何内容。 我的代码如下:

public static void updateExcel(string sql, string path)
    {
        try
        {
            OleDbConnection con;
            OleDbCommand comm = new OleDbCommand();

            con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
                                            path +
                                            ";Extended Properties=Excel 12.0;");
            con.Open();
            comm.Connection = con;
            comm.CommandText = sql;
            int y = comm.ExecuteNonQuery();
            con.Close();
        }
        catch (Exception ex)
        {


        } 

    }

而调用是:

string sql = "update [Sh1$] set j = j + ' AAAA ' where a = '" + excelData.Rows[i]["a"].ToString() + "'";
EXCEL.updateExcel(sql, excelFile);

有人知道问题出在哪里吗?

谢谢!

【问题讨论】:

  • 我认为您在连接的扩展属性末尾缺少HDR=YES。
  • 我也试过了...谢谢!
  • 尝试在 con.Close() 之后添加con.Dispose();;
  • 还是不行。它甚至不会更新 1 行。
  • @utor 无论如何,最好使用Epplus 之类的库来直接创建和操作 Excel 文件,而无需通过 Excel 或 Jet 驱动程序。 Epplus 是一个原生 .NET Standard 库,可以在任何操作系统上运行,并且不关心 CPU 架构

标签: c# excel connection-string oledb


【解决方案1】:

尝试使用 using 重写:

using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        try
        {
            conn.Open();
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = conn;
            cmd.CommandText = @"update [Sh1$] set j = j + ' AAAA ' where a = '" + excelData.Rows[i]["a"].ToString() + "'";
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            //exception here
        }
        finally
        {
             conn.Close();
             conn.Dispose();
        }
    }

【讨论】:

  • 最重要的是删除那个catch{}并找出真正的错误是什么。也不需要 finally 块 - using 调用 Dispose() 反过来又调用 Close()
  • @PanagiotisKanavos。没有错误 - 它不会在 catch 块处停止。
【解决方案2】:

检查excel中的单元格是否为空。如果是这样,这:set j = j + ' AAAA ' 将不起作用,因为 j 是 NULL。

在这种情况下,这样会更好:

set j = ' AAAA '

或

set j = IIF(j IS NULL, ' AAAA ', j + ' AAAA ')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2020-05-30
    相关资源
    最近更新 更多