1

所以我有一些代码可以从 Smartsheets 创建一个 excel 工作表,然后将该信息从 excel 工作表中提取到 SQL 中。如果我分别运行每个部分,代码就可以工作,但如果我同时运行它,它会创建表,但不会输入数据。下面我将展示主程序中的各个部分。我认为没有必要显示其余代码,因为正如我所说,它是单独工作的。

//Make an Excel sheet from smartsheet
        Smartsheet smartsheet = new Smartsheet();
        long excelSmartsheetID = smartsheet.getSmartSheetID(currentWorkSheet);
        smartsheet.createExcel(excelSmartsheetID);

 //Extract Data From Excel into SQL
        SSIS excelToSQL = new SSIS();
        excelToSQL.storeSmartSheetDataToSQL();

所以我不确定这里发生了什么。我在两个部分之间让线程休眠了 10 秒,但它仍然不起作用。完全不知道可能是什么问题。我应该添加我正在使用 SSIS 连接到 Excel 表并在 SQL 中创建它。如果您需要更多信息,请告诉我。

4

1 回答 1

3

听起来 Excel 文件在尝试第二次访问时仍处于打开状态。当 Excel 文件打开以进行写入时,它会被锁定,这可能会阻止另一个进程(在您的情况下为 SSIS)编辑该文件。这可以使用带有如下代码的 Smartsheet C# SDK 来确认,该代码在写入文件后永远不会关闭文件。

// Set the Access Token
Token token = new Token();
token.AccessToken = "YOUR_TOKEN";

// Use the Smartsheet Builder to create a Smartsheet
SmartsheetClient smartsheet = new SmartsheetBuilder().SetAccessToken(token.AccessToken).Build();
BinaryWriter output = new BinaryWriter(new FileStream("c:\\file.xls", FileMode.Create));
smartsheet.Sheets().GetSheetAsExcel(8325033727682436L, output);
Console.WriteLine("Done writting");
System.Threading.Thread.Sleep(100000);

运行上面的代码,打开并写入文件后,它会休眠很长时间。当代码处于休眠状态时,您可以尝试手动打开 Excel 文件,您将看到如下所示的对话框,显示我们仍然打开了 Excel 文件(来自我们的代码),即使我们完成了写入。

在此处输入图像描述

此问题的解决方案是在我们完成写入后立即关闭 Excel 文件。这可以通过在流上使用 close() 方法或使用using 语句来完成。我更喜欢 using 语句,因此示例如下:

// Set the Access Token
Token token = new Token();
token.AccessToken = "YOUR_TOKEN";

// Use the Smartsheet Builder to create a Smartsheet
SmartsheetClient smartsheet = new SmartsheetBuilder().SetAccessToken(token.AccessToken).Build();
using (BinaryWriter output = new BinaryWriter(new FileStream("c:\\file.xls", FileMode.Create)))
{
    smartsheet.Sheets().GetSheetAsExcel(8325033727682436L, output);
}
Console.WriteLine("Done writting");
System.Threading.Thread.Sleep(100000);

现在,如果我们运行上面的代码,它会在最后休眠,但这次 Excel 文件不会被锁定,因为 using 语句在我们完成写入后立即关闭了文件。

于 2014-12-18T17:43:23.437 回答