C# 从C执行SQL存储过程时出现问题

C# 从C执行SQL存储过程时出现问题,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我在SQL Server中有一个现有的存储过程,我需要从我的C代码中调用它并获得结果。下面是此SP的外观 CREATE PROCEDURE [dbo].[sp_MSnextID_DDB_NextID] @tablesequence varchar(40) AS declare @next_id integer begin transaction update DDB_NextID set DDB_SEQUENCE = DDB_SEQUENCE + 1 where DDB_TABLE = @tab

我在SQL Server中有一个现有的存储过程,我需要从我的C代码中调用它并获得结果。下面是此SP的外观

CREATE PROCEDURE [dbo].[sp_MSnextID_DDB_NextID]
@tablesequence varchar(40)
AS
declare @next_id integer
begin transaction
update DDB_NextID
set DDB_SEQUENCE = DDB_SEQUENCE + 1
where DDB_TABLE = @tablesequence
select @next_id = DDB_SEQUENCE from DDB_NextID 
where DDB_TABLE = @tablesequence
commit transaction
RETURN @next_id
这是我的C代码

using (OdbcConnection connection = new OdbcConnection(GetConnectionString()))
{
   using (IDbCommand command = new OdbcCommand())
   {
      command.CommandText = "sp_MSnextID_DDB_NEXTID";
      command.CommandType = CommandType.StoredProcedure;
      IDbDataParameter parameter1 = command.CreateParameter();
      parameter1.DbType = DbType.String;
      parameter1.ParameterName = "@tablesequence";
      parameter1.Value = "ddb_dc_document";
      parameter1.Direction = ParameterDirection.Input;
      command.Parameters.Add(parameter1);

      IDbDataParameter parameter2 = command.CreateParameter();
      parameter2.DbType = DbType.Int32;
      parameter2.ParameterName = "@Return_Value";
      parameter2.Direction = ParameterDirection.ReturnValue;
      command.Parameters.Add(parameter2);
      command.Connection = connection;
      connection.Open();
      command.ExecuteNonQuery();
      IDbDataParameter o = (command.Parameters)["@Return_Value"] as IDbDataParameter;
      //Got return value from SP in o.Value
   }
}
问题是我遇到了例外

[42000][Microsoft][SQL原生客户端][SQL Server]过程或函数“sp_MSnextID_DDB_NextID”需要参数“@tablesequence”, 没有提供

我无法解释或修正。我错过了什么

为了找到解决方法,我尝试了不同的方法:执行以下查询,在临时表中设置数据

create table #temp  (i integer); insert into #temp exec sp_MSNextID_DDB_NEXTID @tablesequence='ddb_dc_document';select * from #temp;

在这种情况下,SP正确执行,但select返回零行

要使您的解决方案起作用,您应该更换

RETURN @next_id 
在你的程序中

SELECT @next_id 

要使您的变通方法发挥作用,您应该更换

RETURN @next_id 
在你的程序中

SELECT @next_id 
不幸的是

不幸的是


为什么要使用旧的、旧的OdbcConnection和OdbcCommand??实际上没有意义-改用System.Data.SqlClient中的SqlConnection和SqlCommand!为什么要使用旧的、旧的OdbcConnection和OdbcCommand??实际上没有意义-改用System.Data.SqlClient中的SqlConnection和SqlCommand!就是这样:不能将命名参数与OdbcCommand一起使用。我不知道该怎么做调用sp_MSnextID_DDB_NEXTID将帮助我从sp获取返回值。顺便说一句,我使用SQLConnection和SQLParameter重新实现了我的代码,代码运行良好。谢谢您在ODBC中,参数是位置参数呼叫表示第一个参数设置为调用结果,在代码中为@Return\u值。第二个?是存储过程的参数,与第二个参数匹配,您在代码中将其命名为@tablesequence。但是,是的,如果您不需要ODBC,那么这些都不重要:。就是这样:您不能将命名参数与OdbcCommand一起使用。我不知道该怎么做调用sp_MSnextID_DDB_NEXTID将帮助我从sp获取返回值。顺便说一句,我使用SQLConnection和SQLParameter重新实现了我的代码,代码运行良好。谢谢您在ODBC中,参数是位置参数呼叫表示第一个参数设置为调用结果,在代码中为@Return\u值。第二个?是存储过程的参数,与第二个参数匹配,您在代码中将其命名为@tablesequence。但是,是的,如果你不需要ODBC,那么这些都不重要。