Выполнить хранимую процедуру с параметрами к автономные системы 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.