Postgres:datatable中bit_string(1)列的ArgumentException

时间:2014-11-28 09:28:57

标签: c# postgresql datatable

我正在尝试从简单的选择中填充数据表:

 string queryTableData = string.Format("select * from {0}", fullTableName);

 var command = new NpgsqlCommand(queryTableData, connection);
 DataTable table = new DataTable();
 table.Load(command.ExecuteReader());

但如果表格有bit列:

column_name: column1
data_type: bit
character_maximum_length: 1
udt_name: bit

我得到ArgumentException

Type of value has a mismatch with column typeCouldn't store <True> in column1 Column.  Expected type is BitString.

任何想法如何解决?我在google搜索解决方案时失败了。

1 个答案:

答案 0 :(得分:1)

在PostgreSQL方面,true是一种数据类型,bit是另一种数据类型。他们不兼容。

true是布尔值;你不能把布尔作为位。

select cast(true as bit)
ERROR:  cannot cast type boolean to bit

您也无法将bit强制转换为布尔值。

select cast(b'1' as boolean);
ERROR:  cannot cast type bit to boolean

如果必须使用位列,就好像它们是布尔值一样,请使用b&#39; 0&#39;和b&#39; 1&#39;。但是你必须在比较中使用相同的值。像where column1where column1 = true这样的表达式不起作用。您必须使用where column1 = b'1'等表达式。

可以将整数和字符串转换为布尔值。这些都返回布尔值true

select cast(1 as boolean);
select cast(42 as boolean);
select cast('1' as boolean);  -- But cast('42' as boolean) throws a syntax error
select cast('y' as boolean);
select cast('t' as boolean);
select cast('true' as boolean);
select cast('yes' as boolean);

如果我正确理解了您的错误,则在数据库端键入Boolean,并在DataTable端键入bit(n)。如果您不能以某种方式使这些类型兼容(即不同),则可以使用CASE表达式在SQL中转换类型。不过,我不确定这是否适用于您的代码。

select case when column1 = true then b'1'
            when column1 = false then b'0'
            -- Think about what to do with NULL.
       end as boolean_to_bit
from your_table_name;
boolean_to_bit
"bit"
--
1
0
(null)