带有生成Excel文件的SSIS项目在SSDT工具中执行成功,但部署在Sql Server中使用Sql Job执行就报出调用的目标发生了异常

qq_34101912 2017-09-14 04:42:32
使用SSDT开发的SSIS项目在SSDT中执行成功,但部署到sql server中后,使用sql job去执行就报出“调用的目标发生了异常”。这里是调用的Microsoft.Office.Interop.Excel.dll这个组件报出的异常

//new一个Excel程序对象
Microsoft.Office.Interop.Excel.Application Application = new Microsoft.Office.Interop.Excel.Application();

//创建一个Workbooks工作簿集合对象
Microsoft.Office.Interop.Excel.Workbooks workbooks = Application.Workbooks;

//创建一个工作簿Workbook
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);

//创建一个Worksheet工作表
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];

Version = Application.Version;//获取你使用的excel 的版本号

if (Convert.ToDouble(Version) < 12)//You use Excel 97-2003
{
//将保存Excel文件的格式设置为:-4143
FormatNum = -4143;
}
else//you use excel 2007 or later
{
//将保存Excel文件的格式设置为:56;
FormatNum = 56;
}

string[] cells ;//每行中的单元格数据字符串数组



//定义行号从第二行开始
int k = 2;

//设置第一行第一列单元格中的值为“*”
worksheet.Cells[1, 1] = "*";

FileStream fs = new FileStream( WorkPath + fi.Name, FileMode.Open );

StreamReader sr = new StreamReader(fs);

strLine = sr.ReadLine();

//如果文件流读出的行数据不为空时循环
while (strLine != null)
{

//将行数据按“\t”指标符分割成字符串数组存入cells数组
cells = strLine.Split('\t');

//循环cells数组
for (int j = 0; j <= cells.Length-2; j++ ){

//将cells数组中的元素按下标存入worksheet中的单元格内
worksheet.Cells[k, j+1] = cells[j];

}

//再将下一行数组读入strLine中
strLine = sr.ReadLine();

//将行数加1
k++;
}

sr.Close();

fs.Close();




//将worksheet加入到workbook中
workbook.Worksheets.Add(worksheet);

//将workbook以全路径为WorkPath+iBrokerFile,内容格式为FormatNum保存
workbook.SaveAs(String.Format(savePath + iBrokerFile, fi.Name.Substring(0,(int)fi.Name.Length - 4)), FormatNum);

//根据临时文件创建一个FileInfo
FileInfo cuInfo = new FileInfo(WorkPath + tmpFile);

//用FileInfo来删除临时文件
cuInfo.Delete();

//cuInfo = new FileInfo(WorkPath + deleteFile);

//cuInfo.Delete();

//要删除的worksheet工作表名称
string DeleteSheetNames = "Sheet2";


try
{

//循环工作表集合(数组?)
for (int i = 0; i < Application.Worksheets.Count; i++)
{
//如果有工作表名称==DeleteSheetName
if (DeleteSheetNames == ((Microsoft.Office.Interop.Excel.Worksheet)Application.Worksheets[i + 1]).Name)
{
//屏蔽程序运行过程中出现的各种警告
Application.DisplayAlerts = false; //注意一定要加上这句
((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[i + 1]).Delete();
//开启程序运行过程中出现的各种警告
Application.DisplayAlerts = true;//注意一定要加上这句

}
}

// 保存并关闭这个工作簿。
workbook.Close(Microsoft.Office.Interop.Excel.XlSaveAction.xlSaveChanges, Missing.Value, Missing.Value);

//......
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);

//将工作簿置空
workbook = null;

}
catch (System.Exception ex)
{
//将异常消息存入LastError中
string LastError = string.Format("WdCalcCode类\n," + ex.Message, "系统提示");
}
finally
{
//关闭Excel
Application.Quit();
//将Excel置空
Application = null;

//进行即时垃圾回收
GC.Collect();
}


使用cmd命令行执行DTExec.exe /f "包的全路径名"可以执行成功,32位的64位的DTExec.exe都没问题。
然后我想使用Operating system(CmdExec)方式去执行我用cmd的命令,没有报错但是感觉也没有执行SSIS项目,整个执行流程很快,没有执行结果。

不知道原因在哪里,在百度找了好久没有找到相关的答案,希望有大佬来指点迷津。谢谢了
...全文
445 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2017-09-14
  • 打赏
  • 举报
回复
引用 5 楼 qq_34101912 的回复:
[quote=引用 3 楼 z10843087 的回复:] [quote=引用 2 楼 qq_34101912 的回复:] [quote=引用 1 楼 z10843087 的回复:] 换个环境,比如换个服务器试试先
这也还没过,全用的是本地的,本地都没弄明白,换到其他服务器上,怕会更糊涂[/quote] 那就换台机器先试试[/quote] 怎么感觉您像我老家的网管[/quote] 。。。。。。有这么帅的网管吗
qq_34101912 2017-09-14
  • 打赏
  • 举报
回复
引用 3 楼 z10843087 的回复:
[quote=引用 2 楼 qq_34101912 的回复:] [quote=引用 1 楼 z10843087 的回复:] 换个环境,比如换个服务器试试先
这也还没过,全用的是本地的,本地都没弄明白,换到其他服务器上,怕会更糊涂[/quote] 那就换台机器先试试[/quote] 怎么感觉您像我老家的网管
qq_34101912 2017-09-14
  • 打赏
  • 举报
