C# SQL命令未返回特定记录

C# SQL命令未返回特定记录,c#,sql,firebird,C#,Sql,Firebird,我有一个C语言的程序,可以从第三方程序访问旧的Firebird 1.5数据库。我使用的其中一种方法是通过id获取报价或项目的数据:抱歉,这里有一些葡萄牙语单词 public static List<object> GetFollowUpData(int id, TipoFollowUp tipo) { var res = new List<object>(); string q = tipo == TipoFollowUp.Orca

我有一个C语言的程序,可以从第三方程序访问旧的Firebird 1.5数据库。我使用的其中一种方法是通过id获取报价或项目的数据:抱歉,这里有一些葡萄牙语单词

public static List<object> GetFollowUpData(int id, TipoFollowUp tipo)
    {
        var res = new List<object>();
        string q = tipo == TipoFollowUp.Orcamento
            ? "SELECT ('Q-' || c.CLIENT_CODE || q.CQUO_FNUMB) as Codigo, q.CQUO_NAME as Nome, q.CQUO_SENT as Data, q.CQUO_TOTAL as Total, c.CLIENT_NAME as Empresa, m.CCON_NAME as Contacto, ((CASE WHEN m.CCON_PHONE1 IS null then '' else m.CCON_PHONE1 end) || '/' || (CASE WHEN m.CCON_PHONE2 IS null then '' else m.CCON_PHONE2 end) || '/' || (CASE WHEN m.CCON_PHONE3 IS null then '' else m.CCON_PHONE3 end) || '/' || (CASE WHEN m.CCON_PHONE4 IS null then '' else m.CCON_PHONE4 end) || '/' || (CASE WHEN c.CLIENT_PHONE1 IS null then '' else c.CLIENT_PHONE1 end) || '/' || (CASE WHEN c.CLIENT_PHONE2 IS null then '' else c.CLIENT_PHONE2 end) || '/' || (CASE WHEN c.CLIENT_PHONE3 IS null then '' else c.CLIENT_PHONE3 end) || '/' || (CASE WHEN c.CLIENT_PHONE4 IS null then '' else c.CLIENT_PHONE4 end)) as Telefones FROM CMULTIQUOTES q, CLIENTS c, CCONTACTS m WHERE q.ID = @id AND c.CLIENT_ID = q.CLIENT_ID AND q.CLIENT_PM = m.CCON_ID"
            : "SELECT q.PROJ_CODE as Codigo, q.PROJ_NAME as Nome, q.PROJ_COMPLETED as Data, (select sum(j.CJOB_TOTAL) from CJOBS j where j.PROJ_ID = @id) as Total, c.CLIENT_NAME as Empresa, m.CCON_NAME as Contacto, ((CASE WHEN m.CCON_PHONE1 IS null then '' else m.CCON_PHONE1 end) || '/' || (CASE WHEN m.CCON_PHONE2 IS null then '' else m.CCON_PHONE2 end) || '/' || (CASE WHEN m.CCON_PHONE3 IS null then '' else m.CCON_PHONE3 end) || '/' || (CASE WHEN m.CCON_PHONE4 IS null then '' else m.CCON_PHONE4 end) || '/' || (CASE WHEN c.CLIENT_PHONE1 IS null then '' else c.CLIENT_PHONE1 end) || '/' || (CASE WHEN c.CLIENT_PHONE2 IS null then '' else c.CLIENT_PHONE2 end) || '/' || (CASE WHEN c.CLIENT_PHONE3 IS null then '' else c.CLIENT_PHONE3 end) || '/' || (CASE WHEN c.CLIENT_PHONE4 IS null then '' else c.CLIENT_PHONE4 end)) as Telefones FROM PROJECTS q, CLIENTS c, CCONTACTS m WHERE q.PROJ_ID = @id AND c.CLIENT_ID = q.CLIENT_ID AND q.CLIENT_PM = m.CCON_ID";
        using (var cmd = new FbCommand(q) {CommandType = CommandType.StoredProcedure})
        using (cmd.Connection = new FbConnection(ConnectionString))
        {
            cmd.Connection.Open();
            cmd.Parameters.Add("@id", id);
            using (FbDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    res.Add(id); // ID
                    res.Add(reader[0]); // Código
                    res.Add(reader[1]); // Nome
                    res.Add(reader[2]); // Data
                    res.Add(reader[3]); // Total
                    res.Add(reader[4]); // Empresa
                    res.Add(reader[5]); // Contacto
                    res.Add(reader[6]); // Telefones
                    res.Add(tipo); // Tipo
                }
                reader.Close();
            }
            cmd.Connection.Close();
        }
        return res;
    }
这在大多数情况下都有效——但对于特定项目,它不会返回任何项目id 8771的数据

我将第二个查询复制粘贴到FlameRobin中,将其连接到数据库,并将查询中的@id替换为8771,FlameRobin返回我想要的数据

那么,如果FlameRobin可以使用我的查询获取数据,为什么我的程序也不能获取呢? 在我上面的方法中,Reader.Read imedital返回false,并且我没有从该项目的数据库中获得任何数据。据我所知,到目前为止,其他项目和报价在返回数据方面没有问题

有人有什么想法吗?

对不起大家 我花了半个上午的时间终于弄明白我在VS下的程序中使用了我的开发/测试数据库副本,并连接到了FlameRobin中的生产副本

tw数据库之间缺乏同步是导致此问题的原因

有问题的项目存在于生产拷贝中——因此FlameRobin展示了它——但不存在于程序使用的开发/测试拷贝中


抱歉

无法读取的记录数据是什么?是否有任何奇怪的字符嵌入换行符、null或其他奇怪的字符,任何为null但不在任何其他记录中的列?@KlasLindbäck根据所返回数据的长度为null或空。我不能准确地发布数据本身,因为它包含来自客户的个人数据,但没有显示换行符或空字符-不确定奇怪字符的含义我看到您有两个不同的select语句。你在FlameRobin中都试过了吗?@KlasLindbäck一个是引号,一个是项目-我已经检查过了,它在这个特定的项目中使用了底部的一个,所以另一个不起作用-就工作而言,与在这个特定情况下失败的第二个不同,我指的是FlameRobin中返回良好查询的结果在你的程序和一个没有。也许FlameRobin可能隐藏了一些东西,这些东西可能会在你的程序中以特定的结果集抛出一些东西?这些只是胡乱猜测,因为我们看不到数据。