【问题标题】:String not recognized as DateTime using ParseExact in a C# Script inside a biztalk map在 biztalk 地图内的 C# 脚本中使用 ParseExact 无法将字符串识别为 DateTime
【发布时间】:2018-04-13 09:56:23
【问题描述】:

地图的先前工作版本:

在这个版本中,输入数据的类型是 xs:date

地图的目标版本:

在这个版本中,我将平面文件中的数据类型更改为 xs:string。我还添加了新地图中突出显示的以下 C# 脚本:

public static System.DateTime MyConcat(string param1)
{   
    string[] formats = { "yyyy\\/MM\\/dd", "dd-MM-yyyy","yyyy-MM-dd", "dd\\/MM\\/yyyy" };
    return System.DateTime.ParseExact(param1, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None); 
}

我将字符串“2018-03-15”传递给数据输入。

我得到的错误:

ABC.MW.BackEnds.CENTRAL.DocsInformacaoFinanceira.Balancete.Mappers.MapBalancete。错误:转换失败.. ---> System.Reflection.TargetInvocationException:调用目标已引发异常。 ---> System.Xml.Xsl.XslTransformException:调用扩展函数“DateFormat”时出错。有关错误的完整描述,请参阅 InnerException。 ---> System.FormatException:字符串未被识别为有效的日期时间。 at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style)

从错误中我推断出问题是从字符串到日期时间的隐式转换。但我不知道它可能发生在哪里。

我找到了错误的根源。这是之前工作函数中的 scriptoid 调用的方法。

我假设 xs:date 和我的 scriptoid 返回的不是一回事。

给出错误的函数代码:

 public string DateFormat(string value, string FormatoOrigem, string FormatoDestino)
        {
            DateTime myDate;

            if (string.IsNullOrEmpty(value))
                return ""; //myDate = DateTime.MinValue;
            else
                myDate = System.DateTime.ParseExact(value,
                                                FormatoOrigem,
                                                System.Globalization.CultureInfo.InvariantCulture);

            return myDate.ToString(FormatoDestino, System.Globalization.CultureInfo.InvariantCulture);
        }

调用函数的脚本输入:

【问题讨论】:

  • ParseExact has an overload 采用字符串格式数组。你不需要那一系列丑陋的 if。
  • 您没有显示价值是什么,这很难提供帮助。为什么不为您首先尝试转换的值添加一些日志记录? (话虽如此,堆栈跟踪中没有任何内容显示您的方法,因此不清楚它是否被调用...)
  • @Steve 谢谢。我更改并更新了答案
  • @DaisyShipton 我现在添加了它。该错误与“2018-03-15”有关。但我也尝试了 15-03-2018 并得到了同样的错误。
  • 那么您希望您的方法如何被调用?目前我没有看到任何证据表明它正在被调用。

标签: c# biztalk


【解决方案1】:

我们必须专门针对 BizTalk 运行时解决这个问题。所以DateFormat() 是这个错误的来源,所以你需要从那里开始。

另外,请记住,有时 DateTime 是正确的,有时返回 String 是正确的。因此,您需要在某处更改返回类型。

【讨论】:

  • 我找到了 DateFormat,它在下一个 scriptoid 中。我在工作版本中传递了它 xs:date,我认为它是一个 xml 元素。那么我应该在函数中返回一个字符串而不是日期吗?
  • @AntonioCraveiro 真的可以出现在所有四种格式中吗?这很不寻常。
  • 这是项目要求。我也不介意:D。
  • @AntonioCraveiro DateFormat 到底是做什么的?它采用什么输入类型? data 和 anoMes 采用相同的格式吗?
  • @john-305 我发现了错误。早些时候尝试另一种解决方案时,我必须更改脚本 functoid 中的输入顺序。这导致了对 DateFormat 函数的错误调用。我在问题和我发布的答案中添加了一些细节。感谢您的帮助。
【解决方案2】:

DateFormat 函数的参数是日期值和2 种日期格式。 脚本functoid 的调用首先传递格式,最后传递值。 当调用 ParseExact 方法使用格式而不是值时,这将导致函数 DateFormat 出错。

感谢@Daisy Shipton 帮助我发现错误超出了我开发的脚本。 感谢@Johns-305 帮助我找出错误的真正原因。

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多