繁体   English   中英

PostgreSQL“列“ foo”不存在”

[英]PostgreSQL “Column ”foo“ does not exist”

我正在尝试为我的程序创建一种搜索方法。 在搜索页面中,用户可以搜索8个变量。例如,如果用户仅在“名称:”中键入,则此方法将根据名称进行选择。 如果用户也决定键入“ Id:”,则此方法将根据两者进行选择。 我原来有8个变量。

好吧...每当我尝试搜索时,都会收到“列'sth'不存在”的消息。 如果仅输入名称,则表示“名称”列不存在。 与ID相同,但它表示不存在cloumn'Id'。

我不知道是什么问题。 这可能与准备好的语句有关。 顺便说一下,我的null搜索有效。

    public ObservableCollection<Foo> Search(Foo foo)
    {
        ObservableCollection<Foo> results = new ObservableCollection<Foo>();

        IdParam = new NpgsqlParameter("@Id", NpgsqlTypes.NpgsqlDbType.Bigint);
        NameParam = new NpgsqlParameter("@Name", NpgsqlTypes.NpgsqlDbType.Varchar, 50);

        string sql;

        //Null search
        if (intern == null) 
            sql = "select * from \"Foos\"";
        else
        {    
            sql = "select * from \"Foos\" ";
            int parameterCount = 0;

            //This part goes too long, So I just put 2 sample of it. I have 8 parameters in the  
            //original
            if (foo.Id > 0)
            {
                if (parameterCount == 0)
                    sql += "WHERE \"Id\"=";
                if (parameterCount > 0)
                    sql += "AND \"Id\"=";
                IdParam.Value = foo.Id;
                    sql += "@Id ";
                parameterCount++;
            }

            if (foo.Name != "" && foo.Name != null)
            {
                if (parameterCount == 0)
                    sql += "WHERE \"Name\"=";
                if (parameterCount > 0)
                    sql += "AND \"Name\"=";
                NameParam.Value = foo.Name;
                    sql += "@Name ";
                parameterCount++;
            }

        }
        try
        {
            NpgsqlCommand cmd = new NpgsqlCommand(sql, dbConnection);
            NpgsqlDataReader dr = cmd.ExecuteReader();  //This line gives the error
            Intern result = new Intern();
            while (dr.Read())
            {
                result.Id = (long)dr.GetInt64(dr.GetOrdinal("Id"));
                result.Name = dr.GetString(dr.GetOrdinal("Name"));

                results.Add(result);
                result = new Intern();
            }
            return results;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return null;
        }
    }

当我不使用准备好的语句时,它就起作用了!

           if (intern.Id > 0)
            {
                if (parameterCount == 0)
                    sql += "WHERE \"Id\"=";
                if (parameterCount > 0)
                    sql += "AND \"Id\"=";

                //IdParam.Value = intern.Id;
                //sql += "@Id ";

                sql += intern.Id + " ";  //When I do this, it works.
                parameterCount++;
            }

我该怎么做才能解决这个问题?

构建SQL字符串是一个实践中充斥着许多问题的实践。 如您现在所见,故障排除是一个真正的难题。 然后,您之后的那个家伙在尝试进行操作时必须了解发生了什么...

一种方法是编写查询,因此无需执行任何文本更改。 如:

@SQL = "select * from \"foos\" "
     + "where (@ID is null or \"ID\" = @ID) "
     + "  and (@Name is null or \"Name\" = @Name) "
     + "  and (@so_forth...)"

因此,如果@Name中有一个值,则该值将不会为null,并且该值将用于检查该列。 如果不是,它将为null并跳过测试(将其读取为“ ... and TRUE and ...”。

关键是,现在您每次都执行相同的查询,只有值会更改。 当某件事情无法按您认为的方式正常工作时,进行故障排除会容易得多。

好吧,我忘了在命令中添加参数,这就是为什么出现此错误的原因。

所以我修复了它,它起作用了!

            if (intern.Id > 0)
            {
                if (parameterCount == 0)
                    sql += "WHERE \"Id\"=";
                if (parameterCount > 0)
                    sql += "AND \"Id\"=";
                IdParam.Value = intern.Id;
                sql += "@Id ";

                cmd.Parameters.Add(IdParam);
                parameterCount++;
            }

            if (intern.Name != "" && intern.Name != null)
            {
                if (parameterCount == 0)
                    sql += "WHERE \"Name\" ILIKE ";
                if (parameterCount > 0)
                    sql += "AND \"Name\" ILIKE ";
                NameParam.Value = intern.Name;
                sql += "@Name ";

                cmd.Parameters.Add(NameParam);
                parameterCount++;
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM