繁体   English   中英

SQL值未发送到表(C#/ ASP.NET)

[英]SQL values not sent to table (C#/ASP.NET)

我正在尝试建立一个页面来复制使用C#,ASP.NET和MSSQL(如果重要的话,MSSQLEXPRESS)的ATM。 其中一部分是“新用户”页面,用于“注册”“服务”。 问题是,当我测试页面时,无论输入多少数字,都会收到一条错误消息,设置为检测无效的信用卡号。 我认为问题出在我的点击事件代码,C#查询代码或事件的存储过程中。 我认为解决此问题的方法很可能是简单的,但也许一双新鲜的眼睛会看到问题所在。

任何帮助或建议,将不胜感激。

单击按钮的代码:

protected void btnSubmit_Click(object sender, EventArgs e)
    {
        string display;
        long cardnum;
        string strcard = Request.Params.Get("__CREDITCARD");
        if (long.TryParse(strcard, out cardnum))
        {
            string first = Request.Params.Get("__FIRSTNAME");
            string middle = Request.Params.Get("__MIDDLENAME");
            string last = Request.Params.Get("__LASTNAME");
            string email = Request.Params.Get("__EMAIL");
            string address = Request.Params.Get("__ADDRESS");
            string username = Request.Params.Get("__USERNAME");
            string password = Request.Params.Get("__PASSWORD");
            int retcode = SqlQueries.changeUserInfo(cardnum, username, password, first, middle, last, email, address, out display);
            switch (retcode)
            {
                case 1:
                    display = "Credit card number can only contain digits";
                    Alert.show(Page, this.GetType(), "Input Error", display);
                    UserDetails.Username = username;
                    UserDetails.Password = password;
                    Response.Redirect("HomePage.aspx");
                    return;

                case 0:
                    display = "Invalid credit card number";
                    break;
            }
        }
        else
        {
            display = "Credit card number can only contain digits";
        }

        Alert.show(Page, this.GetType(), "Input Error", display);
    }

它使用我的SqlQueries类中的changeUserInfo方法:

public static int changeUserInfo(long cardNum, string username, string password, string strFirstName, string strMiddleName, string strLastName, string strEmail, string strAddress, out string strError)
    {
        //SQL connection
        SqlConnection objConn = new SqlConnection(strconnectionSting);
        objConn.Open();
        int intReturnValue = -1;
        strError = string.Empty;
        //If connection is open

        if (objConn != null && objConn.State == ConnectionState.Open)
        {
            //Call to stored procedure: qprtnum_UpdatePartNumber
            SqlCommand cmd = new SqlCommand("updateUserInfo", objConn);
            cmd.CommandType = CommandType.StoredProcedure;
            try
            {
                cmd.Parameters.Add(new SqlParameter("@CardNum", SqlDbType.Decimal, 150));
                cmd.Parameters["@CardNum"].Precision = 18;
                cmd.Parameters["@CardNum"].Scale = 0;
                cmd.Parameters["@CardNum"].Value = cardNum;
                cmd.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar, 50));
                cmd.Parameters["@Username"].Value = username;
                cmd.Parameters.Add(new SqlParameter("@Password", SqlDbType.NVarChar, 50));
                cmd.Parameters["@Password"].Value = password;
                cmd.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar, 150));
                cmd.Parameters["@FirstName"].Value = strFirstName;
                cmd.Parameters.Add(new SqlParameter("@MiddleName", SqlDbType.NVarChar, 150));
                cmd.Parameters["@MiddleName"].Value = strMiddleName;
                cmd.Parameters.Add(new SqlParameter("@LastName", SqlDbType.NVarChar, 150));
                cmd.Parameters["@LastName"].Value = strLastName;
                cmd.Parameters.Add(new SqlParameter("@EmailAddress", SqlDbType.NVarChar, 50));
                cmd.Parameters["@EmailAddress"].Value = strEmail;
                cmd.Parameters.Add(new SqlParameter("@Address", SqlDbType.NVarChar, 150));
                cmd.Parameters["@Address"].Value = strEmail;


                //Return Value
                cmd.Parameters.Add("@ReturnValue", SqlDbType.Int);
                cmd.Parameters["@ReturnValue"].Direction = ParameterDirection.ReturnValue;

                cmd.ExecuteNonQuery();
                intReturnValue = (int)cmd.Parameters["@ReturnValue"].Value;

                strError = string.Empty;
            }
            catch (SqlException err)
            {
                intReturnValue = -1;
                strError = err.Message;
            }
            catch (Exception ex)
            {
                intReturnValue = -1;
                strError = ex.Message;
            }
            finally
            {
                objConn.Close();
            }
        }
        else
        {
            //Error
            intReturnValue = -1;
            strError = "Error";
        }
        return intReturnValue;
    }

