Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在OLEDB连接不工作的情况下调用存储过程_C#_Sql Server_Stored Procedures_Oledb - Fatal编程技术网

C#在OLEDB连接不工作的情况下调用存储过程

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

我有一个从eXcel文件读取数据的存储过程,当执行这个存储过程时,它运行良好,读取所有数据并填充SQL表

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
文件夹吗?