Работа с массивами
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[] и т.д. |