2016-03-13 1 views
0

Ниже приведен запрос postgresql с pg admin iii. (Ниже запрос работает нормально с пг админ и возвращает результирующий набор без каких-либо вопроса)Передача 2D-массива из функции C# в Postgresql

select * from pg_sp_getmainrates_11(9,10,array[[5,10,10,10],[30,20,15,16]]); 

Здесь параметр декларирование функции пг.

CREATE OR REPLACE FUNCTION pg_sp_getmainrates_11(
    IN fromcountryid integer, 
    IN tocountryid integer,  
    IN alldimensions_we_le_he_wi double precision[] 
    ) 

-- My logic is going here 

Но при передаче массива с использованием кода C# он возвращает ошибку при выполнении запроса.

Exeption атрибуты

Basemessage: ошибка синтаксиса или вблизи ""

ErrorSql: SELECT * FROM pg_sp_getmainrates_11 (9,10, System.Double [,])

Вот мой C# код.

double[,] codes = new double[,] 
    { 
     { 5,10,10,10},{ 30,20,15,16} 
    }; 

    string quy = "pg_sp_getmainrates_11(" + FromCountryId + 
           "," + ToCountryId + 
           "," + codes + ")"; 

     NpgsqlCommand command = new NpgsqlCommand(quy, conn); 
     command.CommandType = CommandType.StoredProcedure; 
     NpgsqlDataReader dr = command.ExecuteReader(); 

Мне нужно небольшое направление, чтобы передать массив (например, выше) в мою функцию postgresql.

+0

Ваш массив C#: '{{}, {}}' ваш массив postgresql: '[[], []]'. Никто не будет преобразовывать его для вас, если вы не скажете компилятору сделать такое преобразование. Более того, postgresql не обрабатывает то же самое для 'array' и' int [] 'или' numeric [] '. вы можете называть их одинаковыми, но они не совпадают. Поэтому ваше определение для массива в C# как double [,] должно быть отлито для правильного типа в postgresql. – java

+0

Спасибо @java – weeraa

ответ

1

До сих пор я нашел решение для этого. (Не знаю, является ли это оптимальным решением) Простая вещь для отправки параметра в виде строки. С моим кодом C# я делаю строку, как показано ниже.

String arr = "array[[5,10,10,10],[30,20,15,16]]"; 

Этот параметр arr будет передан как параметр запроса.

string quy = "pg_sp_getmainrates_11(" + FromCountryId + 
           "," + ToCountryId + 
           "," + arr+ ")"; 

Над решением работает отлично.

0

Вы можете использовать using Newtonsoft.Json; и вставить массив, как следующие:

string[][] arr = {{5, 10, 10, 10},{30, 20, 15, 16}}; 
var arrayOutput = JsonConvert.SerializeObject(arr); 

try 
{ 
    string sql1 = "INSERT INTO tbt(img, fcth, dev) VALUES (ARRAY'" + arrayOutput + "')"; 
    dbcmd.CommandText = sql1; 
    cmd.ExecuteNonQuery(); 
} 

catch (NpgsqlException ex) 
{ 
    if (ex.Data == null) 
    { 
     throw; 
    } 

    else 
    { 
    } 

} 

Этот пример просто для столбца массива.

Смежные вопросы