从asp.net调用存储过程不起作用

时间:2013-01-04 14:43:12

标签: asp.net sql-server-2008 stored-procedures ado.net sql-update

我编写了一个存储过程来更新PAID中的tblUser列,并且该存储过程完美无缺,

代码:

    @buyer_email varchar(50),
    @payment bit
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
       SET NOCOUNT ON;

    update tblUser set paid=@payment where email = @buyer_email
END

但是当我从我的asp.net应用程序调用它时,它不会更新Paid列,即使我在我的asp.net代码中尝试简单的更新语句但是也没有更新列

String userEmail_send = (Convert.ToString(Request.QueryString["emailAdmin"]));
String conString = "Data Source=COSANOSTRA; MultipleActiveResultSets=true; Initial   Catalog=Waleed_orsfinal;Integrated Security=True";

try
{
         con.Open();

        if (userEmail_get.Replace("'", string.Empty) == userEmail_send.Replace("''", string.Empty))
        {
            //String query1 = "update tblUser Set paid=1 where email='" + userEmail_send + "' ";
            SqlCommand sqlcom1 = new SqlCommand("submitPaypalPayment", con);
            sqlcom1.CommandType = CommandType.StoredProcedure;
            sqlcom1.Parameters.Add("@buyer_email", SqlDbType.VarChar).Value = userEmail_send;
            sqlcom1.Parameters.Add("@payment", SqlDbType.Bit).Value= 1 ;
            sqlcom1.ExecuteScalar();

            hdr_msg_success.InnerText = "Congrats, You have paid successfully. Wait for an approval by an admin ";
            Response.Write("<br/>"+" "+ "Matched=" +userEmail_send.Replace("''","'"));
   }
   else
   {
            hdr_msg_success.InnerText = "Something went wrong in matching Emails , Please confirm your Email";               
   }
}
catch (Exception exc)
{
        Response.Write(exc.Message);
}
finally
{
        con.Close();
}

2 个答案:

答案 0 :(得分:1)

失败可能是由于您的connectionstring安全上下文造成的。 假设您在IIS下运行当前Web用户的模拟不是默认行为。

通过在您的连接字符串中指定Integrated Security=True,您告诉SQL Server接受当前Windows上下文作为尝试访问数据库的用户。在IIS下运行时,这将是IIS应用程序池帐户,而不是您自己的帐户。

尝试创建SQL Server用户名和密码,并在connectionstring中指定它们,而不是使用Web应用程序的集成安全性。您也可以设置应用程序池Windows身份,但维护和迁移通常更麻烦......还有允许Web用户模拟的选项,但这样做更加笨拙。

顺便说一下,还有其他一些事情要考虑......

  1. 将您的连接字符串存储在配置文件中,而不是硬编码(我知道这可能只是测试代码,但如果不是......)
  2. 考虑在您的用例中使用ADO.net中的存储过程进行交互。

    using (SqlCommand sqlcom1 = new SqlCommand("dbo.submitPaypalPayment", con)) 
    {
       sqlcom1.CommandType = CommandType.StoredProcedure;
    
       sqlcom1.Parameters.Add("@buyer_email", SqlDbType.VarChar) { Value = userEmail_send };
       sqlcom1.Parameters.Add("@payment", SqlDbType.Bit) { Value= 1 };
    
       sqlcom1.ExecuteNonQuery();
    
    }
    

答案 1 :(得分:0)

根据我在这里阅读的内容,我似乎没有正确设置Request对象中的变量值。

您是否尝试过设置断点并检查从此语句为userEmail_send变量设置的值 [String userEmail_send = (Convert.ToString(Request.QueryString["emailAdmin"]));]

可能是它没有为该变量设置正确的值。

在此行sqlcom1.ExecuteScalar();处设置断点并检查参数值。

您可以通过序号位置或参数名称来执行此操作,如下所示: 按顺序排名sqlcom1.Parameters[0].Value或按名称sqlcom1.Parameters["@buyer_email"].Value

排序

也为你的@payment参数做同样的事情。记住它的顺序位置是1。

希望,这有助于......祝你好运......