Member 11977135 Ответов: 1

Выполнить хранимую процедуру с параметрами к автономные системы as400 из VBA результате в -2147217865


Sub Call_API003_2()
    
    Dim cnn As ADODB.Connection
    Set cnn = New ADODB.Connection
    kod = "ZX311266012Y56Q9E7EBI38"
    'Data Source=S652B48C;
    cnn.ConnectionString = "Driver={iSeries Access ODBC Driver};System=172.18.0.51;Default Collection=MVX9MOD;Uid=SKS6400;Pwd=password;"
    On Error GoTo err:
    cnn.Open
    
                If cnn.State = adStateOpen Then
                 Debug.Print "Connected"
                Else
                    MsgBox "Not Connected"
                End If
            
                Set cmd = New ADODB.Command
                        
                        With cmd
                                .ActiveConnection = cnn
                                .CommandType = adCmdStoredProc
                                .CommandText = "API003"
                                .Parameters.Append .CreateParameter("@INFORMAT", adChar, adParamInput, 4, "0001")
                                .Parameters.Append .CreateParameter("@INDATA", adChar, adParamInput, 29, "001SKA" & kod)
                                .Parameters.Append .CreateParameter("@OUTFORMAT", adChar, adParamInput, 4, "0001")
                                .Parameters.Append .CreateParameter("@OUTDATA", adVarChar, adParamOutput, 255, "")
                                .Parameters.Append .CreateParameter("@ERRORDATA", adVarChar, adParamOutput, 255, "")
                                 Debug.Print "Indata: " & .Parameters("@INDATA").Value
                                .Execute
            
                        End With
            
                        Debug.Print "Retur: " & cmd.Parameters("@OutData").Value
                        Debug.Print "Fel: " & cmd.Parameters("@ErrorData").Value
    cnn.Close
    
    
err:
    Debug.Print ("Error:" & err)
End Sub


Что я уже пробовал:

Я попробовал в C#, и он работает нормально, теперь я изо всех сил стараюсь заставить его работать в vba.
Я получаю ошибку -2147217865 "тип N не найден".

Кто-нибудь имеет опыт работы с параметрами ?

Richard Deeming

Похоже, что в вашей базе данных нет хранимой процедуры под названием "API003".

Member 11977135

Действительно есть. Я создал программу на языке C#, вызывающую эту процедуру. Это прекрасно работает.

Member 11977135

Это рабочий код C# :

использование системы.ComponentModel;
использование системы.Рисование;
использование системы.Окна.Формы;
с помощью IBM.Данных.В DB2.iseries с;
использование системы;
использование системы.Коллекции.Общий;
использование System.Data;
использование System.Linq;
использование System.Text;
использование системы.Нарезание резьбы.Задачи;


