如何在使用 ExecuteScalar() 执行 SP 时在 C# 中获取输出参数的值
How to get values of output parameters in c# while executing SP using ExecuteScalar()
我正在尝试在 c# 中执行存储过程。
存储过程执行插入操作并将其中一列的 returns 值作为输出参数。
我需要从 c# 执行它并取回输出参数的值。
以下是我迄今为止尝试过的内容。
SqlParameter[] associateParams = new SqlParameter[10];
{
associateParams[0]=new SqlParameter("@orgName", newAssociate.OrgName);
associateParams[1]=new SqlParameter("@createdBy", newAssociate.Email);
associateParams[2]=new SqlParameter("@userName", newAssociate.UserName);
associateParams[3]=new SqlParameter("@workEmail", newAssociate.Email);
associateParams[4]=new SqlParameter("@password", newAssociate.Password);
associateParams[5]=new SqlParameter("@teamStrength", "0");
associateParams[6]=new SqlParameter("@projName", newAssociate.ProjName);
associateParams[7]=new SqlParameter("@userType", "Associate");
associateParams[8] = new SqlParameter("@userSalt", SqlDbType.VarChar, 400);
associateParams[8].Direction = ParameterDirection.Output;
associateParams[9] = new SqlParameter("@activationKey", SqlDbType.Int);
associateParams[9].Direction = ParameterDirection.Output;
}
using (SqlCommand cmd = con.CreateCommand())
{
log.Debug("In command is called");
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = ProcedureName;
cmd.Parameters.AddRange(param);
log.Debug("Command is called");
try
{
if (con.State != ConnectionState.Open)
{
con.Open();
log.Debug("Con is open");
}
cmd.ExecuteScalar();
log.Debug(cmd.Parameters["@userSalt"].Value.ToString());
log.Debug(cmd.Parameters["@activationKey"].Value.ToString());
执行上面的操作,成功执行插入,但 returns 输出参数值为空。
任何人都可以提出我在这里缺少的东西。
谢谢
定义输出参数时尝试这样:
associateParams[8] = new SqlParameter("@userSalt", SqlDbType.VarChar, 400);
associateParams[8].Value = "";
associateParams[8].Direction = ParameterDirection.Output;
associateParams[9] = new SqlParameter("@activationKey", SqlDbType.Int);
associateParams[9].Value = 0;
associateParams[9].Direction = ParameterDirection.Output;
如果有帮助请告诉我。
更新:这是我自己的方法
cmd.Parameters.Add(new SqlParameter("@userSalt", SqlDbType.VarChar, 400));
cmd.Parameters["@userSalt"].Value = "";
cmd.Parameters["@userSalt"].Direction = ParameterDirection.Output;
更新 1:因为您不使用 ExecuteNonQuery。将 cmd.ExecuteScalar()
更改为 cmd.ExecuteNonQuery()
我正在尝试在 c# 中执行存储过程。
存储过程执行插入操作并将其中一列的 returns 值作为输出参数。
我需要从 c# 执行它并取回输出参数的值。
以下是我迄今为止尝试过的内容。
SqlParameter[] associateParams = new SqlParameter[10];
{
associateParams[0]=new SqlParameter("@orgName", newAssociate.OrgName);
associateParams[1]=new SqlParameter("@createdBy", newAssociate.Email);
associateParams[2]=new SqlParameter("@userName", newAssociate.UserName);
associateParams[3]=new SqlParameter("@workEmail", newAssociate.Email);
associateParams[4]=new SqlParameter("@password", newAssociate.Password);
associateParams[5]=new SqlParameter("@teamStrength", "0");
associateParams[6]=new SqlParameter("@projName", newAssociate.ProjName);
associateParams[7]=new SqlParameter("@userType", "Associate");
associateParams[8] = new SqlParameter("@userSalt", SqlDbType.VarChar, 400);
associateParams[8].Direction = ParameterDirection.Output;
associateParams[9] = new SqlParameter("@activationKey", SqlDbType.Int);
associateParams[9].Direction = ParameterDirection.Output;
}
using (SqlCommand cmd = con.CreateCommand())
{
log.Debug("In command is called");
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = ProcedureName;
cmd.Parameters.AddRange(param);
log.Debug("Command is called");
try
{
if (con.State != ConnectionState.Open)
{
con.Open();
log.Debug("Con is open");
}
cmd.ExecuteScalar();
log.Debug(cmd.Parameters["@userSalt"].Value.ToString());
log.Debug(cmd.Parameters["@activationKey"].Value.ToString());
执行上面的操作,成功执行插入,但 returns 输出参数值为空。
任何人都可以提出我在这里缺少的东西。
谢谢
定义输出参数时尝试这样:
associateParams[8] = new SqlParameter("@userSalt", SqlDbType.VarChar, 400);
associateParams[8].Value = "";
associateParams[8].Direction = ParameterDirection.Output;
associateParams[9] = new SqlParameter("@activationKey", SqlDbType.Int);
associateParams[9].Value = 0;
associateParams[9].Direction = ParameterDirection.Output;
如果有帮助请告诉我。
更新:这是我自己的方法
cmd.Parameters.Add(new SqlParameter("@userSalt", SqlDbType.VarChar, 400));
cmd.Parameters["@userSalt"].Value = "";
cmd.Parameters["@userSalt"].Direction = ParameterDirection.Output;
更新 1:因为您不使用 ExecuteNonQuery。将 cmd.ExecuteScalar()
更改为 cmd.ExecuteNonQuery()