0

我写了一个存储过程来更新PAIDtblUser,并且该存储过程完美地工作,

代码:

    @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();
}
4

2 回答 2

1

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

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

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

顺便说一句,这里还有一些需要考虑的事情......

  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();
    
    }
    
于 2013-01-04T15:00:10.847 回答
0

根据我在此处阅读的内容,我似乎未将值正确设置为 Request 对象中的变量。

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

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

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

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

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

希望,这会有所帮助......祝你好运......

于 2013-04-10T13:22:18.587 回答