0

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

2 に答える 2

1

失敗は、接続文字列のセキュリティ コンテキストが原因である可能性があります。現在の Web ユーザーの IIS 偽装で実行していると仮定すると、既定の動作ではありません。

接続文字列で指定することによりIntegrated Security=True、データベースへのアクセスを試みているユーザーとして現在の Windows コンテキストを受け入れるように SQL Server に指示します。IIS で実行している場合、これは自分のアカウントではなく、IIS アプリケーション プール アカウントになります。

Web アプリケーションで統合セキュリティを使用する代わりに、SQL Server のユーザー名とパスワードを作成し、それらを接続文字列に指定してみてください。別の方法として、アプリケーション プールの Windows ID を設定することもできますが、これは通常、維持と移行が面倒です... 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();
    
    }
    
于 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 に答える