我正在尝试从简单的选择中填充数据表:
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搜索解决方案时失败了。
答案 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 column1
或where 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)