大家好,我有以下代码
string strCadenaConexion = @"X://Personal//Bases";
DBHelperVFPDBF db = new DBHelperVFPDBF(strCadenaConexion);
foreach (var item in lista)
{
string valuesString = $"INSERT INTO relojjcopiaLuis" +
$" (id, numdoc, fecha, maquina, tipo, veces, sucursal, transf, forma, audito, newfld)" +
$" VALUES ('{item.id}',{item.numdoc}," +
$" DATETIME({item.fecha.Year},{item.fecha.Month},"+
$" {item.fecha.Day},{item.fecha.Hour},{item.fecha.Minute},{item.fecha.Second})," +
$" '{item.maquina}','{item.tipo}'," +
$" {item.veces},'{item.sucursal}',DATETIME({item.transf.Year},{item.transf.Month},"+
$" {item.transf.Day},0,0,0)," +
$" '{item.forma}','{item.audito}','{item.newfld}');";
if (db.ProbarConexion())
{
try
{
using (OleDbCommand command = new OleDbCommand(valuesString))
{
db.EjecutarQuery(command);
Log.Error($"Se pudo guardar la informacion {item.numdoc} {item.id} ");
}
}
catch (Exception e)
{
Log.Error("No se pudo guardar la informacion " + e.Message);
}
}
await Task.Delay(delay/lista.Count);
}
log.Information($"Se insertaron {lista.Count} nuevas fichadas al Fox")
如果我们签入VFP管理的文件,就我而言,我参考我的表:
relojj.dbf
relojj.ftp
relojj.cdx
如果我删除 relojj.cdx 文件,插入时没有问题。但是,使用包含索引的 relojj.cdx 文件,我收到以下错误:
Error building key for index "x:\personal\bases\relojjcopiaLuis.cdx" tag "Fecha".
问题出在存储表索引的 cdx 文件中。在本例中,我有一个名为“Fecha”的索引,其表达式如下所示:TTOC(date) + STR(numdoc, 8, 0)。该索引和表达式是在 Visual Fox Pro 中创建的,并且是必需的。我无法删除它们。此 C# 项目每小时插入一次数据,因此不能选择在删除 .cdx 文件后插入数据,然后按照现在的方式重新创建索引。有趣且重要的是要注意的是,如果我删除此表达式并保留简单的 ASC 作为表达式,则不会有任何问题。
我在一些论坛中读到,这可能与字符数有关,而在另一个论坛中,这可能是由于日期格式导致索引重新排序未完成。但是,该表显示的数据是直接从 Visual Fox Pro 插入的。后者更有意义,因为如果我删除表达式,正如我之前提到的,就没有问题,正如您在字段中看到的,日期是“18/10/2023 20:34:15”。
有人对如何纠正这个问题有任何想法吗?
如何使用 cdx create 将数据插入到 dbf 并使用带有表达式的标签
您提供的文件名与错误消息中的文件名不匹配。这让我认为您正在跳过有关文件的一些详细信息。您说的是“relojj”,但在代码中使用“relojjcopiaLuis”。
无论如何,你可以尝试像这样更改代码吗:
string valuesString = @"INSERT INTO relojjcopiaLuis
(id, numdoc, fecha, maquina, tipo, veces, sucursal, transf, forma, audito, newfld)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
using (OleDbConnection cn = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=x:\Personal\Bases"))
using (OleDbCommand command = new OleDbCommand(valuesString, cn))
{
command.Parameters.Add("@id", OleDbType.VarChar);
command.Parameters.Add("@numdoc", OleDbType.Integer);
command.Parameters.Add("@fecha", OleDbType.DBTimeStamp);
command.Parameters.Add("@maquina", OleDbType.VarChar);
command.Parameters.Add("@tipo", OleDbType.VarChar);
command.Parameters.Add("@veces", OleDbType.Integer);
command.Parameters.Add("@sucursal", OleDbType.VarChar);
command.Parameters.Add("@transf", OleDbType.Date);
command.Parameters.Add("@forma", OleDbType.VarChar);
command.Parameters.Add("@audito", OleDbType.VarChar);
command.Parameters.Add("@newfld", OleDbType.VarChar);
cn.Open();
foreach (var item in lista)
{
command.Parameters["@id"].Value = item.id;
command.Parameters["@numdoc"].Value = item.numdoc;
command.Parameters["@fecha"].Value = item.fecha;
command.Parameters["@maquina"].Value = item.maquina;
command.Parameters["@tipo"].Value = item.tipo;
command.Parameters["@veces"].Value = item.veces;
command.Parameters["@sucursal"].Value = item.sucursal;
command.Parameters["@transf"].Value = item.transf;
command.Parameters["@forma"].Value = item.forma;
command.Parameters["@audito"].Value = item.audito;
command.Parameters["@newfld"].Value = item.newfld;
try
{
command.ExecuteNonQuery();
// Log error? Shouldn't it be log.Info?
Log.Error($"Se pudo guardar la informacion {item.numdoc} {item.id} ");
}
catch (Exception e)
{
Log.Error("No se pudo guardar la informacion " + e.Message);
}
}
}