Со следующей хранимой процедурой в SQL Server 2005
IF OBJECT_ID('[dbo].[UserProfile]') IS NOT NULL
DROP PROCEDURE [dbo].[UserProfile]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[UserProfile]
(
@UserId VARCHAR(20)
)
AS
IF @UserId = 'userId'
BEGIN
SELECT @UserId = 'Yes'
END
ELSE
SELECT @UserId = 'No'
SELECT @UserId AS RESULT
RETURN RESULT
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
код С#, необходимо получить результат хранимой процедуры
public String UserProfile(string userId)
{
String result;
System.Data.Common.DbCommand cmd = this.mConn.CreateCommand();
try
{
cmd.CommandTimeout = this.mCmdTimeout;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "UserProfile";
DbParameter p = cmd.CreateParameter();
p.ParameterName = "@UserId";
p.DbType = DbType.String;
p.Value = userId;
cmd.Parameters.Add(p);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
//Need to assign the value of the stored procedure return to result
result = Convert.ToString(cmd.Parameters["@UserId"].Value);
}
catch (Exception ex)
{
throw;
}
finally
{
cmd.Connection.Close();
}
return result;
}
Как вернуть результат моей хранимой процедуры на С#?
В этом случае вы можете использовать метод ExecuteScalar() команды для возврата значения. ExecuteScalar будет искать первый столбец первой записи, возвращенной из базы данных.
Я также искал возвращаемое значение из хранимой процедуры и записывал ее на С#.
Я возвращал различные коды возврата, основанные на логике в моем коде, и execcescalar не поможет, так как я хотел бы вернуть из сохраненного proc между ними везде, где это необходимо, с соответствующим кодом и не использовать select. Таким образом, добавив дополнительный параметр с Direction как ReturnValue, вы можете зафиксировать возвращаемое значение. Нет необходимости в параметрах OUT для захвата возвращаемого значения из сохраненного процесса.
preturn.ParameterName = "@Return_Value";
preturn.DbType = DbType.Int;
preturn.Direction = ParameterDirection.ReturnValue;
Итак, вот что я придумал. Редактирование исходного кода в этом сообщении, чтобы оно было простым.
public String UserProfile(string userId)
{
String result;
System.Data.Common.DbCommand cmd = this.mConn.CreateCommand();
try
{
cmd.CommandTimeout = this.mCmdTimeout;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "UserProfile";
DbParameter p = cmd.CreateParameter();
p.ParameterName = "@UserId";
p.DbType = DbType.String;
p.Value = userId;
cmd.Parameters.Add(p);
DbParameter preturn = cmd.CreateParameter();
preturn.ParameterName = "@Return_Value";
preturn.DbType = DbType.Int;
preturn.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(preturn);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
//Need to assign the value of the stored procedure return to result
result = Convert.ToString(cmd.Parameters["@Return_Value"].Value);
}
catch (Exception ex)
{
throw;
}
finally
{
cmd.Connection.Close();
}
return result;
}
Попробуйте добавить это к свойствам параметров перед выполнением команды:
cmd.Parameters["@UserId"].Direction = System.Data.ParameterDirection.InputOutput;
** Изменить: **
Как заявил Райан Бруннер в комментариях, вы должны пометить свой параметр как OUT в хранимой процедуре, чтобы это работало.
Вы также можете использовать параметр Output.
В хранимой процедуре:
CREATE PROCEDURE [dbo].[UserProfile]
(
@UserId VARCHAR(20) Output
)
В коде:
p.ParameterName = "@UserId";
p.DbType = DbType.String;
p.Direction = System.Data.ParameterDirection.Output;
p.Value = userId;
Вы также могли бы использовать параметр Output.
используя...
Linq2Entities? Перетащите sproc в конструктор, и это будет функция в С#, возвращающая правильное значение. Linq2Sql? Перетащите sproc в конструктор, и это будет функция в С#, возвращающая правильное значение. ADO? - просто присвойте результат ExecuteScalar переменной