【问题标题】:Missing parameter? even though i have induced it缺少参数?即使我诱导了它
【发布时间】:2014-04-08 12:59:54
【问题描述】:

我正在尝试使用 INSERT 命令将新用户添加到 SQL 数据库,但是当我运行它时会抛出一个错误,指出它需要 @Username 参数。我给了它这个参数:/

任何想法都出错了,我尝试了大约两个小时来修复,但不知道出了什么问题。

我正在使用 ASP.Net Web 表单和 C# 代码

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Web.Security;
using System.Data.SqlClient;
using HashLibrary;
using System.Configuration;
using System.Text.RegularExpressions;
using System.Data;

namespace LetsRentAgentZoneB
{
    public partial class UserAdd : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void LoginBtn_Click(object sender, EventArgs e)
        {
            ResultLbl.Text = Hasher.HashString(PasswordTxt.Text.Trim());
            if (UsernameTxt.Text.Length <= 50 && PasswordTxt.Text.Length <= 25)
            {
                SqlConnection conn = null;

                try
                {
                    conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LetsRent"].ConnectionString);
                    SqlCommand cmd = new SqlCommand("AgentRegisterNewUser", conn);

                    //SqlParameter user = new SqlParameter();
                    //user.ParameterName = "@username";
                    //user.Value = UsernameTxt.Text.Trim();
                    //cmd.Parameters.Add(user);
                    cmd.Parameters.Add("@Username", SqlDbType.VarChar).Value = UsernameTxt.Text.Trim();


                    SqlParameter pass = new SqlParameter();
                    pass.ParameterName = "@password";
                    pass.Value = Hasher.HashString(PasswordTxt.Text.Trim());
                    cmd.Parameters.Add(pass);

                    try
                    {
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        conn.Close();
                        ResultLbl.Text = "User added!";
                    }
                    catch (Exception ex)
                    {
                        ResultLbl.Text = "error";
                        throw new Exception("Execption adding account. " + ex.Message);
                    }
                }
                catch (Exception ex)
                {
                    ResultLbl.Text = "error";
                    throw new Exception("Execption adding account. " + ex.Message);
                }
            }
          }
    }
}

SQL 命令

USE [LetsRent]
GO
/****** Object:  StoredProcedure [dbo].[AgentRegisterNewUser]    Script Date: 08/04/2014 14:03:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Chris
-- Create date: 08/04/2014
-- Description: Adds a new user to AgentUser Database
-- =============================================
ALTER PROCEDURE [dbo].[AgentRegisterNewUser] 
    -- Add the parameters for the stored procedure here
    @Username VarChar(50), 
    @Password VarChar(25) 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT @Username, @Password

    INSERT INTO AgentUsers(Username, Password)
    VALUES ( @Username, @Password);
END

【问题讨论】:

  • 能否请您发布Hasher类的代码。我觉得可能是你的问题。具体来说,我认为问题出在这个类的方法HashString上。
  • 您的SqlCommand 是做什么的?它是一个存储过程吗?它只包含AgentRegisterNewUser??
  • @ChristosPaisios Hasher 类显然是对密码进行哈希处理。这和他的问题有什么关系?
  • 是的,Hasher 类有效。我还发布了 SQL 内部命令
  • 您需要将命令类型指定为存储过程。检查下面 Remus 的答案。我不会添加答案,因为您已经有了一个好的答案,除非您还有其他问题。

标签: c# asp.net sql sql-insert


【解决方案1】:

我猜AgentRegisterNewUser 是一个存储过程,因此cmd.CommandType 应该是StoredProcedure

SqlCommand cmd = new SqlCommand("AgentRegisterNewUser", conn);
cmd.CommandType = CommandType.StoredProcedure;

没有此更改,您正在执行由文本“AgentRegisterNewUser”组成的 T-SQL 批处理。这将编译为调用过程,即使没有 exec,但不会传递任何参数,因为您的参数已传递给 batch

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2022-07-21
  • 1970-01-01
相关资源
最近更新 更多