使用 C# 中的 VFPOLEDB 上的条件子查询插入 .dbf

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

我面临实现查询插入 dbf 的挑战。我正在研究 C#。如果我在 Sql 中使用查询工作正常,但在 VFPOLEDB 上则不行。问题是我不知道如何让它发挥作用。

好的。这就是我所实施的尝试,看看是否有效。 我的询问:

    string query = "INSERT INTO relojj (id, numdoc, fecha, maquina, tipo, veces, sucursal,                     transf, forma, audito, newfld ) " +
                                "VALUES (@id,@numdoc,@fecha,@maquina,@sucursal," +
                                "IIF((SELECT COUNT(id) FROM relojj WHERE numdoc=@numdoc and fecha=@fecha)%2=0 , 'E', 'S')," +
                                "(SELECT COUNT(id) FROM relojj WHERE numdoc=@numdoc and fecha=@fecha)," +
                                "@sucursal,@transf,@forma,@audito,@newfld)";

然后我有一个实例命令将这些值插入到 dbf 中

    command.Parameters.Add("id", OleDbType.VarChar, 5).Value = "1";
    command.Parameters.Add("numdoc", OleDbType.Decimal).Value = 1;      
    command.Parameters.Add("fecha", OleDbType.Date).Value = fecha;
    command.Parameters.Add("maquina", OleDbType.VarChar, 10).Value = "Reloj Rio Grande";
    //command.Parameters.Add("tipo", OleDbType.VarChar, 10).Value = "tipo";
    //command.Parameters.Add("veces", OleDbType.Decimal).Value = 1;
   command.Parameters.Add("sucursal", OleDbType.VarChar, 10).Value = "sucursal";
   command.Parameters.Add("transf", OleDbType.Date).Value = transf;
   command.Parameters.Add("forma", OleDbType.VarChar, 10).Value = "R";
   command.Parameters.Add("audito", OleDbType.VarChar, 10).Value = "Alta Automatica";
   command.Parameters.Add("newfld", OleDbType.VarChar, 10).Value = "newfld";

但是一旦我尝试了它,它就会显示一个错误,让我知道我有 Sintaxis 错误。如果我有一个正常的查询运行正常,但 Iff 甚至 When 情况下,不起作用。 任何想法。 谢谢

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

VFPOLEDB 是 OLEDB 提供程序,它不是 SQL 服务器。它不支持命名参数,这就是您收到语法错误的原因。您需要将所有这些命名参数替换为位置参数(所有以 @ 到 ? 开头的参数)。由于它不支持命名参数,而仅支持位置参数,因此您需要多次提供相同的参数,例如@numdoc,并且需要按顺序执行此操作(?与其位置匹配)。您的查询有点令人困惑,并且对于 SQL Server 或其他后端来说也不合适(您正在为 Tipo 插入 sucursal?作为示例),假设这些是拼写错误,您的查询将看起来像(而不是字符串连接,逐字字符串的可读性更好):

string query = @"INSERT INTO relojj 
        (id, numdoc, fecha, maquina, tipo, veces, 
        sucursal, transf, forma, audito, newfld )
        VALUES 
        (?,?,?,?,?,?
        IIF((SELECT COUNT(id) FROM relojj WHERE numdoc=? and fecha=?)%2=0 , 'E', 'S'),
        (SELECT COUNT(id) FROM relojj WHERE numdoc=? and fecha=?),
        ?,?,?,?,?)";
                           

command.Parameters.Add("id", OleDbType.VarChar, 5).Value = "1";
command.Parameters.Add("numdoc", OleDbType.Decimal).Value = 1;
command.Parameters.Add("fecha", OleDbType.Date).Value = fecha;
command.Parameters.Add("maquina", OleDbType.VarChar, 10).Value = "Reloj Rio Grande";
command.Parameters.Add("tipo", OleDbType.VarChar, 10).Value = "tipo";
command.Parameters.Add("veces", OleDbType.Decimal).Value = 1;

command.Parameters.Add("numdoc1", OleDbType.Decimal).Value = 1;
command.Parameters.Add("fecha1", OleDbType.Date).Value = fecha;

command.Parameters.Add("numdoc2", OleDbType.Decimal).Value = 1;
command.Parameters.Add("fecha2", OleDbType.Date).Value = fecha;

command.Parameters.Add("sucursal", OleDbType.VarChar, 10).Value = "sucursal";
command.Parameters.Add("transf", OleDbType.Date).Value = transf;
command.Parameters.Add("forma", OleDbType.VarChar, 10).Value = "R";
command.Parameters.Add("audito", OleDbType.VarChar, 10).Value = "Alta Automatica";
command.Parameters.Add("newfld", OleDbType.VarChar, 10).Value = "newfld";

编辑:请注意,参数名称仅供开发人员使用,所有参数均按其位置顺序匹配。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.