Перед вызовом connection.Open()
вы должны сопоставить свой тип C # с типом базы данных, вызвав NpgsqlConnection.MapCompositeGlobally<>()
с вашим типом C # в <>
(мне интересно, если ваш код, который не имеет <MyType>
часть, даже скомпилированная? Я получаю сообщение об ошибке, если я пытаюсь это сделать.)
...
NpgsqlConnection.MapCompositeGlobally<MyType>( "MySchema.MyType" );
var connection = new NpgsqlConnection( "Host=localhost;Username=postgres;Password=123456;database=testdb" );
...
(MyType
должен иметь открытый конструктор, не принимающий никаких аргументов для NpgsqlConnection.MapCompositeGlobally<>()
, чтобы работать с ним.знать это.)
Кроме того, вы должны установить для свойства SpecificType
типа NpgsqlParameter
тип C #.Это то, что вы, кажется, на самом деле пропустили.(Неважно, где вы это делаете (если только до вызова ExecuteScalar()
и после создания параметра, конечно), например, давайте поместим его после того, как вы установили параметр Value
.)
...
myType.X = 1;
myType.Y = 2;
par.Value = myType;
par.SpecificType = typeof(MyType);
cmd.Parameters.Add( par );
...
Все это объяснено в «Доступ к перечислениям и композитам PostgreSQL» .
Видимо, это станет проще в версии 4.0 Npgsql.Я сам протестировал его с Npgsql версии 3.2.7.
Редактировать:
Другое решение - не указывать NpgsqlDbType
, а передавать объект MyType
в конструкторе.
...
MyType myType = new MyType();
myType.X = 1;
myType.Y = 2;
par = new NpgsqlParameter( "MyType2", myType );
cmd.Parameters.Add( par );
...
Тогда правильный тип Postgres вращается типом сопоставления типа C # и Prostgres, установленным с MapCompositeGlobally<>()
ранее.Явная установка SpecificType
тогда не требуется.