Руководство по работе с БД Firebird с использованием библиотеки ADO .Net 2.0

       

Работа с массивами


ADO .Net может работать с любыми типами данных. Для тех типов Ole Db, у которых нет прямого отображения на типы данных .Net, используется тип данных DBTYPE_VARIANT. Массивы относятся как раз к таким типам.

Следующий пример демонстрирует чтение и запись массива из 5 элементов:

public void ArrayReadWriteTest() { OleDbConnection con = ConnectionProvider.CreateConnection(); con.Open(); OleDbTransaction trans = con.BeginTransaction();

OleDbCommand cmd = new OleDbCommand( "select job_code, job_grade, job_country, job_title, language_req from job", con, trans);

OleDbCommand cmd_upd = new OleDbCommand( "update job set language_req=:language_reg where \n" + "job_code=:job_code and job_grade=:job_grade and job_country=:job_country", con, trans);

cmd_upd.Parameters.Add("language_req", OleDbType.Variant); cmd_upd.Parameters.Add("job_code", OleDbType.BSTR); cmd_upd.Parameters.Add("job_grade", OleDbType.BSTR); cmd_upd.Parameters.Add("job_country", OleDbType.BSTR);

using (OleDbDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { Console.WriteLine("JOB TITLE:" + rdr["job_title"].ToString());

//чтение массива

object lang_obj_arr = rdr["language_req"];

if (lang_obj_arr != DBNull.Value) { //преобразование к массиву

//используем Array.CreateInstance для создания массива

//из 5 элементов, с адресацией начиная с 1-го элемента, а не с 0 short arr_lower_bound = 1;

Array lang_str_arr = Array.CreateInstance(typeof(string), new int[] {5}, new int[] { arr_lower_bound });

//копирование элементов в массив ((Array)lang_obj_arr).CopyTo(lang_str_arr, arr_lower_bound);



for (int i = arr_lower_bound; i < lang_str_arr.Length + arr_lower_bound; i++) { //усечение символа \n на концах элементов массива

string trimmed_value = lang_str_arr.GetValue(i).ToString().Replace("\n", ""); lang_str_arr.SetValue(trimmed_value, i);

//вывод значения

if (lang_str_arr.GetValue(i).ToString() != "") Console.WriteLine(lang_str_arr.GetValue(i)); }


// запись новых значений элементов массива без символа \n cmd_upd.Parameters["language_req"].Value = lang_str_arr; cmd_upd.Parameters["job_code"].Value = rdr["job_code"]; cmd_upd.Parameters["job_grade"].Value = rdr["job_grade"]; cmd_upd.Parameters["job_country"].Value = rdr["job_country"];

//передача изменений в БД

Assert.IsTrue(cmd_upd.ExecuteNonQuery() == 1); } else

Console.WriteLine("No language specified");

Console.WriteLine(""); } }

//откат сделанных изменений trans.Rollback(); con.Close(); }

ПРИМЕЧАНИЕ.В примере использован базовый класс Array и метод CreateInstance для создания массива строк. В C# адресация массивов начинается с нулевого элемента, а в данном случае в базе данных записан массив, который проиндексирован, начиная с первого элемента. Array.CreateInstance() позволяет указать нижнюю границу массива элементов. В случае массивов с нулевой адресацией достаточно использования типизированных наследников класса Array, например string[], int[] и т.д.

Содержание раздела