我正在尝试使用带有"Microsoft.ACE.OLEDB.12.0"OLE DB提供程序的T-SQL OpenRowset()命令将Excel 2007(.xlsx)文件中的数据导入SQL Server 2008,并且我得到一个持久的"找不到可安装的ISAM"错误.所有硬件都是32位.
[修订于2012年1月10日,试图更加集中于异常]
以下T-SQL语句产生错误:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"',
'SELECT * FROM [Sheet1$]'
)
Run Code Online (Sandbox Code Playgroud)
如果我以"Excel 97-2003"格式(.xls)保存Excel文件并使用较旧的Microsoft.Jet.OLEDB.4.0提供程序导入数据,它可以正常工作.这让我觉得这不是安全或其他环境问题.
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES',
'SELECT * FROM [Sheet1$]'
)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用Microsoft.ACE.OLEDB.12.0提供程序的*.xls文件时,它应该向后兼容*.xls格式,它再次失败并出现相同的错误:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";',
'SELECT * FROM [Sheet1$]'
)
Run Code Online (Sandbox Code Playgroud)
另外,有趣的是,当我使用SSMS"导入数据..."向导时,它工作正常.我将导入数据向导输出保存为SSIS包,并查看SSIS文件以试图弄清楚它是如何工作的,并且它已成功使用Microsoft.ACE.OLEDB.12.0提供程序.这是SSIS包中的连接字符串:
<DTS:Property DTS:Name="ConnectionString">
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES";
</DTS:Property>
Run Code Online (Sandbox Code Playgroud)
我还完成了相关的SQL Server配置以允许OPENROWSET分布式查询:
sp_configure 'show advanced options', 1
reconfigure
GO
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
GO
Run Code Online (Sandbox Code Playgroud)
如果我还设置了以下*sp_MSset_oledb_prop*值(我在某个帖子中找到)...
USE [master]
GO
EXEC …Run Code Online (Sandbox Code Playgroud) 可能重复:
CSV文件导入.Net
在.net中,是否有一个标准库应该用于读取csv文件?Web上的所有示例都会使用自己的csv阅读器/解析器,或者使用OleDb.
使用任何这些解决方案都不是问题,我只是想知道是否有一个普遍接受的库(不是我能找到的),或者其他任何"正确"的方法吗?
我在一些excel过程中使用以下内容来建立与我们的数据库的连接.
Private Const strConn As String = _
"PROVIDER=SQLOLEDB.1 ..."
Sub OpenConnection()
Set cn = CreateObject("ADODB.Connection")
cn.Open strConn
cn.CommandTimeout = 0
Set rs = CreateObject("ADODB.Recordset")
Set rs.ActiveConnection = cn
End Sub
Run Code Online (Sandbox Code Playgroud)
在后续代码中,我使用各种SQL字符串打开连接.
我想测试是否rs打开所以我知道它需要关闭,但以下不起作用.如何更改以下条件才能工作?
If (rs.Open = True) Then
rs.Close
End If
Run Code Online (Sandbox Code Playgroud)
以下工作,但我不想以这种方式使用错误捕获:
On Error Resume Next
rs.Close
Run Code Online (Sandbox Code Playgroud) 目前我正在尝试从SQL Server 2008 R2实例(也在SQL Server 2012上测试)查询Windows搜索服务.Windows搜索作为OLE DB数据源公开,为我提供了几个查询搜索索引的选项.在SQL Server中配置新的链接服务器时,Management Studio为我提供了选择Microsoft OLE DB Provider for Search的选项,这意味着我应该能够从SQL Server连接到它.然而,事实证明这是一个挑战.您将在下面找到我偶然发现的错误消息.
链接服务器"TESTSERVER"的OLE DB提供程序"Search.CollatorDSO"返回消息"命令未准备好".
消息7399,级别16,状态1,行2
OLE DB提供程序"Search.CollatorDSO"用于链接服务器"TESTSERVER"报告错误.命令没有准备好.
消息7350,级别16,状态2,行2
无法从OLE DB提供程序"Search.CollatorDSO"获取链接服务器"TESTSERVER"的列信息.
事情变得更加有趣.虽然链接服务器解决方案不起作用,但我能够在CLR函数中包装查询Windows搜索的代码(使用MSDN:以编程方式查询索引),并在SQL Server中成功使用.然而,这是不太理想的,因为设置它所需的步骤(部署库,配置权限等).我已经尝试了几个参数设置,没有任何运气.我还尝试启用一些Search.CollatorDSO提供程序选项,例如允许将提供程序实例化为进程内服务器.我目前正在使用以下设置.为了安全起见,我正在使用登录的当前安全上下文.
Microsoft OLE DB Provider for Search(local)Provider=Search.CollatorDSO.1;EXTENDED?PROPERTIES="Application=Windows"-此外,我需要搜索网络驱动器,这可以使用共享的Windows库完成吗?
我知道在过去的几年里,有更多的人一直在努力解决这个问题.我想知道是否有人能够使这个运行起来,或者能指出我正确的方向.
普通的ADO/OLEDB组件可以使用连接字符串查询Windows搜索服务:
provider=Search.CollatorDSO.1;EXTENDED PROPERTIES="Application=Windows"
Run Code Online (Sandbox Code Playgroud)
一个示例查询:
SELECT TOP 100000 "System.ItemName",
"System.ItemNameDisplay",
"System.ItemType",
"System.ItemTypeText",
"System.Search.EntryID",
"System.Search.GatherTime",
"System.Search.HitCount",
"System.Search.Store",
"System.ItemUrl",
"System.Filename",
"System.FileExtension",
"System.ItemFolderPathDisplay",
"System.ItemPathDisplay",
"System.DateModified",
"System.ContentType",
"System.ApplicationName",
"System.KindText",
"System.ParsingName",
"System.SFGAOFlags",
"System.Size",
"System.ThumbnailCacheId"
FROM "SystemIndex"
WHERE CONTAINS(*,'"Contoso*"',1033)
Run Code Online (Sandbox Code Playgroud)
您可以尝试运行以下命令直接在SQL Server Management …
我在最后40分钟一直在调试这个查询,问题显然是参数的顺序.
SELECT * FROM tblSomeThing WHERE id = @id AND debut = @dtDebut AND fin = @dtFin
Run Code Online (Sandbox Code Playgroud)
然后我用这种方式添加参数,注意最后两个参数都是切换的,我没有得到任何结果.
cmd.Parameters.Add("@id", OleDbType.Integer).Value = idSociete;
cmd.Parameters.Add("@dtFin", OleDbType.Date).Value = dateTraitementFin;
cmd.Parameters.Add("@dtDebut", OleDbType.Date).Value = dateTraitementDebut;
Run Code Online (Sandbox Code Playgroud)
当我按照它们在queury中出现的方式声明参数时,一切都很完美.
我认为命名参数是解决这个问题的第一步!我在这里想念的是什么?
谢谢
我有一个包含数据的Excel文件.我想将它的一些特定行写入我通过代码创建的另一个Excel文件.顺便说一下,我在列表中有这些行的索引.我怎样才能做到这一点?
在我的C#应用程序中,我使用Microsoft Jet OLEDB数据提供程序来读取CSV文件.连接字符串如下所示:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Data;Extended Properties="text;HDR=Yes;FMT=Delimited
Run Code Online (Sandbox Code Playgroud)
我使用该连接字符串打开ADO.NET OleDbConnection,并使用以下命令从CSV文件中选择所有行:
select * from Data.csv
Run Code Online (Sandbox Code Playgroud)
当我打开OleDbDataReader并检查它返回的列的数据类型时,我发现堆栈中的某些东西试图根据文件中的第一行数据猜测数据类型.例如,假设CSV文件包含:
House,Street,Town
123,Fake Street,Springfield
12a,Evergreen Terrace,Springfield
Run Code Online (Sandbox Code Playgroud)
为House列调用OleDbDataReader.GetDataTypeName方法将显示该列已被赋予数据类型"DBTYPE_I4",因此从中读取的所有值都将被解释为整数.我的问题是House应该是一个字符串 - 当我尝试从第二行读取House值时,OleDbDataReader返回null.
如何判断Jet数据库提供程序或OleDbDataReader将列解释为字符串而不是数字?
一些上下文:我正在研究的系统之一是.net 2.0 Web应用程序.用于前端的VB.net和用于后端的SQL Server 2005.由于各种原因已经丢失,原设计师决定使用.Net OleDB连接而不是SQLClient连接.
经过几年的发展,这个特殊的系统正处于从"beta"到"1.0"状态的过程中.我们此时讨论的一件事就是转向SQLClient连接.虽然我知道最好的做法是使用它,并且这是获得SQL Server 2005(我们没有使用,显然)的更好的功能的唯一方法,使用这个功能的优势是什么?其他?我应该知道的任何隐藏的陷阱?任何人都可以指出一些显示相对速度的基准吗?(我听说SQLClient应该更快,但我从未见过任何数字来支持它.)
谢谢,所有.
使用以下代码,我可以枚举在我的系统上注册的OLEDB提供程序
static void DisplayData() {
var reader = OleDbEnumerator.GetRootEnumerator();
var list = new List<String>();
while (reader.Read()) {
for (var i = 0; i < reader.FieldCount; i++) {
if (reader.GetName(i) == "SOURCES_NAME") {
list.Add(reader.GetValue(i).ToString());
}
}
Console.WriteLine("{0} = {1}", reader.GetName(0), reader.GetValue(0));
}
reader.Close();
}
Run Code Online (Sandbox Code Playgroud)
它返回驱动程序列表(我们对Access驱动程序感兴趣),但需要注意一点.
对.net 4.5它包含:
SOURCES_NAME = Microsoft.ACE.OLEDB.15.0
但是当项目是针对.net 4.0构建的时,输出是:
SOURCES_NAME = Microsoft.ACE.OLEDB.12.0
我们正在测试的机器安装了32位Office 2013(其中包含Microsoft.ACE.OLEDB.15.0),并且我们安装了64位版本的Access数据库驱动程序(具有Microsoft.ACE.OLEDB.12.0).我们运行的项目设置为AnyCPU,我们使用的是Windows 8.1.
为什么枚举总是返回相同的结果?
如何获取系统上安装的所有提供程序的列表?我想要的原因通常是我想要针对最新的驱动程序运行,但对于某些连接,我需要使用早期版本的驱动程序.(这是因为我有时需要升级旧的.mdb文件)所以如果没有安装旧版本,我想通知我的用户.
杂项奇怪:
如果我们针对.net 4.5.1创建一个控制台应用程序,然后将其更改为.net 4.0并运行它然后将其更改回.net 4.0它继续返回.net 4.0结果(Microsoft.ACE.OLEDB.12.0驱动程序)
将Excel文件放入SQL Server中的表的最快方法是什么?