2012-03-09 34 views
0

我有一個存儲過程,使用鏈接服務器(ADSI)連接到活動目錄。它需要一個字符串/ varchar guid,然後將用戶的thumbnailPhoto屬性返回到活動目錄。我試圖從C#代碼中調用這個過程,但它一直返回null。我試圖確保所傳遞的GUID是正確的,所以從調試中,我抓住了傳入參數的GUID,然後試圖用它來運行管理工作室中的sproc。結果很好,但是當我從我的應用程序中完成時,我得到空。下面的代碼:存儲過程返回值在管理工作室,但不是在C#代碼

存儲過程:

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 2012-03-09 21:32:24

+2

只是一個想法:難道不會**更容易**直接從您的C#代碼訪問AD,而不是通過SQL Server繞道?見例如[這是這個問題在同一主題](http://stackoverflow.com/questions/1978717/how-to-upload-an-image-file-to-active-directory-user-profile-in-c)一些指針 – 2012-03-09 21:33:03

+0

實際上是和不。我原來的代碼是通過DirectoryServices打開它,這很容易,但我們發現使用SQL要快得多。 – Sinaesthetic 2012-03-09 22:43:18

回答

6

值將被ExecuteScalar()返回。

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

這張照片最終是一個長度至少31100的字節數組。我的其他選擇是什麼? – Sinaesthetic 2012-03-12 22:05:31

2

您可能想要ExecuteScalar返回的結果。但請記住,它最多隻能返回2033個字符。

+0

該照片最終是一個長度至少爲31100的字節數組。我的其他選擇是什麼? – Sinaesthetic 2012-03-12 22:04:58

+0

使用[SqlDataReader:](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getbytes.aspx) – ebutusov 2012-03-12 22:22:07

+0

我使用sqldatareader之前,我實際上嘗試此方法。問題是它只是返回null。當我在管理工作室中運行查詢時,數據恢復得很好。當我在調試中通過它時,我正在觀察枚舉並顯示它有結果/記錄,但該記錄是空的。這對我來說沒有任何意義:/ – Sinaesthetic 2012-03-19 14:38:20

相關問題