C#在OLEDB连接不工作的情况下调用存储过程
我有一个从eXcel文件读取数据的存储过程,当执行这个存储过程时,它运行良好,读取所有数据并填充SQL表C#在OLEDB连接不工作的情况下调用存储过程,c#,sql-server,stored-procedures,oledb,C#,Sql Server,Stored Procedures,Oledb,我有一个从eXcel文件读取数据的存储过程,当执行这个存储过程时,它运行良好,读取所有数据并填充SQL表 CREATE PROCEDURE Importdata2 AS BEGIN DECLARE @sql NVARCHAR(50) SET @sql = 'SELECT * FROM [' + 'Sheet1' + '$]' INSERT INTO Branches (Description) EXEC ( 'select distin
CREATE PROCEDURE Importdata2
AS
BEGIN
DECLARE @sql NVARCHAR(50)
SET @sql = 'SELECT * FROM [' + 'Sheet1' + '$]'
INSERT INTO Branches (Description)
EXEC (
'select distinct Department
FROM OPENROWSET(
''Microsoft.ACE.OLEDB.12.0''
,''Excel 12.0 Xml;Database=' + 'C:\ATTapp\ATToutput files\test.xls' + ';HDR=YES''
,''' + @sql + ''') where Department not in (select description from Branches)'
)
END
GO
我需要从C代码中调用此存储过程,如下所示:
try
{
using (DBConnection con = new DBConnection())
{
SqlCommand command = new SqlCommand("ImportData2", con.Connection);
command.CommandType = CommandType.StoredProcedure;
command.ExecuteNonQuery();
}
}
catch (Exception err)
{
Logger.log("Error in Importdata function:" + err);
}
问题是,从C#调用此存储过程时,它会返回一个SQL异常:
System.Data.SqlClient.SqlException(0x80131904):无法为链接服务器(null)初始化OLE DB提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象。链接服务器的OLE DB提供程序“Microsoft.ACE.OLEDB.12.0”(null)返回消息“未指定错误”。在
System.Data.SqlClient.SqlConnection.OnError(SqlException异常,
布尔断开连接,Action1 wrapCloseInAction)位于
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
异常,布尔断开连接,Action1 wrapCloseInAction)位于
System.Data.SqlClient.TdsParser.ThroweException和Warning(TdsParserStateObject
stateObj、布尔调用方连接锁、布尔异步关闭)位于
System.Data.SqlClient.TdsParser.TryRun(运行行为,
SqlCommand cmdHandler、SqlDataReader数据流、,
BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject
stateObj、Boolean和dataReady)位于
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,
运行行为运行行为,字符串重置选项字符串,布尔值
isInternal,用于描述参数加密的布尔值)位于
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior、RunBehavior、Boolean returnStream、Boolean
异步、Int32超时、任务和任务、布尔异步写入、布尔inRetry、,
SqlDataReader ds,布尔描述参数加密请求)位于
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior、RunBehavior、布尔返回流、字符串
方法,TaskCompletionSource1完成,Int32超时,任务和任务,
Boolean&在
System.Data.SqlClient.SqlCommand.InternalExecuteOnQuery(TaskCompletionSource1
完成,字符串方法名,布尔sendToPipe,Int32超时,
Boolean&在
System.Data.SqlClient.SqlCommand.ExecuteNonQuery()位于
SimpleAttendance.frmLogin.CallImportDataSP(字符串文件类型,字符串
文件路径,字符串查询),在c:\Users\Amal\Desktop\Attention中
app\SimpleAttendance\SimpleAttendance\SimpleAttendance\frmLogin.cs:line
127客户端连接ID:3758d5ca-1589-4bff-a006-f9e93dafce8b错误
编号:7303,状态:1,类别:16}
尝试将您的spT代码更改为:
CREATE PROCEDURE Importdata2
AS
BEGIN
DECLARE @sql NVARCHAR(max) = ''
DECLARE @sqlFull NVARCHAR(max) = ''
SET @sql = 'SELECT * FROM [' + 'Sheet1' + '$]'
SET @sqlFull = '
INSERT INTO Branches ([Description])
select distinct Department
FROM OPENROWSET(
''Microsoft.ACE.OLEDB.12.0''
,''Excel 12.0;Database=' + 'C:\ATTapp\ATToutput files\test.xls' + ';HDR=YES''
,''' + @sql + ''') where Department not in (select description from Branches)'
print 'Full SQL: ' + @sqlFull
EXEC (@sqlFull)
END
GO
我已经将EXEC
从插入到中,现在使用完整的动态SQL字符串馈送EXEC
如果出现语法错误,请注意print语句打印的内容。使用.xlsx
和.xls
文件尝试此版本。注意,在实际运行spT之前,Excel文件应该存在于磁盘上。注意,我还从OPENROWSET
连接字符串中删除了Xml
,因为在我的OPENROWSET
调用代码时,我没有它。检查磁盘上是否存在C:\ATTapp\ATToutput files\test.xls
文件。另外,您确定Excel 12.0驱动程序的文件扩展名应该是.xls
而不是.xlsx
?该文件存在。我从SQL执行了存储过程,它工作正常。但是当我从C代码中调用它时,它给出了这个错误!!您能用SQL:C:\\ATTapp\\ATToutput files\\test.xls中的转义文件路径从C#尝试吗?另外,一定要在C#中使用.xlsx文件扩展名进行尝试。我使用了2个反斜杠和xlsx进行了尝试,但也没有使用相同的错误:(同样的错误!sp的执行在sql上正常工作,但当我从C#代码调用它时,它给出了相同的结果。)error@Malo这真的很奇怪。但是,我确实怀疑这与实际的Excel文件有关。可能是权限?你能将Excel文件移动到每个人都有读写权限的C:\temp
文件夹吗?