首先,这是我到目前为止所得到的:
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();
它有效。
答案 0 :(得分:2)
而不是设置架构尝试:
set search_path to 'schema'
set schema
应该是别名的,但也许别名在NpgSQL中不起作用
我要尝试的另一件事是运行set search_path作为它自己的命令,然后将查询作为下一个命令运行..
要检查的第三件事是,用户是否有权在该架构中读取该表。