【问题标题】:Read and Update in database through excel通过excel读取和更新数据库
【发布时间】:2020-08-29 01:18:16
【问题描述】:

// 使用提供程序 Microsoft.ACE.OLEDB.12.0 上传时出错

System.InvalidOperationException: 'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。'

// 使用提供程序 Microsoft.JET.OLEDB.4.0 上传时出错

System.Data.OleDb.OleDbException: '找不到可安装的 ISAM

请帮忙

// for browsing file 
  private void btnBrowse_Click(object sender, EventArgs e)
        {
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.Title = "Select File";
fdlg.FileName = txtFileName.Text;
fdlg.Filter = "Excel Sheet (*.xls)|*.xls|All Files(*.*)|*.*";
fdlg.FilterIndex = 1;
fdlg.RestoreDirectory = true;
if (fdlg.ShowDialog() == DialogResult.OK)
            {
                txtFileName.Text = fdlg.FileName;
            }
        }


// for importing excel file into datagridview
   private void btnImport_Click(object sender, EventArgs e)
        {
OleDbConnection theConnection = new OleDbConnection(@"provider=Microsoft.ACE.OLEDB.12.0;data source='" + txtFileName.Text+"';Extended Properties=\"Excel 15.0;HDR=YES;\"");

theConnection.Open();
OleDbDataAdapter theDataADapter = new OleDbDataAdapter("SELECT * FROM[Sheet1$]",theConnection);
DataSet theSD = new DataSet();
DataTable dt = new DataTable();
theDataADapter.Fill(dt);
this.dataGridView1.DataSource = dt.DefaultView;## Heading ##
        }

【问题讨论】:

  • 您还没有指明您正在使用哪个前端堆栈,WinForms DataGridView 和大多数第三方数据网格产品提供了足够的功能,您无需借助导入功能来管理长列表数据,您是否考虑过为此构建数据网格条目 UI?
  • 这个问题不会吸引很多选票,因为它没有显示任何研究成果你应该包括一些你尝试过的思考过程或代码,即使它失败了,甚至是 excel 文件的结构,你就会吸引到更多有用的回复

标签: c# excel desktop-application


【解决方案1】:

Excel 支持在这种情况下有用的许多文件格式标准,从应用程序的角度来看,CSV 和 XML 通常是最容易使用的输入格式。通过选择其中一种非 Excel 格式,您现在可以为更广泛的受众提供支持。

这也意味着这不再是一个基于 Excel 的解决方案,它现在只是一个数据问题

基本数据导入模式需要以下组件:

  1. 必须记录具体的数据结构
  2. 导入时,应验证数据结构
  3. 如果结构是受信任的,则使用序列化或读取器进程来解释数据
  4. 执行比较业务逻辑​​以检测插入和更新,并针对您的应用程序数据库执行这些操作。

您可以使用大量工具来读取 CSV 文件,因此请搜索有关该格式的帮助,看看它是否适合您的代码库。

如果你使用 XML 序列化,那么这可以一键完成步骤 1,2,3,你只需要创建你的 DTO 类(代表来自 excel 行的记录的类)然后 序列化 该类提供基本文档。

标准的 XML 反序列化代码将管理验证并将输入转换为对象,然后您可以像在代码中使用普通数据对象一样使用这些对象。

一旦数据在内存中,无论您是一次执行一行还是批量执行该操作,您都可以使用常规 C# 技术比较导入的记录,在数据库中找到匹配项并更新它,或者是否存在不匹配插入新行。

捕获:

尽量不要让用户在那里创建自己的文件,或者更确切地说,尽量不要创建允许用户将不同的列映射到数据库中的字段或您希望用户使用正确的结构。

保持简单,让您的应用准备好并提供“空白”文件或模板,然后用户操作并随后重新提交回您的应用。


这是一个非常广泛的话题,有很多不同的方法可以实现这一点,但是如果您提出要求,最好从基础开始,如果有必要,以后再改进流程。

例如,Excel 可以直接连接到您的 API 甚至数据库,这意味着您甚至可以在 Excel 本身中编写一个丰富的接口,但这非常复杂,通常不需要完成小任务。将安全性放宽到 Excel 可以直接与您的后端或数据库通信的程度会打开其他蠕虫罐,但有可能意识到这一点对于只读场景中受信任的高级用户非常有用。

【讨论】:

    【解决方案2】:

    如果您谈论的是针对少于 1000 种产品的临时解决方案,并且它会一次性关闭,即使是每年一次,那么告诉您的用户提交 excel 文件可能会更容易给你他们的产品,然后你可以使用直接的 DBA 技术将这些数据手动导入数据库。

    我觉得这篇文章总结了你的场景:Time is running out...

    这个想法是确定完成任务需要多长时间(从 Excel 电子表格导入数据),然后确定您可能执行该任务的次数。. p>

    如果用户向您展示了一个平面数据结构的 Excel 文件,并具有一些 SQL 巫术和忍者技能,10 分钟后,您可以单独使用 SQL 将该数据插入到数据库中。

    • 这将是一个很好的主题,可以在此论坛上提出问题,尝试一下,然后在遇到困难时/如果遇到问题再发布问题。
    • 因此,如果您只打算执行此任务一次或两次,那么永远不要花费超过 10-20 分钟的时间来开发用户可以使用的编码解决方案。
      • 即使只花了你 10 分钟,你也可以合理地向客户收取几个小时的费用来获得特权,但反过来就不太合理,你可能只收取几个小时来编码、部署和教授用户的费用要使用这个新功能,即使整个过程可能需要几天的来回努力才能正确完成,但如果他们只做一次,我会认为为这种功能收取高额费用是高速公路抢劫。

    除了 SQL 技能,您仍然可以编写自己的 C# 脚本来专门导入用户的文件,它不必是面向客户端的,一个简单的 c# 脚本可以作为独立的控制台应用程序、单元测试或隐藏方法在您的应用程序运行时中可能会在不到一个小时内编写完成,那么您可能需要 10 分钟来获取 excel 数据并对其进行处理以便您的脚本可以使用它。

    但仍必须考虑您所花费的时间,以及您可以合理地向用户收取此功能的费用。

    因此,一旦您确定了该任务将花费您多长时间,以及您将来需要执行多少次此任务,您就可以按照此类表格来确定是否值得努力自动化根本任务:


    来自XKCD:Is It Worth the Time?

    如果您可以在您的应用程序中编写可靠的面向客户端的解决方案,其中客户端可以选择要上传的文件,而您的代码会自动完成其余部分,那么您仍然只希望这最多花​​费几个小时,当然可能,但除非您做得好,您可能会获得更高的客户满意度,方法是为他们节省一些美元并按需为他们执行此任务,然后为他们提供一个错误的界面,他们必须为此支付 1000 美元。

    这样的任务不是关于如何编写代码来完成任务,而是更多关于什么是适合您和您的客户的正确业务决策,这让我想到了第二个最喜欢的草图:


    来自XKCD:Automation

    因此,当您认为您想编写代码以允许您的用户仅从 Excel 导入数据一次时...可能有另一种方法可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2014-03-18
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多