2017-06-06 59 views
0

我有一个基本的存储过程C#ODBC存储过程调用 - 过程或函数期望但未提供

ALTER PROCEDURE [dbo].[GetOrdersEmailContent] 
    @Name nvarchar(50), 
    @Body nvarchar(2000) OUTPUT 
AS 
BEGIN 
    --SET NOCOUNT ON 
    SET @Body = (SELECT Content 
       FROM ORDERS_tblEmailContent 
       WHERE Name = @Name) 
END 

其中我是从C#调用用下面的代码

using (DbConnection) 
{ 
    DbConnection.Open(); 

    using (OdbcCommand DbCommand = DbConnection.CreateCommand()) 
    { 
     DbCommand.CommandType = CommandType.StoredProcedure; 
     DbCommand.CommandText = " GetOrdersEmailContent"; 

     DbCommand.Parameters.Add("@Name", OdbcType.NVarChar, 50); 
     DbCommand.Parameters["@Name"].Value = templateName; 
     DbCommand.Parameters["@Name"].Direction = ParameterDirection.Input; 

     DbCommand.Parameters.Add("@Body", OdbcType.NVarChar, 2000); 
     DbCommand.Parameters["@Body"].Value = DBNull.Value; 
     DbCommand.Parameters["@Body"].Direction = ParameterDirection.Output; 

     DbCommand.ExecuteNonQuery(); 

     emailBody = DbCommand.Parameters["@Body"].Value.ToString(); 
    } 
} 

DbConnection.Close(); 

当参数ExecuteNonQuery运行,它返回以下错误:

ERROR [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Procedure or function 'GetOrdersEmailContent' expects parameter '@Name', which was not supplied.

任何人都可以建议吗?我已经查看了其他类似的问题,但没有解决方案适用或解决问题

+0

你可以试试这个'DbCommand.Parameters.Add( “@名称”,OdbcType.NVarChar,50).value的= TEMPLATENAME;' –

+0

你肯定' templateName'不是null? – jamiedanq

+0

Kashi_rock - 恐怕这没有什么区别 – CarlG

回答

0

考虑到templateName还没有为空。没有需要为@Name指定方向:

using (DbConnection) 
     { 
      DbConnection.Open(); 
      using (OdbcCommand DbCommand = DbConnection.CreateCommand()) 
      { 
       DbCommand.CommandType = CommandType.StoredProcedure; 
       DbCommand.CommandText = " GetOrdersEmailContent"; 

       DbCommand.Parameters.Add("@Name", OdbcType.NVarChar, 50); 
       DbCommand.Parameters["@Name"].Value = templateName; 

       DbCommand.Parameters.Add("@Body", OdbcType.NVarChar, 2000); 
       DbCommand.Parameters["@Body"].Value = DBNull.Value; 
       DbCommand.Parameters["@Body"].Direction = ParameterDirection.Output; 

       DbCommand.ExecuteNonQuery(); 

       emailBody = DbCommand.Parameters["@Body"].Value.ToString(); 
      } 
     } 
     DbConnection.Close(); 
相关问题