postgresql 如果对多列使用Select,如何从Npgsql获取值

uqzxnwby  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(2)|浏览(197)

例如,如果我有以下查询:

SELECT (column1, column2, column3) FROM table

然后我运行了ExecuteReader()。如果column 1和column 3是字符串,column 2是一个整数ID。我如何从每一列中获取值?我尝试了阅读器中的普通Get函数,我总是得到一个转换异常错误,无法将数据库类型转换为string/int
/ Edit这是我的测试代码:

conn1.Open();
            string sql_reader = "SELECT (id, employee_number, first_name, last_name) FROM employee";
            using var cmd_reader = new NpgsqlCommand(sql_reader, conn1);

            var reader = cmd_reader.ExecuteReader();
            while (reader.Read())
            {
                System.Diagnostics.Debug.WriteLine(reader.GetFieldValue<int>(0));
            }
            conn1.Close();

如果我运行这段代码,我会得到一个“System.InvalidCastException”。如果我将reader.GetFieldValue<int>(0)更改为reader.GetFieldValue<string>(1),我会得到一个超出范围的错误“列必须介于0和0之间”。

4szc88ey

4szc88ey1#

去掉括号。
在所有其他数据库中,它们都是无用的噪音,但在Postgres中,表达式(column1, column2, column3)创建了一个匿名记录--所以您的结果只包含一列(即包含三个字段的匿名记录)。
例如,该样本数据:

create table t1 (c1 int, c2 int, c3 int);
insert into t1 values (1,2,3);

那么这个查询:

select (c1, c2, c3) as rec
from t1;

退货:

rec    
-------
(1,2,3)

但是这个

select c1, c2, c3
from t1;

返回预期结果

c1 | c2 | c3
---+----+---
 1 |  2 |  3

Online example

mqkwyuun

mqkwyuun2#

具体地说,在您的示例中,每一行将由长度等于4的对象数组组成。

conn1.Open();
string sql_reader = "SELECT (id, employee_number, first_name, last_name) FROM employee";
using var cmd_reader = new NpgsqlCommand(sql_reader, conn1);

using var reader = cmd_reader.ExecuteReader();
while (reader.Read())
{
    var value = reader.GetFieldValue<object[]>(0);//value.Length is 4
    //I assumed that "id" and "employee_number" are int in your table.
    //reader.GetFieldValue<int>(0) is id
    //reader.GetFieldValue<int>(1) is employee_number
    //...
    System.Diagnostics.Debug.WriteLine(reader.GetFieldValue<int>(0));
}
conn1.Close();

如果您需要了解请求将返回什么,那么只需检查:

var fType = reader.GetFieldType(0);// object[] type will be returned for your request
var fieldCountsInRow = reader.FieldCount;//it will be equal to 1

正如其他答案中提到的,如果去掉括号,将如下所示:

conn1.Open();
string sql_reader = "SELECT id, employee_number, first_name, last_name FROM employee";
using var cmd_reader = new NpgsqlCommand(sql_reader, conn1);

using var reader = cmd_reader.ExecuteReader();
while (reader.Read())
{
    System.Diagnostics.Debug.WriteLine(reader.GetFieldValue<int>(0));id
    System.Diagnostics.Debug.WriteLine(reader.GetFieldValue<int>(1));//employee_number
}
conn1.Close();

相关问题