Magicodes.IE icon indicating copy to clipboard operation
Magicodes.IE copied to clipboard

[解决: 升级两个包] 可空字段数据为 null 升级库到2.7.1后报错 Please use DBNull instead

Open densen2014 opened this issue 2 years ago • 17 comments

Actual behaviour

可空字段数据为 null , 以前版本都顺利能导出 PDF, 新版报错

System.ArgumentException:“Cannot set Column 'UnitPrice2' to be null. Please use DBNull instead.”

I'm seeing this behaviour on

  • [ ] Magicodes.IE.Excel
  • [x] Magicodes.IE.Pdf
  • [x] Magicodes.IE.Word
  • [ ] Magicodes.IE.Csv
  • [x] Magicodes.IE.Html
  • [ ] Magicodes.IE.AspNetCore

package versions

Magicodes.IE.Core.2.8.0.zip

    <PackageReference Include="Magicodes.IE.Core" Version="2.7.2" />
    <PackageReference Include="Magicodes.IE.Excel" Version="2.7.2" />
    <PackageReference Include="Magicodes.IE.Html" Version="2.7.2" />
    <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.2" />
    <PackageReference Include="Magicodes.IE.Word" Version="2.7.2" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.2" />

临时解决方案 2022-12-27

  1. 重新编译一次 Magicodes.IE.Core

Magicodes.IE.Core.2.8.0.zip

  1. 工程引用或者升级这两个包, 包括net4.6.1下pdf不能生成问题
        <PackageReference Include="HtmlToOpenXml.dll" Version="2.3.0" />
        <PackageReference Include="Haukcode.WkHtmlToPdfDotNet" Version="1.5.86" />

So how can we reproduce this?

测试代码

public partial class Program
{

    public partial class Foo
    {
        public decimal UnitPrice { get; set; } = 1;
        public decimal? UnitPrice2 { get; set; } = null;
    }

    public static async Task 测试IE()
    {

        var filePath = Path.Combine(Directory.GetCurrentDirectory(), "xxxx");
        var items = new List<Foo>() { new Foo() };

        var exporter = new ExcelExporter();
        var result = await exporter.Export(filePath + ".xlsx", items);
        Console.WriteLine(result.FileName);

        var exporterWord = new WordExporter();
        var resultWord = await exporterWord.ExportListByTemplate(filePath + ".docx", items);
        Console.WriteLine(resultWord.FileName);

        var exporterPdf = new PdfExporter();
        var resultPdf = await exporterPdf.ExportListByTemplate(filePath + ".pdf", items);
        Console.WriteLine(resultPdf.FileName);

        var exporterHtml = new HtmlExporter();
        var resultHtml = await exporterHtml.ExportListByTemplate(filePath + ".html", items);
        Console.WriteLine(resultHtml.FileName);
    }

} 

除了ExcelExporter能跑过, 下面三个都报同样错误 System.ArgumentException:“Cannot set Column 'UnitPrice2' to be null. Please use DBNull instead.”

很奇怪的是这段代码添加到 src\Magicodes.ExporterAndImporter.Tests\PdfExporter_Tests.cs 测试能跑过. 如图 PdfExporter_Tests.cs

image

demo

ConsoleAppTest.zip

densen2014 avatar Dec 16 '22 03:12 densen2014

测试代码连接到源码调试也能成功通过, 没有出错

densen2014 avatar Dec 16 '22 14:12 densen2014

收到,感谢!可能和.NET框架版本有关。您这边是在.NET哪个版本下报错?

xl-wenqiang avatar Dec 19 '22 05:12 xl-wenqiang

demo我附上了,.net7.0Densen informatica在 2022年12月19日,06:56,xl-wenqiang @.***> 写道: 收到,感谢!可能和.NET框架版本有关。您这边是在.NET哪个版本下报错?

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you authored the thread.Message ID: @.***>

densen2014 avatar Dec 19 '22 07:12 densen2014

在单元测试中,即时是使用.NET 7进行测试问题也不会出现。初步判断可能与Razor有关,后续进行跟踪优化。

xl-wenqiang avatar Dec 23 '22 07:12 xl-wenqiang

我自己本地编译发布包来用没问题,所以是不是可以直接编译再发一个版本?

densen2014 avatar Dec 23 '22 08:12 densen2014

在单元测试中,即时是使用.NET 7进行测试问题也不会出现。初步判断可能与Razor有关,后续进行跟踪优化。

确认更新 htmltoopenxml.dll 版本可以解决问题

densen2014 avatar Dec 26 '22 23:12 densen2014

工程引用或者升级这两个包,可以解决问题, 包括net4.6.1下pdf不能生成问题

        <PackageReference Include="HtmlToOpenXml.dll" Version="2.3.0" />
        <PackageReference Include="Haukcode.WkHtmlToPdfDotNet" Version="1.5.86" />

densen2014 avatar Dec 27 '22 01:12 densen2014

收到,感谢!

xl-wenqiang avatar Dec 27 '22 01:12 xl-wenqiang

