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)