возвращаемое значение хранимой процедуры в студии управления, но не в коде c # - PullRequest
0 голосов
/ 10 марта 2012

У меня есть хранимая процедура, которая использует связанный сервер (ADSI) для подключения к активному каталогу. Он принимает строку / varchar guid и затем возвращает атрибут thumbnailPhoto пользователя из активного каталога. Я пытаюсь вызвать эту процедуру из кода C #, но он продолжает возвращать ноль. Я пытался убедиться, что передаваемый guid был верным, поэтому после отладки я взял передаваемый guid в параметр и попытался использовать его для запуска sproc в Management Studio. Результат вернулся нормально, но когда я делаю это из своего приложения, я получаю нулевое значение. Вот код:

SPROC:

ALTER PROC [dbo].[sp_GetPhotoFromADSI] 
                @GUID varchar(100)
AS 
                SET NOCOUNT ON 
                SET XACT_ABORT ON  

                BEGIN TRAN

                DECLARE @sql NVARCHAR(600)

                SET @sql=N'SELECT thumbnailPhoto FROM OPENQUERY(ADSI,
                                ''SELECT thumbnailPhoto 
                                  FROM ''''LDAP://<GUID=' + @GUID + '>'''' 
                                  WHERE objectCategory = ''''Person'''' AND objectClass = ''''user'''''')'

                EXEC SP_EXECUTESQL @sql

                COMMIT

C #:

private byte[] GetUserPhotoByGuid(Guid userNativeGuid)
{
    //dont judge me for not abstracting this
    var connString = "connectionStringCrap;";
    byte[] photo = null;

    using (var conn = new SqlConnection(connString))
    {
        try
        {
            string guidString = userNativeGuid.ToString();

            //var realGuid = Guid.Parse(userNativeGuid);
            using (var comm = new SqlCommand("sp_GetPhotoFromADSI", conn))
            {
                comm.CommandType = CommandType.StoredProcedure;
                comm.Parameters.AddWithValue("@GUID", guidString);
                var returnParameter = comm.Parameters.Add("@Output", SqlDbType.Binary);
                returnParameter.Direction = ParameterDirection.ReturnValue;
                conn.Open();
                comm.ExecuteScalar();

                photo = returnParameter.Value as byte[];
                return photo;                       
            }
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            conn.Close();
        }

    }
    return null;
}

Ответы [ 2 ]

5 голосов
/ 10 марта 2012

Значение будет возвращено ExecuteScalar().

Byte[] photo = (Byte[])comm.ExecuteScalar();
2 голосов
/ 10 марта 2012

Возможно, вы хотите, чтобы результат был возвращен ExecuteScalar.Но имейте в виду, что он может вернуть только до 2033 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...