We have this simple table:
Code: Select all
CREATE TABLE test_table
(
f1 character varying(2) NOT NULL,
f2 integer NOT NULL,
f3 integer NOT NULL,
f4 integer NOT NULL,
f5 boolean,
f6 numeric(44,30),
CONSTRAINT pk_test_table PRIMARY KEY (f1, f2 , f3 , f4 )
)
WITH (
OIDS=FALSE
);
Code: Select all
CREATE OR REPLACE FUNCTION SaveTestData(p_f1 character varying, p_f2 integer, p_f3 integer[], p_f4 integer[], p_f6 numeric[])
RETURNS void AS
$BODY$
begin
insert into test_table (f1, f2, f3, f4, f5, f6)
select p_f1, p_f2, p_f3[s], p_f4[s], false, p_f6[s]
from generate_series(1,array_upper(p_f3,1)) as s;
end;
$BODY$
LANGUAGE plpgsql
Code: Select all
private void AddParameter(PgSqlCommand comm, string parameterName, PgSqlType parameterType, int parameterSize, object parameterValue)
{
if (parameterType == PgSqlType.VarChar && parameterSize == 0)
comm.Parameters.Add(new PgSqlParameter(parameterName, parameterType, parameterSize) { Value = null, Direction = ParameterDirection.Input });
else
comm.Parameters.Add(new PgSqlParameter(parameterName, parameterType, parameterSize) { Value = parameterValue, Direction = ParameterDirection.Input });
}
private void AddArrayParameter(PgSqlCommand comm, string name, PgSqlType type, object[] array)
{
if (array.Length==0)
comm.Parameters.Add(new PgSqlParameter(name, PgSqlType.Array) { Value = null });
else
comm.Parameters.Add(new PgSqlParameter(name, PgSqlType.Array) { Value = new PgSqlArray(array, type, 1, array.Length) });
}
private void SaveData(string f1, int f2, int[] f3, int[] f4, decimal[] f6)
{
string connectionString = @"Server=-------; Port=-----; Database=-----; User Id=------; Password=--------";
using (PgSqlConnection conn = new PgSqlConnection(connectionString))
{
conn.Open();
PgSqlCommand command = new PgSqlCommand("savetestdata", conn);
command.CommandType = CommandType.StoredProcedure;
AddParameter(command, "p_f1", PgSqlType.VarChar, f1.Length, f1);
AddParameter(command, "p_f2", PgSqlType.Int, 0, f2);
AddArrayParameter(command, "p_f3", PgSqlType.Int, Array.ConvertAll(f3, delegate(int value) { return (object)value; }));
AddArrayParameter(command, "p_f4", PgSqlType.Int, Array.ConvertAll(f4, delegate(int value) { return (object)value; }));
AddArrayParameter(command, "p_f6", PgSqlType.Numeric, Array.ConvertAll(f6, delegate(decimal value) { return (object)value; }));
command.ExecuteNonQuery(); --> PgSqlException: incorrect binary data format in bind parameter 5
conn.Close();
}
}
Thanks!!