2012-03-09 22 views
0

Active Directoryにリンクするためにリンクサーバー(ADSI)を使用するストアドプロシージャがあります。これは文字列/ varchar guidを取り込み、ユーザーのthumbnailPhoto属性をアクティブディレクトリから返します。私はC#コードからこのプロシージャを呼び出そうとしていますが、nullを返し続けます。私はguidが渡されていることを確認しようとしましたが、デバッグからは、GUIDをパラメータに渡してから、管理スタジオでsprocを実行するようにしました。結果はうまく戻ってきましたが、私がアプリケーションからそれを実行すると、nullになります。ここでは、コードです:ストアドプロシージャの戻り値はC#コードではありません

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; 
} 
+0

このストアドプロシージャには出力パラメータがないようです。 – ebutusov

+2

ちょっと考えてみると、SQL Serverを迂回する代わりに、C#コードからADに直接アクセスする方がはるかに簡単です**例えば、 [これは同じトピックに関するこのような質問](http://stackoverflow.com/questions/1978717/how-to-upload-an-image-file-to-active-directory-user-profile-in-c)ポインタ –

+0

実際にはいといいえ。私の元のコードはDirectoryServicesを使って簡単に実行できますが、SQLを使用する方がはるかに高速です。 – Sinaesthetic

答えて

6

値がExecuteScalar()によって返されます。

Byte[] photo = (Byte[])comm.ExecuteScalar(); 
+0

写真の長さは少なくとも31100バイトです。私の他の選択肢は何ですか? – Sinaesthetic

2

おそらく結果はExecuteScalarによって返されます。しかし、それは2033年までの難易度を返すことができます。

+0

写真の長さは31100以上のバイト配列になります。私の他の選択肢は何ですか? – Sinaesthetic

+0

[SqlDataReader:](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getbytes.aspx) – ebutusov

+0

私は実際にこのメソッドを試す前にsqldatareaderを使用しました。問題は、同じnullを返すということでした。私が管理スタジオでクエリを実行したとき、データは正常に戻ってきました。私がデバッグでそれを踏んだとき、私は列挙を見ていて、結果/レコードがあることを示しましたが、そのレコードは空でした。これは私には意味をなさない: – Sinaesthetic