无条件的条件表达式中的数据类型无效

时间:2018-10-09 11:34:19

标签: c# wcf ms-access types

我的服务器上有一个Access数据库,这个问题令人难以置信。昨天突然开始蹲下这些东西时,一切都很好

  

条件表达式中的数据类型无效

  • 所以我在机器上进行了测试-正常工作

  • 将该工作代码上传到服务器-同样的错误

  • 将数据库复制到我的机器上-工作正常

数据之间的唯一区别是,如果我将SQL查询值记录到错误消息中,则可以看到Document Date的值在我的PC和服务器上具有不同的格式:< / p>

服务器

@documentDate : 2018-10-09 12:00:00 AM 

本地计算机

@documentDate : 09/10/2018 12:00:00 

所有其他值看起来完全相同。

那么这是与地区/ DateTime格式有关的问题吗?如果是这样,为什么Access不能只接受一个DateTime值并适当地存储它,因为该列的数据类型为Date/Time

真的很感谢一些帮助,这使我发疯。

以下是用于插入记录的代码:

public int InsertAod(Aod aod)
{
    if (CheckAod(aod) > 0)
    {
        Log.Message("This entry already exists");
        return 1; 
    }

    var cmd = new OleDbCommand(Constants.InsertAod);

    cmd.Parameters.AddWithValue("@company", aod.ParentCollection.Company);
    cmd.Parameters.AddWithValue("@businessUnit", aod.ParentCollection.BusinessUnit);
    cmd.Parameters.AddWithValue("@sellerGln", aod.ParentCollection.SellerGln);
    cmd.Parameters.AddWithValue("@messageId", aod.ParentCollection.MessageId);
    cmd.Parameters.AddWithValue("@documentNo", aod.ParentCollection.DocumentNumber);
    cmd.Parameters.AddWithValue("@documentDate", aod.ParentCollection.DocumentDate); // Data type of DocumentDate is DateTime
    cmd.Parameters.AddWithValue("@region", aod.ParentCollection.Region);
    cmd.Parameters.AddWithValue("@storeGln", aod.ParentCollection.StoreGln);
    cmd.Parameters.AddWithValue("@storeCode", aod.ParentCollection.StoreCode);
    cmd.Parameters.AddWithValue("@storeDescription", aod.ParentCollection.StoreDescription);
    cmd.Parameters.AddWithValue("@lineItem", aod.LineItem);
    cmd.Parameters.AddWithValue("@movementType", aod.MovementType);
    cmd.Parameters.AddWithValue("@orderNo", aod.OrderNumber);
    cmd.Parameters.AddWithValue("@reference", aod.ParentCollection.Reference);
    cmd.Parameters.AddWithValue("@barcode", aod.Barcode);
    cmd.Parameters.AddWithValue("@articleNo", aod.PnPArticleNumber);
    cmd.Parameters.AddWithValue("@vendorCode", aod.VendorProductCode);
    cmd.Parameters.AddWithValue("@articleDescription", aod.PnPArticleDescription);
    cmd.Parameters.AddWithValue("@qty", aod.PnPQuantity);

    try
    {
        //throw new Exception("how is this possible");
        return ExecuteCommand(cmd, Execute.Insert);
    }
    catch (Exception e)
    {
        var data = cmd.Parameters.Count.ToString();
        foreach (OleDbParameter parameter in cmd.Parameters)
        {
            data += $" {Environment.NewLine} {parameter.ParameterName} : {parameter.Value} {Environment.NewLine}";
        }
        Log.Error(e, $"Failed to insert AOD for {aod.OrderNumber} - {aod.LineItem}", data);
        return 0;
    }
}

以下是CheckAod的代码:

public int CheckAod(Aod aod)
{
    var cmd = new OleDbCommand(Constants.CountAod);

    cmd.Parameters.AddWithValue("@orderNo", aod.OrderNumber);
    cmd.Parameters.AddWithValue("@messageId", aod.ParentCollection.MessageId);
    cmd.Parameters.AddWithValue("@lineItem", aod.LineItem);

    try
    {
        return ExecuteCommand(cmd, Execute.Count);
    }
    catch (Exception e)
    {
        Log.Error(e, "Failed to call CheckAod");
        throw;
    }
}

还有上面提到的ExecuteCommand

private int ExecuteCommand(OleDbCommand cmd, Execute command)
{
    var output = 0;
    if (!(persistantConnection.State == ConnectionState.Open))
        persistantConnection.Open();

    cmd.Connection = persistantConnection;
    using (cmd)
    {                
        try
        {
            switch (command)
            {
                case Execute.Insert:
                    output = cmd.ExecuteNonQuery();
                    Log.Message("success");
                    break;
                case Execute.Count:
                    output = (int)cmd.ExecuteScalar();
                    break;
            }
        }
        catch (Exception e)
        {
            var data = cmd.Parameters.Count.ToString();
            foreach (OleDbParameter parameter in cmd.Parameters)
            {
                data += $" {Environment.NewLine} {parameter.ParameterName} : {parameter.Value} {Environment.NewLine}";
            }
            Log.Error(e, "Failed to execute command", data);
            throw;
        }
        return output;
    }
}

Constants.InsertAod如下所示:

internal const string InsertAod =
    @"INSERT INTO TAOD ([COMPANY], [BUSINESS UNIT], [SELLER GLN], [MESSAGE ID], [DOCUMENT NO],
        [DOCUMENT DATE], [REGION], [STORE GLN], [STORE CODE], [STORE DESCRIPTION], [LINE ITEM], 
        [MOVEMENT TYPE], [ORDER NO], [REFERENCE], [BARCODE], [PNP ARTICLE NO], 
        [VENDOR PRODUCT CODE], [PNP ARTICLE DESCRIPTION], [PNP QTY])
        VALUES (@company, @businessUnit, @sellerGln, @messageId, @documentNo, @documentDate, @region, 
        @storeGln, @storeCode, @storeDescription, @lineItem, @movementType, @orderNo, @reference,
        @barcode, @articleNo, @vendorCode, @articleDescription, @qty)";

我可以确认上述值与它们在数据库本身中出现的顺序相同。

1 个答案:

答案 0 :(得分:0)

经过一堆混乱之后,我意识到服务器无法将值PnPQuantitystring转换为number(Access数据类型)。

当我尝试明确地执行此操作时,出现此错误

  

System.FormatException:输入字符串的格式不正确。

即使字符串的格式为"18.000"

我更改了代码以包含一个CultureInfo参数:

decimal.Parse(aod.PnPQuantity, CultureInfo.InvariantCulture)

现在可以正常工作了。

我不明白的是,当本地化设置配置为使用18.000作为十进制分隔符时,为什么机器突然无法将.转换为数字:

enter image description here

此外,由于几天前一切正常,这意味着服务器上必须进行了某些更改,但是可能是什么呢?