问题描述
//当使用提供程序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 ##
}
解决方法
Excel支持许多在这种情况下有用的文件格式标准,从应用程序角度来看,CSV和XML通常最容易用作输入。通过选择这些非Excel格式之一,您现在可以为更广泛的受众提供支持。
这也意味着这不再是基于 Excel 的解决方案,它现在只是一个数据问题
基本数据导入模式需要以下组件:
- 必须记录特定的数据结构
- 导入时,应验证数据结构
- 如果结构是受信任的,请使用序列化或读取器过程来解释数据
- 执行比较业务逻辑以检测插入和更新并针对您的应用程序数据库执行这些操作。
您可以使用很多工具来读取CSV文件,因此请搜索该格式的帮助,以查看它是否适合您的代码库。
如果使用XML序列化,则可以一击即可完成步骤1,2,3,您只需创建DTO类(代表excel行中记录的类),然后 serializing 该类提供了基本的文档。
标准的XML反序列化代码将管理验证,并将输入转换为对象,然后可以像代码中的普通数据对象一样使用这些对象。
一旦数据存储在内存中,无论您一次还是批量处理,那么您都可以使用常规的C#技术比较导入的记录,在数据库中找到匹配项并进行更新,或者是否存在不匹配,请插入新行。
接球:
尽量不要让用户在其中创建自己的文件,或者尽量不要创建一种解决方案,在该解决方案中,允许用户将不同的列映射到数据库中的字段,或者希望用户使用以下命令创建文件:自己纠正结构。
保持简单,让您的应用准备并提供“空白”文件或模板,供用户操作,然后重新提交回您的应用。
这是一个非常广泛的主题,有许多不同的方法可以实现这一目标,但是,如果您要问的话,最好从基础知识入手,然后在必要时进行改进。
例如,Excel可以直接连接到您的API甚至数据库,这意味着您甚至可以向Excel本身编写一个丰富的接口,但这非常复杂,通常不需要完成小任务。放宽安全性,使Excel可以直接与您的后端或数据库进行对话,这会打开其他许多蠕虫病毒,但要意识到这一点对于只读情况下的受信任高级用户来说非常有用。
,如果您正在谈论一个临时解决方案,针对少于1000种产品,并且将要一次性使用,即使每年一次,那么告诉您的用户提交excel文件可能会更容易与他们的产品一起使用,然后您可以使用直接DBA技术将这些数据手动导入数据库。
我认为这篇文章总结了您的情况:Time is running out...
该想法是确定您完成任务所需的时间(从Excel电子表格中导入数据),然后确定您可能执行此任务的次数。 >
如果用户向您展示了具有某种SQL向导和忍者技能的平面数据结构的Excel文件,则10分钟后,您可以仅使用SQL将该数据插入数据库中。
- 这将是一个很好的话题,可以在这个论坛上提问,尝试一下,然后在/如果遇到麻烦时发布问题。
- 因此,如果您只打算一次或两次执行此任务,那么...花费不超过10到20分钟即可开发出可供用户使用的编码解决方案。
- 即使只花了您10分钟的时间,您也可以合理地向客户收取几个小时的特权,但相反的做法则不太合理,您可能只需要花费几个小时来编码,部署和教导用户要使用此新功能,即使整个过程可能需要花费几天的反复努力才能实现,但我认为如果这种功能仅出现一次,高速公路抢劫案会对这种功能收取很多费用。
您仍然可以编写自己的C#脚本来导入用户文件,而不是使用SQL技术,而不必是面向客户端的,它可以是简单的c#脚本,既可以用作独立控制台应用程序,也可以用作单元测试或隐藏方法您可以在不到一个小时的时间内编写应用程序运行时中的内容,然后可能需要10分钟才能获取excel数据并对其进行处理,以便脚本可以使用它。
但是仍然需要考虑花费的时间以及您可以合理地向用户收取的功能费用。
因此,一旦您确定了该任务将花费您多长时间以及将来需要执行多少次,那么您就可以按照以下表格来确定是否值得进行自动化任务:
最初来自XKCD:Is It Worth the Time?
如果您可以在应用程序中编写良好的面向客户端的解决方案,使客户端可以选择要上传的文件,而代码将其余部分自动化,那么您仍然只希望最多花费几个小时,当然可以,但是除非您这样做如果做得好,您可以为他们节省一些钱,并按需为他们执行此任务,然后为他们提供错误的界面,使他们不得不支付1000美元来获得更高的客户满意度。
这样的任务与如何编写代码以完成任务无关,而与您和您的客户的正确业务决策有关,而这更多的是我的第二个最爱素描:
最初来自XKCD:Automation
因此,尽管您认为自己想编写代码以允许用户仅一次从excel导入数据,但是可能会有另一种方式来解决问题。