回复
引用 1 楼 z10843087 的回复:
换个环境,比如换个服务器试试先
还是先试试,谢了哈。
OwenZeng_DBA 2017-09-14
  • 打赏
  • 举报
回复
引用 2 楼 qq_34101912 的回复:
[quote=引用 1 楼 z10843087 的回复:] 换个环境,比如换个服务器试试先
这也还没过,全用的是本地的,本地都没弄明白,换到其他服务器上,怕会更糊涂[/quote] 那就换台机器先试试
qq_34101912 2017-09-14
  • 打赏
  • 举报
回复
引用 1 楼 z10843087 的回复:
换个环境,比如换个服务器试试先
这也还没过,全用的是本地的,本地都没弄明白,换到其他服务器上,怕会更糊涂
OwenZeng_DBA 2017-09-14
  • 打赏
  • 举报
回复
引用 楼主 qq_34101912 的回复:
使用SSDT开发的SSIS项目在SSDT中执行成功,但部署到sql server中后,使用sql job去执行就报出“调用的目标发生了异常”。这里是调用的Microsoft.Office.Interop.Excel.dll这个组件报出的异常

                    //new一个Excel程序对象
                    Microsoft.Office.Interop.Excel.Application Application = new Microsoft.Office.Interop.Excel.Application();
                    
                    //创建一个Workbooks工作簿集合对象
                    Microsoft.Office.Interop.Excel.Workbooks workbooks = Application.Workbooks;
           
                    //创建一个工作簿Workbook
                    Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
           
                    //创建一个Worksheet工作表
                    Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
                      
                    Version = Application.Version;//获取你使用的excel 的版本号

                    if (Convert.ToDouble(Version) < 12)//You use Excel 97-2003
                    {
                        //将保存Excel文件的格式设置为:-4143
                        FormatNum = -4143;
                    }
                    else//you use excel 2007 or later
                    {
                        //将保存Excel文件的格式设置为:56;
                        FormatNum = 56;
                    }
                        
                    string[] cells ;//每行中的单元格数据字符串数组
            

            
                    //定义行号从第二行开始
                    int k = 2;

                    //设置第一行第一列单元格中的值为“*”
                    worksheet.Cells[1, 1] = "*";

                    FileStream fs = new FileStream( WorkPath + fi.Name, FileMode.Open );

                    StreamReader sr = new StreamReader(fs);

                    strLine = sr.ReadLine();

                    //如果文件流读出的行数据不为空时循环
                    while (strLine != null)
                    {
     
                        //将行数据按“\t”指标符分割成字符串数组存入cells数组    
                        cells = strLine.Split('\t');
   
                        //循环cells数组 
                        for (int j = 0; j <= cells.Length-2; j++ ){
   
                            //将cells数组中的元素按下标存入worksheet中的单元格内   
                            worksheet.Cells[k, j+1] = cells[j];

                        }

                        //再将下一行数组读入strLine中
                        strLine = sr.ReadLine();

                        //将行数加1
                        k++;
                    }

                    sr.Close();

                    fs.Close();

            

            
                    //将worksheet加入到workbook中
                    workbook.Worksheets.Add(worksheet);
                  
                    //将workbook以全路径为WorkPath+iBrokerFile,内容格式为FormatNum保存
                    workbook.SaveAs(String.Format(savePath + iBrokerFile, fi.Name.Substring(0,(int)fi.Name.Length - 4)), FormatNum);
             
                    //根据临时文件创建一个FileInfo
                    FileInfo cuInfo = new FileInfo(WorkPath + tmpFile);

                    //用FileInfo来删除临时文件
                    cuInfo.Delete();

                    //cuInfo = new FileInfo(WorkPath + deleteFile);

                    //cuInfo.Delete();

                    //要删除的worksheet工作表名称
                    string DeleteSheetNames = "Sheet2";

            
                    try
                    {
               
                        //循环工作表集合(数组?)             
                        for (int i = 0; i < Application.Worksheets.Count; i++)
                        {
                            //如果有工作表名称==DeleteSheetName
                            if (DeleteSheetNames == ((Microsoft.Office.Interop.Excel.Worksheet)Application.Worksheets[i + 1]).Name)
                            {
                                //屏蔽程序运行过程中出现的各种警告                        
                                Application.DisplayAlerts = false; //注意一定要加上这句
                                ((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[i + 1]).Delete();
                                //开启程序运行过程中出现的各种警告
                                Application.DisplayAlerts = true;//注意一定要加上这句
   
                            }
                        }

                        // 保存并关闭这个工作簿。
                        workbook.Close(Microsoft.Office.Interop.Excel.XlSaveAction.xlSaveChanges, Missing.Value, Missing.Value);

                        //......
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);

                        //将工作簿置空
                        workbook = null;

                    }
                    catch (System.Exception ex)
                    {
                        //将异常消息存入LastError中
                        string LastError = string.Format("WdCalcCode类\n," + ex.Message, "系统提示");
                    }
                    finally
                    {
                        //关闭Excel
                        Application.Quit();
                        //将Excel置空
                        Application = null;

                        //进行即时垃圾回收
                        GC.Collect();
                    }
使用cmd命令行执行DTExec.exe /f "包的全路径名"可以执行成功,32位的64位的DTExec.exe都没问题。 然后我想使用Operating system(CmdExec)方式去执行我用cmd的命令,没有报错但是感觉也没有执行SSIS项目,整个执行流程很快,没有执行结果。 不知道原因在哪里,在百度找了好久没有找到相关的答案,希望有大佬来指点迷津。谢谢了
换个环境,比如换个服务器试试先

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