Visual Studio 如何在C#中从sharepoint API将字符串值转换为日期?

pjngdqdw  于 2022-12-23  发布在  C#
关注(0)|答案(2)|浏览(144)

我在转换C#中名为OpeningDate的列的值时遇到问题当我尝试转换值为空的位置时,输出“返回错误字符串解析”
我用C#试了下面的代码

// Get items from sharepoint list
  try
        {
            context.Load(items, its => its.Include(
            i => i.Id,
            i => i["SOQAssignmentCode"],
            i => i["OpeningDate"]
            ));
        }
        catch (Exception d)
        {
            ComponentMetaData.FireError(0, "", "Error on Load context SP Source." + d.Message, "", 0, out vbool);
        }
        try
        {
            context.ExecuteQuery();
        }
        catch (Exception d)
        {
            ComponentMetaData.FireError(0, "", "Error on ExecuteQuery SP Source." + d.Message, "", 0, out vbool);
        }

似乎失败的转换过程

try
        {
            //Récupérations des données
            string ac = string.Empty;
            string ast = string.Empty;
            string dateValue = null;
            string emptyString = "01/01/1900 00:00:00";
            string dateValue4 = null;



            foreach (ListItem listItem in items)
            {

                dateValue = listItem["OpeningDate"]?.ToString() ?? emptyString;
                dateValue4 = listItem["OpeningDate"]?.ToString() ?? null;

                var dateValue2 = DateTime.ParseExact(dateValue4,"yyyy/mm/dd", null);

                if (listItem["SOQAssignmentCode"] != null)
                {
                    foreach (ListItem item_not_to_take in listItems_not_to_take)
                    {
                        if (listItem["SOQAssignmentCode"].ToString() != item_not_to_take["SOQAssignmentCode"].ToString())

                            // MessageBox.Show(item_not_to_take["SOQAssignmentCode"].ToString());
                            ac = listItem["SOQAssignmentCode"].ToString();
                        
                        Output0Buffer.AddRow();
                        Output0Buffer.SOQAssignmentCode = ac;
                        Output0Buffer.SOQOpeningDate = dateValue2;
                        Output0Buffer.SPID = listItem.Id;

将字符串转换为日期值是否是一种更简单的方法?为什么转换对于空/空值似乎失败了?

ccgok5k5

ccgok5k51#

代码将日期转换为字符串,位置为:

dateValue = listItem["OpeningDate"]?.ToString() ?? emptyString;
dateValue4 = listItem["OpeningDate"]?.ToString() ?? null;

真实的的解决方案是 * 不 * 首先转换为字符串,而是将其值强制转换为正确的类型,例如:

var openingDate = (DateTime?) listItem["OpeningDate"];

这同样适用于其他字段和类型,而不是在文本字段上调用ToString(),只需将值转换为正确的类型。
变量本身应该在循环内部声明,而不是在循环外部声明,否则很容易在得到新值之前使用上一次迭代的值。
例如,在问题的代码中,ac保留了前一次迭代的值,内部循环结束时对同一个输出缓冲区进行多次赋值,listItems_not_to_take中的每一项赋值一次
最后,SharePoint列表不是数据库表。遍历它和访问值的代价很高。与其检查listItems_not_to_take中的每一项,不如提取字典或哈希集中不允许的代码,并使用“包含”进行检查:
这个代码片段没有受到可变分数蠕变的影响:

var excluded=listItems_not_to_take.Select(item=>(string)item["SOQAssignmentCode"])
                                  .ToHashSet();

foreach (ListItem listItem in items)
{
    var openingDate=(DateTime?)listItem["OpeningDate"];
    var code = (string)listItem["SOQAssignmentCode"];

    if (code!=null && !excluded.Contains(code))
    {
        Output0Buffer.AddRow();
        Output0Buffer.SOQAssignmentCode = code;
        Output0Buffer.SOQOpeningDate = openingDate;
        Output0Buffer.SPID = listItem.Id;
    }
}
qco9c6ql

qco9c6ql2#

需要更改代码中的以下值

var dateValue4 = (DateTime?)listItem["OpeningDate"] ?? new DateTime(1900,1,1);

相关问题