1 Востаннє редагувалося Betterthanyou (18.09.2020 17:41:40)

Тема: Informix OdbcDataReader Прочитати поле повністю

Є такий код для отримання даних з БД Informix

OdbcDataReader dr = null;
dr = db.DataReader(query);

int fieldCount = dr.FieldCount;

while (dr.Read())
{
    DataRow dataRow = dataTable.NewRow();
    for (int i = 0; i < fieldCount; i++)
    {
        dataRow[i] = dr[i].ToString();
    }
    dataTable.Rows.Add(dataRow);
}

Проблема в тому що він читає поле не повністю

Побував ще такий варіант

dr.GetTextReader(0).ReadToEnd();

Кількість символів у поля 3000

Поле має тип lvarchar(20000)

Те що в БД є повний рядок я впевнений, тому що рядок має закінчуватися на крапку з комою
Якщо використати SQL команду RIGHT([name], 10); - можна побачити що рядок закінчується на крапку з комою

Як прочитати рядок (поле) повністю ?

2

Re: Informix OdbcDataReader Прочитати поле повністю

взагалі нічого не зрозуміло, але дуже цікаво

3

Re: Informix OdbcDataReader Прочитати поле повністю

Що саме не зрозуміло?

dr.Read()

- Переходить до наступного запису.

dr[i].ToString();

- Зчитує поле

Поле зчитується не повністю, воно чомусь обрізається.

Я запитую як прочитати поле повністю ?

4

Re: Informix OdbcDataReader Прочитати поле повністю

dr[i] повертає Object. Object.ToString() призначений для отримання стрічки для виведення, а не повного вмісту.
Читати String треба методом GetString, але виглядає, що й TextReader мусить впоратися, тому не певен.

5 Востаннє редагувалося Betterthanyou (18.09.2020 22:51:24)

Re: Informix OdbcDataReader Прочитати поле повністю

Для того щоб точно знати що RichTextBox вміщає всі 3000 символів, я ще паралельно зберіг у файл

Отримав дані так, як сказав koala:

dr.GetString(і)

Всеодно обривається на 2277 символі

В мене ще є eSQL Editor, але навіть він не читає повністю рядок.

Платних засобів не маю.

Як же витягнути цей рядок ?

Звичайно можна тягнути по 2000 символів, а потім склеїти, але це рішення важко реалізувати...

6

Re: Informix OdbcDataReader Прочитати поле повністю

Може це якийсь прикол в ODBC драйвері Informix ? там є якісь налаштування ?
бо щось інших варіантів не бачу

і доповнення про тип lvarchar (Informix)

Character string of variable length with length l
(255 ≤ l ≤ 32,000)

When connecting to IBM Informix 10.0 servers with the ODBC driver, the SQLDescribeCol, SQLColAttributes & SQLDescribeParam APIs report the length mentioned during creation of the LVARCHAR column. If no length was mentioned during creation, length defaults to 2048 bytes.

Може десь не вказана реальна довжина поля і драйвер ставить її по дефолту ?

Подякували: Betterthanyou1

7 Востаннє редагувалося koala (19.09.2020 07:07:03)

Re: Informix OdbcDataReader Прочитати поле повністю

2277. Дивно.
1. Що знаходиться в стрічці в цьому районі? Може там бути, скажімо, нульовий символ?
2. Стрічка ASCII чи багатобайтова? Може, 2277 - це довжина в байтах, а в символах якраз 2048 абощо?
3. Якщо запитувати не всі поля, а лише цю стрічку - повертається так само? Може бути, що воно разом з іншими полями щось переповнює? Який загальний розмір запиту?
Ну і є такий тип - TEXT, якраз для довгих стрічок, але це вже по ситуації.

Прогляньте ці параметри, може щось побачите: https://www.ibm.com/support/knowledgece … bc_070.htm

Подякували: Betterthanyou, leofun012

8 Востаннє редагувалося Betterthanyou (20.09.2020 21:03:59)

Re: Informix OdbcDataReader Прочитати поле повністю

Вже частково вдалося знайти помилку

3)
Можливо я не правильно склав запит

|Перший запит| Так показує весь рядок

Select  fieldName
From tableName
Where fieldUnique="param"

|Другий запит| Так обривається

Select  'insert into tableName (fieldName) values("' || replace(replace(fieldName,'<','&lt;'),'>','&gt;') || '");'
From tableName
Where fieldUnique="param"

1)

Обривається на ""INNER JOIN org"

так виглядає повністю
"INNER JOIN organisations"

2)
багатобайтова, але символів 2277

В informix, середовищі якому я працюю, немає імпорту/ексорту SQL команд, а лише текстових файлів. Другий запит, це запит яким я намагаюся експортувати таблицю

Чому другий запит може обірватися на 2277 символі ?

9

Re: Informix OdbcDataReader Прочитати поле повністю

Я так розумію ви в 2му запиті будуєте SQL команду Insert одночасно роблячи деякі зміни в значенні що береться з поля fieldName.
не знаю синтаксису для роботи з символьними рядками в Informix, але символи || та й взагалі вся конструкція
... "' || replace(replace(fieldName,'<','&lt;'),'>','&gt;') || '");' мені видається дивною

Чи не простіше за допомогою першого запиту отримати набір потрібних рядків, а потім вже в коді прикладної програми зробити з них insert команди з відповідними реплейсами ?

Подякували: Betterthanyou1

10

Re: Informix OdbcDataReader Прочитати поле повністю

|| - об'єднувати рядки (concatenate)

replace(replace(fieldName,'<','&lt;'),'>','&gt;') - намагаюся замінити < > на &lt; &gt;

11 Востаннє редагувалося Engineer (20.09.2020 21:49:22)

Re: Informix OdbcDataReader Прочитати поле повністю

Betterthanyou написав:

|| - об'єднувати рядки (concatenate)

replace(replace(fieldName,'<','&lt;'),'>','&gt;') - намагаюся замінити < > на &lt; &gt;

зрозумів.
Ну я думаю, що фактично ви ж повертаєте в запиті не поле fieldName, а зовсім нове поле невідомої довжини. Може в тому наборі, що повертається вам, перший рядок має повну довжину 2277, а решта рядків ріжуться по його довжині. В мене колись таке було в якійсь legacy системі. Тому, особисто я б забирав простим Select fieldName ....  поле з бази і в програмі формував з нього все що хочу