代码之家  ›  专栏  ›  技术社区  ›  Bassie

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

  •  0
  • Bassie  · 技术社区  · 6 年前

    我有一个令人难以置信的恼人的问题,访问数据库坐在我们的服务器上。昨天它很好的工作,突然开始蹲在外面

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

    • 已将工作代码上载到服务器-同一错误

    我能看到的数据之间的唯一区别是,如果我将SQL查询值记录到错误消息中,我可以看到 Document Date

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

    本地计算机

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

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

    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 回复  |  直到 6 年前
        1
  •  0
  •   Bassie    6 年前

    PnPQuantity string number (访问数据类型)。

    当我试图明确地这样做的时候,我得到了这个错误

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

    "18.000"

    我修改了代码以包含 CultureInfo 参数:

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

    现在可以正常工作了。

    我不明白的是为什么机器突然不能处理 18.000 . 作为小数分隔符:

    enter image description here

    另外,由于这在几天前运行良好,这意味着服务器上一定发生了一些变化,但这可能是什么呢?