Проблемы с выполнением внешней хранимой процедуры DB2

Я пытаюсь вызвать внешнюю хранимую процедуру (вызывает программу RPG). Я продолжаю получать следующую ошибку:

«Сведения об исключении: IBM.Data.DB2.iSeries.iDB2SQLErrorException: токен SQL0104 @SSN недействителен. Допустимые токены: :».

Вот мой код:

using (iDB2Connection conn = new iDB2Connection(_CONNSTRING))
{
    conn.Open();

    string sqlStatement = "MPRLIB.SIGNTIMESHEET (@SSN, @SIGNATURE, @WORKSTATION, @TOTALHOURS, @COMMENT)";
    //string sqlStatement = "MPRLIB.SIGNTIMESHEET (?, ?, ?, ?, ?)";

    iDB2Command cmd = conn.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = sqlStatement;
    cmd.Parameters.Add("@SSN", timesheet.EmployeeUniqueKey.ToString("0000000000"));
    cmd.Parameters.Add("@SIGNATURE", timesheet.EmployeeTypedName);
    cmd.Parameters.Add("@WORKSTATION", timesheet.EmployeeSignedComputer);
    cmd.Parameters.Add("@TOTALHOURS", GetJobHoursTotal(timesheet.Id).ToString("00000.000").Replace(".", ""));
    cmd.Parameters.Add("@COMMENT", timesheet.EmployeeComments);

    cmd.ExecuteNonQuery();
    conn.Close();
}

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

private const string _CONNSTRING = "DataSource=192.168.50.200;DefaultCollection=QMFILES;Naming=sql;UserID=XXX;Password=XXX;";

Может быть проблема в списке библиотек? Программа просто ссылается на один файл, который находится в списке библиотек. Какие-либо предложения?


person Mike Wills    schedule 06.07.2010    source источник


Ответы (1)


Попробуйте так:

using (var conn = new iDB2Connection(_CONNSTRING)) 
using (var cmd = conn.CreateCommand())
{ 
    conn.Open();

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "MPRLIB.SIGNTIMESHEET";
    cmd.Parameters.Add("@SSN", timesheet.EmployeeUniqueKey.ToString("0000000000"));
    cmd.Parameters.Add("@SIGNATURE", timesheet.EmployeeTypedName);
    cmd.Parameters.Add("@WORKSTATION", timesheet.EmployeeSignedComputer);
    cmd.Parameters.Add("@TOTALHOURS", GetJobHoursTotal(timesheet.Id).ToString("00000.000").Replace(".", ""));
    cmd.Parameters.Add("@COMMENT", timesheet.EmployeeComments);

    cmd.ExecuteNonQuery();
}
person Darin Dimitrov    schedule 06.07.2010
comment
Проблема заключалась в том, что sqlStatement должен был исключить параметры. Ваш пост направил меня в правильном направлении. Спасибо за помощь! - person Mike Wills; 06.07.2010
comment
Вы также можете проверить это сообщение: netsplore.com/PublicPortal/blog.aspx?EntryID =30 - person Darin Dimitrov; 06.07.2010
comment
Следует отметить, что вы можете захотеть закрыть соединение, даже если вы завернули его в оператор using. Некоторые версии сборки DB2 .NET, поставляемые IBM, не закрывали соединения должным образом, даже если они были заключены в блок using. - person Ta01; 06.07.2010