Выполнение SQL для AS400 с указанием *LIBL вместо конкретной библиотеки

У меня есть требование выполнить базовый SQL (в данном случае вставку) для файла на AS400. Я пишу толстый клиент, приложение командной строки на С#, работающее в Windows 2008.

Если я укажу библиотеку и файл следующим образом:

insert into somelibrary.somefile (col1,col2) values val1,val2

тогда это работает. Проблема в том, что значение somelibrary будет различаться между пользователями и средами. Я хотел бы использовать список библиотек *LIBL, чтобы он выбирал любые библиотеки, которые были выделены пользователю, в правильном порядке. Я хотел бы избежать использования файлов конфигурации, если это возможно.

Пользователь, с которым я тестирую, имеет в своем списке библиотек библиотеку, содержащую somefile. Если я попытаюсь:

insert into somefile (col1,col2...) values val1,val2

Я получаю сообщение об ошибке:

ERROR [42S02] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0204 - somefile in username type *FILE not found.

Я пытался добавить *LIBL в SQL, а также в строку подключения, но не нашел файл. Я пробовал довольно много комбинаций, а также использовал косую черту для разделения библиотеки и файла.

В случае, если это уместно, строка подключения:

Driver={Client Access ODBC Driver (32-bit)}; System=" + server + "; UID=" + DBUser + "; PWD=" + DBPassword + ";";

person Community    schedule 22.01.2013    source источник
comment
Работает ли этот запрос при запуске через iSeries? (У меня на старой работе было Справочное руководство по AS400 SQL... буквально 3 месяца назад!)   -  person Simon Whitehead    schedule 22.01.2013
comment
Да, оттуда нормально работает.   -  person    schedule 22.01.2013
comment
Попробуйте добавить Naming Convention=1 в строку подключения, чтобы переключиться в режим именования *SYS.   -  person dmc    schedule 22.01.2013
comment
Без изменений. Это то же самое, что и «naming=system» в строке подключения? И должен ли я добавить *LIBL где-нибудь в строке подключения? (Я только что попробовал несколько вариантов здесь, но мог пропустить один!).   -  person    schedule 22.01.2013
comment
dmc: Похоже, что мой драйвер суетлив, и подойдет только 'naming=1' (а не 'naming=system' или 'конвенция об именах=1'. Приветствую!   -  person    schedule 23.01.2013
comment
@Полди. Вы также можете изменить настройку ODBC на вкладке «Сервер», вы можете изменить соглашение об именах и установить список библиотек: на * usrlibl . Я предпочитаю использовать провайдера .Net. Для провайдера .Net используйте Naming=System;LibraryList=*USRLIBL;SchemaSearchList=*USRLIBL   -  person lamLam    schedule 23.01.2013
comment
lamLam: Что такое вкладка «Сервер»?   -  person    schedule 23.01.2013
comment
Здесь вы определяете свой ODBC. Из панели управления Windows -> Административные инструменты -> Источник данных (ODBC). Выберите имя источника данных, затем на второй вкладке — вкладка «Сервер».   -  person lamLam    schedule 25.01.2013
comment
lamLam: Я этого не делал. Нет конфигурации DSN или ODBC. Я установил Client Access и использую драйверы оттуда. Это приложение будет установлено на нескольких серверах, и я всегда стараюсь не добавлять записи в реестр или вносить ручные изменения в отдельные поля.   -  person    schedule 25.01.2013


Ответы (1)


Список библиотек, используемый для этого запроса, представляет собой список библиотек профиля пользователя, используемого для аутентификации. Профиль пользователя указывает на два элемента, которые интересны в отношении списка библиотек: Описание работы и Исходная программа. Проверьте описание работы, чтобы узнать, что такое список библиотек. Вероятно, в нем не будет библиотеки, содержащей SOMEFILE. Остается исходная программа. Если список библиотек установлен в исходной программе, у вас есть проблема, потому что исходная программа выполняется только тогда, когда профиль входит в сеанс терминала.

Обойти это можно, создав профиль пользователя и описание работы, содержащее необходимый вам список библиотек.

person Buck Calabro    schedule 22.01.2013
comment
Описание задания содержит SOMELIBRARY (который содержит SOMEFILE). И я запускаю оператор вставки через приложение C #, не используя сеанс терминала, поэтому я не уверен, что исходная программа вызывается. - person ; 22.01.2013
comment
Ну, один вниз. Если вы получаете сообщение об ошибке, что SOMEFILE в USERNAME не найден, значит, вы используете соглашение об именах SQL, а не SYSTEM. IBM справочный документ 9951625 описывает ситуацию. - person Buck Calabro; 22.01.2013
comment
Я отмечаю это как лучший ответ - решение заключалось в добавлении «именования = 1». Еще до того, как я опубликовал свой вопрос, я попробовал «название = система», но это не сработало. Теперь кажется, что это касается только jdbc и не работает с драйвером ODBC для клиентского доступа. Большое спасибо! - person ; 23.01.2013