【问题标题】:Procedure or function expects parameter which was not supplied, when parameter is auto-generated当参数自动生成时,过程或函数需要未提供的参数
【发布时间】:2013-09-27 10:46:29
【问题描述】:

我正在尝试在我的数据库中插入数据。这是我使用的代码

SqlCommand cmd = new SqlCommand("dbo.UsersInsert", cnn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@UserID", SqlDbType.Int);
cmd.Parameters.AddWithValue("@UserFirstName", FirstName.Text);
cmd.Parameters.AddWithValue("@UserMiddleName", MiddleName.Text);
cmd.Parameters.AddWithValue("@UserLastName", LastName.Text);

等等……

它给了我错误

过程或函数“UsersInsert”需要参数“@UserID”,它 未提供。

在 cmd.ExecuteNonQuery();行。

在这里,我的用户 ID 是在我的数据库中自动生成的。我该如何解决这个问题?

存储过程

 @UserID INT OUTPUT,   
 @UserFirstName VARCHAR (50),  
 @UserMiddleName VARCHAR (50),  
 @UserLastName VARCHAR (50), etc... 

AS  
SET NOCOUNT ON  
DECLARE @ReturnValue int  
BEGIN  

 SELECT @ReturnValue = 0  

 INSERT [Users]  
 ( 
            [UserFirstName]
           ,[UserMiddleName]
           ,[UserLastName] etc... 
 values (

         @UserFirstName,  
                 @UserMiddleName,  
                 @UserLastName,  etc.. )
IF (@@Error <> 0) GOTO ERROR_HANDLER

 GOTO OnExit  
END  

【问题讨论】:

标签: c# sql database sql-server-2008 autogeneratecolumn


【解决方案1】:

你应该把它设为ParameterDirection.Output

SqlParameter userIdParam = new SqlParameter("@UserID", SqlDbType.Int);
userIdParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(userIdParam);

这样你就不必提供值了

【讨论】:

  • 我试过你说的,现在它给了我,“将数据类型 nvarchar 转换为 int 时出错。”这个错误。
  • 这意味着您的存储过程已将 UserID 参数定义为 nvarchar。或者您应该将存储过程更改为 int,或者您应该将 SqlParameter dbType 更改为 nvarchar。
  • Storedprocedure 已将 UserID 定义为 int。我将参数转换为 nvarchar,然后它给了我错误“将数据类型 int 转换为 nvarchar 时出错。”。这变得非常令人沮丧。
  • 在storedproc 中你在哪里分配@UserID?我猜这将是 DBNull。 DBNull 不能转换为 int。尝试在 StoredProc 末尾设置SET @UserID = SCOPE_IDENTITY()
  • 试过了。徒劳无功。 :( 顺便说一句,有人知道如何在 MS SQL 服务器中编辑函数吗?
【解决方案2】:

下面的代码应该可以工作,改变sql来接受参数

SqlCommand cmd = new SqlCommand("dbo.UsersInsert @UserID out, @UserFirstName, @UserMiddleName, @UserLastName", cnn);

然后改变参数如下

var id = new SqlParameter("UserID", System.Data.SqlDbType.Int);
id.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(id);

cmd.Parameters.AddWithValue("UserFirstName", FirstName.Text);
cmd.Parameters.AddWithValue("UserMiddleName", MiddleName.Text);
cmd.Parameters.AddWithValue("UserLastName", LastName.Text);

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多