пространство имен WindowsFormsApplication1
{
общественности частичного класс form1 : форма
{
открытый form1()
{
метод InitializeComponent();
}

частная textBox1_Leave недействительным(объект отправителя, EventArgs в электронной)
{


строка подключения = "";
bool значение этот флажок установлен = прод.Проверен;
если (не этот флажок установлен)
Связи = "источник данных=172.18.0.50; коллекции defaultcollection=MVX9MOD; идентификатор пользователя=SKS6400; пароль=пароль";
еще
Связи = "источник данных=172.18.0.51; коллекции defaultcollection=MVX9MOD; идентификатор пользователя=SKS6400; пароль=пароль";




using (iDB2Connection i5conn = new iDB2Connection(Connection))
пробовать
{

Строка tidskod = ("001SKA" + scannat.Text);

i5conn.Открыть();
iDB2Command ptQuery = new iDB2Command("API003", i5conn);
ptQuery.CommandType = CommandType.Хранимая процедура;


ptQuery.Параметры.Добавить("@Информат", iDB2DbType.iDB2Char);
ptQuery.Параметры["@InFormat"].Направление = ParameterDirection.Ввод;
ptQuery.Параметры["@InFormat"].Value = "0001";

ptQuery.Параметры.Добавить("@анкета заполняется", iDB2DbType.iDB2Char);
ptQuery.Параметры["@InData"].Направление = ParameterDirection.Ввод;
ptQuery.Параметры["@InData"].Value = tidskod;

ptQuery.Parameters.Add("@OutFormat", iDB2DbType.iDB2Char);
ptQuery.Параметры["@OutFormat"].Направление = ParameterDirection.Ввод;
ptQuery.Параметры["@OutFormat"].Value = "0001";

ptQuery.Parameters.Add("@OutData", iDB2DbType.iDB2VarChar);
ptQuery.Параметры["@OutData"].Направление = ParameterDirection.Выход;
ptQuery.Параметры["@OutData"].Value = "";

ptQuery.Parameters.Add("@ErrorData", iDB2DbType.iDB2VarChar);
ptQuery.Параметры["@ErrorData"].Направление = ParameterDirection.Выход;
ptQuery.Параметры["@ErrorData"].Value = "";
ptQuery.Метод executenonquery();


String str = (string)(ptQuery.Параметры["@OutData"].Значение);
Стелла.Текст = "";
Стелла.Текст стр = (.Подстрока(2,10));
оварищ.Текст стр = (.Подстрока(7,2));
блюда.Text = (str.Substring(9));

ошибки.Text = (string)(ptQuery.Параметры["@ErrorData"].Значение);


i5conn.Закрывать();

i5conn.Открыть();
iDB2Command ptQuery2 = новый iDB2Command("API005", i5conn);
ptQuery2.Свойство Commandtype = Значение Commandtype.Хранимая процедура;


ptQuery2.Параметры.Добавить("@Информат", iDB2DbType.iDB2Char);
ptQuery2.Parameters["@InFormat"].Направление = ParameterDirection.Ввод;
ptQuery2.Parameters["@InFormat"].Value = "0001";

ptQuery2.Параметры.Добавить("@анкета заполняется", iDB2DbType.iDB2Char);
ptQuery2.Parameters["@InData"].Направление = ParameterDirection.Ввод;
ptQuery2.Parameters["@InData"].Value = tidskod;

ptQuery2.Parameters.Add("@OutFormat", iDB2DbType.iDB2Char);
ptQuery2.Parameters["@OutFormat"].Направление = ParameterDirection.Ввод;
ptQuery2.Parameters["@OutFormat"].Value = "0001";

ptQuery2.Parameters.Add("@OutData", iDB2DbType.iDB2VarChar);
ptQuery2.Parameters["@OutData"].Направление = ParameterDirection.Выход;

Member 11977135

Поскольку я знаю, что есть API003, может быть, это строка подключения, которая указывает на неправильную базу данных ?
Я использую "Default Collection=MVX9MOD;". Я использовал это с помощью .NET driver "using IBM.Data.DB2.iSeries;" где он работает, но может ли он отличаться в "iSeries Access ODBC Driver" ?

ZurdoDev

Какая строка кода вызывает ошибку?

Member 11977135

.Execute - это строка

Maciej Los

Попробуйте использовать другую строку подключения: AS/400 соединительные строки - ConnectionStrings.com[^]. Я делаю ставку на стандартный поставщик OLE DB IBM Client Access.

1 Ответов

Рейтинг:
6

Member 11977135

Спасибо вам всем за Ваш вклад. Я провел расследование, спросил СИСОПА и выяснил, где хранится API003. C# не заботился об этом, но после изменения connectionstring я теперь могу работать и в vba!!

Решение : проверьте в навигаторе iSeries, где хранится процедура, и добавьте базу данных и библиотеки по умолчанию:

DATABASE=QGPL;DefaultLibraries=MVX9MOD;



Правильная строка соединения:

cnn.ConnectionString = "Driver={iSeries Access ODBC Driver};System=172.18.0.51;DATABASE=QGPL;DefaultLibraries=MVX9MOD;Uid=SKS6400;Pwd=password;"