存储过程不在表中插入值

时间:2014-01-04 10:58:25

标签: c# asp.net sql-server stored-procedures

我已经存储了程序,其中update表中的值UserSignUpinsert表中的值,然后是UserKeyPoints表中的CREATE PROC [dbo].[proc_getActivationCode] @ActivationCode VARCHAR(1000)='' AS BEGIN IF EXISTS(SELECT ActivationCode FROM UserSignUp WHERE ActivationCode = @ActivationCode AND Activate = 'False') BEGIN DECLARE @UserId INT SET @userid= (SELECT AutoID FROM UserSignUp WHERE ActivationCode = @ActivationCode) UPDATE UserSignUp SET Activate = 'Confirm Code' WHERE ActivationCode = @ActivationCode INSERT INTO UserKeyPoints (KeyPoints, UserId) VALUES (500, @userid) SELECT 1 END ELSE BEGIN SELECT 2 END END ,但我的程序没有执行。

这是我的存储过程:

if (Request.QueryString["token"] != null)
{
    Label1.Text = Request.QueryString["token"];
    con.Open();
    SqlCommand cmd = new SqlCommand("proc_getActivationCode1", con);
    cmd.Parameters.AddWithValue("@ActivationCode", Request.QueryString["token"].ToString());
    SqlDataReader dr = cmd.ExecuteReader();
    DataTable dt = new DataTable();
    dt.Load(dr);
    dr.Close();
    con.Close();

    if (dt.Rows[0][0].ToString() == "1")
    {
        //Label1.Text = "You are confirmed successfully. Please Click here for Login: ";
        SendEmail objMail = new SendEmail();

    }
    else
    {
        Label1.Text = "You are already confirmed.";
    }
}

这是我执行存储过程的c#代码。

insert

当我执行此代码时,它会运行没有update.aspx的过程,而在我的Label1页面上,我会得到You are already confirmed.的输出,即{{1}}

有人可以指导我哪里出错吗?

1 个答案:

答案 0 :(得分:4)

我能看到的第一个问题是缺少CommandType设置为StoredProcedure 这是允许框架代码正确解释您的字符串的基础。

SqlCommand cmd = new SqlCommand("proc_getActivationCode1", con);
cmd.CommandType = CommandType.StoredProcedure;

正如下面Martin Smith中的注释所解释的那样,调用失败的原因是没有正确设置CommandType,参数不会传递给storedprocedure,而是使用默认值执行过程本身@ActivationCode参数

然后我会使用ExecuteScalar而不是使用SqlDataAdapter来编写对存储过程的调用,只返回一个数据表中有一列的单行

SqlCommand cmd = new SqlCommand("proc_getActivationCode1", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@ActivationCode", Request.QueryString["token"].ToString());
object result = cmd.ExecuteScalar();
if(result != null)
{
    int resultValue = Convert.ToInt32(result);
    if (resultValue == 1)
        SendEmail objMail = new SendEmail();
    else
        Label1.Text = "You are already confirmed.";
}