C#存储过程或函数需要未提供的参数

hlh*_*406 6 c# sql-server stored-procedures

我是C#的新手,我正在尝试在我的数据库中调用存储过程,该过程需要一个参数.

我得到错误"过程或函数'SP_getName'期望参数'@username',这是未提供的."

当我提供参数时,我的存储过程正常工作,我通过SQL管理工作室运行它.

GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[SP_getName]
    @username = 'bob101'

SELECT  'Return Value' = @return_value

GO
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试调用它时,错误是我如何传递参数,但我无法发现问题所在.

           //create a sql command object to hold the results of the query
            SqlCommand cmd = new SqlCommand();

            //and a reader to process the results
            SqlDataReader reader;

            //Instantiate return string
            string returnValue = null;

            //execute the stored procedure to return the results
            cmd.CommandText = "SP_getName";

            //set up the parameters for the stored procedure
            cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = "bob101";

            cmd.CommandType = CommandType.Text;
            cmd.Connection = this.Connection;

            // then call the reader to process the results
            reader = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

任何帮助发现我的错误将不胜感激!

我也尝试过看这两个帖子,但我没有运气:

存储过程或函数需要未提供的参数

过程或函数需要参数,该参数未提供

谢谢!

Gar*_*thD 16

你说过了:

cmd.CommandType = CommandType.Text;
Run Code Online (Sandbox Code Playgroud)

因此,您只是执行:

SP_getName
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它是批处理中的第一个语句,因此您可以在不使用的情况下调用该过程EXECUTE,但实际上并未包含该参数.将其更改为

cmd.CommandType = CommandType.StoredProcedure;
Run Code Online (Sandbox Code Playgroud)

或者您可以将CommandText更改为:

EXECUTE SP_getName @username;
Run Code Online (Sandbox Code Playgroud)

作为旁注,您应该避免为存储过程使用前缀"sp_"

另外一个注意事项是using与IDisposable对象一起使用以确保它们被正确处理:

using (var connection = new SqlConnection("ConnectionString"))
using (var cmd = new new SqlCommand("SP_getName", connection))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = "bob101";
    connection.Open();
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // Do something 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)