2014-05-17 15 views
0

OUTPUT 매개 변수가있는 SQL Server 2012의 저장 프로 시저가 있습니다. 내가 코드에서 내 저장 프로 시저의 OUTPUT 가치를 어떻게저장 프로 시저에 의한 C#으로 SQL Server 출력 매개 변수 반환

Procedure or function 'DecryptCCode' expects parameter '@decryptedStr', which was not supplied.

: 나는 ExecuteNonQuery()을 쳤을 때 나는이 지점에서 C#을 해독 함수를 호출 할 때, 난 항상 오류가? 감사.

저장 프로 시저 :

ALTER PROCEDURE [dbo].[DecryptCCode] 
    @decryptedStr nchar(5) OUTPUT 
AS 
BEGIN 
SET NOCOUNT ON; 

IF NOT EXISTS 
    (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101) 
    CREATE MASTER KEY ENCRYPTION BY 
    PASSWORD = 'rfsdffsssdfsdfwerefeses' 

IF NOT EXISTS 
    (SELECT * FROM sys.certificates WHERE name='ClientCert') 
    CREATE CERTIFICATE ClientCert 
    WITH SUBJECT = 'My ClientCode Certificate'; 

IF NOT EXISTS 
    (SELECT * FROM sys.symmetric_keys WHERE name='ClientCode_K1') 
    CREATE SYMMETRIC KEY ClientCode_K1 
    WITH ALGORITHM = AES_256 
    ENCRYPTION BY CERTIFICATE ClientCert; 


OPEN SYMMETRIC KEY ClientCode_K1 
    DECRYPTION BY CERTIFICATE ClientCert; 

SELECT 
    @decryptedStr = CONVERT(nvarchar, DecryptByKey(ClientCode, 1 , HashBytes('SHA1', CONVERT(varbinary, InstitutionID)))) 
FROM 
    dbo.lu_Institution 
END 

C# 코드

public string Decrypt() 
{ 
    using (var cn = new SqlConnection(((EntityConnection) ObjectContext.Connection).StoreConnection.ConnectionString)) 
    { 
      try 
      { 
       var sqlcmd = new SqlCommand("EXEC [dbo].[DecryptCCode]", cn); 
       sqlcmd.Parameters.Add("@decryptedStr", SqlDbType.NChar, 5); 
       sqlcmd.Parameters["@decryptedStr"].Direction = ParameterDirection.Output; 
       cn.Open(); 
       sqlcmd.ExecuteNonQuery(); 
       cn.Close(); 

       return sqlcmd.Parameters["@decryptedStr"].Value != DBNull.Value ? (string)sqlcmd.Parameters["@decryptedStr"].Value : string.Empty; 
      } 
      catch (Exception e) 
      { 
       cn.Close(); 
       Console.WriteLine(e.Message); 
       return string.Empty; 
      } 
    } 
} 

답변

1

코드는 잘 보이지만, 당신은 당신이 실행하려고하는 SQL은을 즉, CommandCommandType 속성에 지정해야 저장 프로 시저.

public string Decrypt() 
{ 
    using (var cn = new SqlConnection(((EntityConnection) ObjectContext.Connection).StoreConnection.ConnectionString)) 
    { 
     try 
     {  
      cn.Open(); 

      var sqlcmd = new SqlCommand("[dbo].[DecryptCCode]", cn); 

      // specify the command is a Stored Procedure 
      sqlcmd.CommandType = CommandType.StoredProcedure; 

      sqlcmd.Parameters.Add("@decryptedStr", SqlDbType.NChar, 5); 
      sqlcmd.Parameters["@decryptedStr"].Direction = ParameterDirection.Output; 

      sqlcmd.ExecuteNonQuery();   

      return sqlcmd.Parameters["@decryptedStr"].Value != DBNull.Value ? (string)sqlcmd.Parameters["@decryptedStr"].Value : string.Empty; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
      return string.Empty; 
     } 
     finally 
     { 
      cn.Close(); 
     } 
    } 
} 
+0

감사합니다. Felipe! 다음과 같이 변경했습니다. var sqlcmd = new SqlCommand ("[dbo]. [DecryptCCode]", cn); sqlcmd.CommandType = CommandType.StoredProcedure; 줄을 추가했습니다. – user938455