我的服务器上有一个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)";
我可以确认上述值与它们在数据库本身中出现的顺序相同。
答案 0 :(得分:0)
经过一堆混乱之后,我意识到服务器无法将值PnPQuantity
从string
转换为number
(Access数据类型)。
当我尝试明确地执行此操作时,出现此错误
System.FormatException:输入字符串的格式不正确。
即使字符串的格式为"18.000"
我更改了代码以包含一个CultureInfo
参数:
decimal.Parse(aod.PnPQuantity, CultureInfo.InvariantCulture)
现在可以正常工作了。
我不明白的是,当本地化设置配置为使用18.000
作为十进制分隔符时,为什么机器突然无法将.
转换为数字:
此外,由于几天前一切正常,这意味着服务器上必须进行了某些更改,但是可能是什么呢?