存储过程“ updateUserInfo”:

    USE [ATM]
GO
/****** Object:  StoredProcedure [dbo].[updateUserInfo]    Script Date: 4/15/2014 1:43:28 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[updateUserInfo] 
    @CardNum AS decimal,
    @Username AS nvarchar(50),
    @Password AS nvarchar(50),
    @FirstName AS nvarchar(150),
    @MiddleName AS nvarchar(150),
    @LastName AS nvarchar(150),
    @EmailAddress nvarchar(50),
    @Address nvarchar(150)
AS
BEGIN TRY
    BEGIN TRANSACTION    
    DECLARE @ReturnValue AS INT;

    --Set current date
    DECLARE @Date AS numeric(18,0);
    DECLARE @Hours int;
    DECLARE @Minutes int;
    DECLARE @Seconds int;
    DECLARE @Milliseconds INT;
    DECLARE @CurDate as VARCHAR(50);

    SET @Hours = DATEPART(hh, GETDATE())
    SET @Minutes = DATEPART(mi, GETDATE())
    SET @Seconds = DATEPART(ss, GETDATE())


    SELECT @CurDate = CONVERT(VARCHAR(35),GETDATE(),112)
    SET @CurDate = @CurDate + CONVERT(VARCHAR(5), @Hours) + CONVERT(VARCHAR(5), @Minutes) + CONVERT(VARCHAR(5),@Seconds)

    SELECT @Date = CONVERT(decimal(18,0), @CurDate)

    -- Insert statements for procedure here


    enter code here
    UPDATE dbo.tblClient
       SET [cliCardNum] = @CardNum
          ,[cliFirstName] = @FirstName
          ,[cliMiddleName] = @MiddleName
          ,[cliLastName] = @LastName 
          ,[cliEmailaddress] = @EmailAddress
          ,[cliAddress] = @Address
          ,[TimeStamp] = @Date
          ,Enabled = 1
     WHERE cliUsername=@Username AND cliPassword=@Password

    SET @ReturnValue=0;
    COMMIT TRANSACTION;
    RETURN @ReturnValue
END TRY
BEGIN CATCH
  IF @@TRANCOUNT > 0
     ROLLBACK

    -- Raise an error with the details of the exception
    DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
    SELECT @ErrMsg = ERROR_MESSAGE(),
         @ErrSeverity = ERROR_SEVERITY()

    RAISERROR(@ErrMsg, @ErrSeverity, 1)
    SET @ReturnValue=-1;
    Print @ReturnValue
    RETURN @ReturnValue;
END CATCH

我认为问题在于从存储过程中选择返回值 我用一个简单的存储过程在C#中做了一个简单的例子。

// demo code to select the return value
string conStr = @"data source=*****; initial catalog=demoDb; integrated security=true";
SqlConnection con = new SqlConnection(conStr);
SqlCommand com = new SqlCommand("declare @return_status int; exec @return_status = demoProcedure; select @return_status", con);
con.Open();
Console.WriteLine(com.ExecuteScalar());
con.Close();

我的演示存储过程

create PROCEDURE demoProcedure      
AS
BEGIN
    return 1;
END
GO

Technet上找到了此示例。 希望您可以将我的示例适应您的代码! 如果我确实误解了您的问题,或者代码中的任何内容有误-请让我知道!

编辑

在考虑您的问题时,我在technet文章上记了以下短语

无条件退出查询或过程。 RETURN是立即且完整的,可在任何时候用于退出过程,批处理或语句块。 不执行RETURN之后的语句。

因此,当您更改过程以选择一个值而不是返回一个值时,可以将代码修改为:

string conStr = @"data source=***; initial catalog=demoDb; integrated security=true";
SqlConnection con = new SqlConnection(conStr);
SqlCommand com = new SqlCommand("demoProcedure", con);
com.CommandType = System.Data.CommandType.StoredProcedure;
con.Open();
Console.WriteLine(com.ExecuteScalar());
con.Close();

一个简单的过程

create PROCEDURE demoProcedure      
AS
BEGIN
    select 1;
END

编辑2

如果成功 ,则存储过程返回0,如果失败 ,则返回-1 但是在btnClick事件中,您选择的stmt检查1 =成功0 =失败 请尝试将您的代码更改为

protected void btnSubmit_Click(object sender, EventArgs e)
{
    string display;
    long cardnum;
    string strcard = Request.Params.Get("__CREDITCARD");
    if (long.TryParse(strcard, out cardnum))
    {
        // your code goes here ...
        switch (retcode)
        {
            case 0:    // changed to reflect returnValue from stored Procedure
                // your code goes here ...
                return;

            case -1:    // changed to reflect returnValue from stored Procedure
                display = "Invalid credit card number";
                break;
        }
    }
    // your code goes here ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM