为PostgreSQL数据库编写查询

时间:2016-03-02 19:12:33

标签: c# postgresql

首先,这是我到目前为止所得到的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;         // Npgsql .NET Data Provider for PostgreSQL

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            NpgsqlConnection conn = new NpgsqlConnection ("Server=127.0.0.1;Port=5432;UserId=postgres;Password=test;Database=dbab;") ;
            conn.Open() ;

            // Define a query
            NpgsqlCommand cmd = new NpgsqlCommand("set schema 'data'; select test_run.id from test_run;", conn);
            cmd.ExecuteNonQuery();

            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    Console.WriteLine(reader.GetString(0));
                }
            }

            // Close connection
            conn.Close();

            System.Console.WriteLine("Press any key to close...");
            Console.ReadKey(); 
        }
    }
}

每当我运行它时,我得到NpgsqlException was unhandled。根据它说:

An unhandled exception of type 'Npgsql.NpgsqlException' occurred in Npgsql.dll
Additional information: External component has thrown an exception.

点击查看详细信息后,会显示:{"42P01: relation \"test_run\" does not exist"}

当我看到这个时,我想也许我的查询有些搞砸了,但它实际上很好,因为我在pgAdmin中运行它,没有找到'test_run'表的问题。

我用Nuget安装了Npgsql -Version 3.0.5和Mono.Security 3.2.3.0。我还在GAC中添加了两个.dll(不知道如何检查)。

另外,我卸载了Npgsql,再次安装它,但是得到了版本2.2.3,仍然遇到了同样的问题。我现在回到版本3.0.5。

我不知道如何解决这个问题,请帮助。

编辑:

正如杰克莫特所说,我需要分解查询。这是我做的:

NpgsqlCommand cmd = new NpgsqlCommand("set schema 'data';", conn);
cmd.ExecuteNonQuery();
NpgsqlCommand cmd2 = new NpgsqlCommand("select test_run.id from test_run;", conn);
cmd2.ExecuteNonQuery();

它有效。

1 个答案:

答案 0 :(得分:2)

而不是设置架构尝试:

set search_path to 'schema'

set schema应该是别名的,但也许别名在NpgSQL中不起作用

我要尝试的另一件事是运行set search_path作为它自己的命令,然后将查询作为下一个命令运行..

要检查的第三件事是,用户是否有权在该架构中读取该表。