@densen2014 你可以试试最新的包2.7.2有没有问题,我更新了Haukcode.WkHtmlToPdfDotNet

xl-wenqiang avatar Dec 27 '22 08:12 xl-wenqiang

@xl-wenqiang 看到新包已经第一时间测试过了, 应该是跟我自己工程引用包有一定关系. 我有net4.8和net7.0两个环境, 覆盖winforms, webapi和blazor等等

还是报错

  1. net4.8导出pdf报错NotSupportedException: Unable to load native library. The platform may be missing native dependencies (libjpeg62, etc). Or the current platform is not supported.

    使用<PackageReference Include="Haukcode.WkHtmlToPdfDotNet" Version="1.5.86" />解决

  2. net7.0导出excel/html/pdf报错System.ArgumentException:“Cannot set Column 'UnitPrice2' to be null. Please use DBNull instead.”

    Magicodes.IE.Core 本机发布解决问题.

我最终能用的方案是

       //Magicodes.IE.Core 本机发布的,否则会报 System.ArgumentException:“Cannot set Column 'UnitPrice2' to be null. Please use DBNull instead.”
        <PackageReference Include="Magicodes.IE.Core" Version="2.8" /> 
        <PackageReference Include="Magicodes.IE.Excel" Version="2.7.2" />
        <PackageReference Include="Magicodes.IE.Html" Version="2.7.2" />
        <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.2" />
        <PackageReference Include="Magicodes.IE.Word" Version="2.7.2" />


        <PackageReference Include="HtmlToOpenXml.dll" Version="2.3.0" />
        <PackageReference Include="Haukcode.WkHtmlToPdfDotNet" Version="1.5.86" />

测试代码

    <TargetFrameworks>net7.0;net48</TargetFrameworks>

        <PackageReference Include="Magicodes.IE.Core" Version="2.7.2" />
        <PackageReference Include="Magicodes.IE.Excel" Version="2.7.2" />
        <PackageReference Include="Magicodes.IE.Html" Version="2.7.2" />
        <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.2" />
        <PackageReference Include="Magicodes.IE.Word" Version="2.7.2" />

    public static async Task 测试IE()
    {
        var sw = Stopwatch.StartNew();
        var filePath = Path.Combine(Directory.GetCurrentDirectory(), "xxxx");
        var items = new List<Foo>() { new Foo() };

        try
        {
            var exporter = new ExcelExporter();
            var result = await exporter.Export(filePath + ".xlsx", items);
            Console.WriteLine(result.FileName);
            Console.WriteLine(sw.Elapsed.TotalSeconds);

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        sw.Restart();

        try
        {
            var exporterWord = new WordExporter();
            var resultWord = await exporterWord.ExportListByTemplate(filePath + ".docx", items);
            Console.WriteLine(resultWord.FileName);
            Console.WriteLine(sw.Elapsed.TotalSeconds);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        sw.Restart();

        try
        {
            var exporterHtml = new HtmlExporter();
            var resultHtml = await exporterHtml.ExportListByTemplate(filePath + ".html", items);
            Console.WriteLine(resultHtml.FileName);
            Console.WriteLine(sw.Elapsed.TotalSeconds);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        sw.Restart();

        try
        {
            var exporterPdf = new PdfExporter();
            var resultPdf = await exporterPdf.ExportListByTemplate(filePath + ".pdf", items);
            Console.WriteLine(resultPdf.FileName);
            Console.WriteLine(sw.Elapsed.TotalSeconds);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        sw.Restart();
    }

densen2014 avatar Dec 27 '22 13:12 densen2014

@densen2014 你可以试试最新的包2.7.2有没有问题,我更新了Haukcode.WkHtmlToPdfDotNet

难道你说的是2.7.3? 我再测测

这个我也不知道怎么整了 ExcelExporter 报错 System.IO.FileLoadException:“未能加载文件或程序集“Collections.Pooled, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。需要强名称程序集。 (异常来自 HRESULT:0x80131044)”

densen2014 avatar Dec 27 '22 13:12 densen2014

收到。2.7.3的问题解决了吗?

xl-wenqiang avatar Dec 28 '22 05:12 xl-wenqiang

没解决。

densen2014 avatar Dec 28 '22 09:12 densen2014

而且会有这个问题, 我只能 Magicodes.IE.Core 本机发布

image

densen2014 avatar Dec 28 '22 11:12 densen2014

收到

xl-wenqiang avatar Dec 29 '22 01:12 xl-wenqiang

而且会有这个问题, 我只能 Magicodes.IE.Core 本机发布

image

已确定这个导出的问题是最近的一个提交存在Bug,麻烦更新到[2.7.4.1]后再试试。

xl-wenqiang avatar Jan 03 '23 11:01 xl-wenqiang

我已经用我前面土办法处理了。搞了一周多,等你们发布新版哈,最好同时测试一下nf48和core

densen2014 avatar Jan 03 '23 11:01 densen2014