构建索引键时出错....路径标签“nameIndex”DBF

问题描述 投票:0回答:1

大家好,我有以下代码

       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 并使用带有表达式的标签

c# visual-foxpro dbf
1个回答
0
投票

您提供的文件名与错误消息中的文件名不匹配。这让我认为您正在跳过有关文件的一些详细信息。您说的是“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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.