C# 执行DB2外部存储过程的问题

C# 执行DB2外部存储过程的问题,c#,stored-procedures,db2,ibm-midrange,C#,Stored Procedures,Db2,Ibm Midrange,我正在尝试调用外部存储过程(调用RPG程序)。我不断得到以下错误: “异常详细信息:IBM.Data.DB2.iSeries.iDB2SQLErrorException:SQL0104令牌@SSN无效。有效令牌:。” 这是我的密码: using (iDB2Connection conn = new iDB2Connection(_CONNSTRING)) { conn.Open(); string sqlStatement = "MPRLIB.SIGNTIMESHEET (@S

我正在尝试调用外部存储过程(调用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;";
这可能是图书馆名单的问题吗?程序只引用库列表中的一个文件。有什么建议吗?

试着这样做:

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();
}
试着这样做:

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();
}

问题是sqlStatement应该排除parms。你的帖子给了我正确的方向。谢谢你的帮助!您也可以查看这篇文章:需要注意的是,您可能希望关闭连接,即使您已将其包装在using语句中。IBM提供的某些版本的DB2.NET程序集没有正确关闭连接,即使它包含在using块中。问题是sqlStatement应该排除PARM。你的帖子给了我正确的方向。谢谢你的帮助!您还可以查看这篇文章:需要注意的是,您可能希望关闭连接,即使您已将其包装在using语句中,IBM提供的某些版本的DB2.NET程序集即使包含在using块中,也没有正确关闭连接。