2014-01-04 2 views
4

Я сохранил процедуру, в которой первые update имеет значения в таблице UserSignUp, а затем insert в таблице 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 

Вот C# код, где я уверен, выполнение моей хранимой процедуры.

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."; 
    } 
} 

Когда я выполнение этого кода он запускает процедуру без insert и update и на моей .aspx страницы я получаю выход Label1 т.е. You are already confirmed.

Кто-нибудь может вести меня, что если я буду неправильно с этим ?

+2

У вашего SP есть проблемы с параллелизмом. –

+2

Что касается вышеизложенного, вы можете заменить весь материал 'IF EXIST5' и просто сделать обновление в любом случае и использовать предложение' OUTPUT', чтобы вставить нужные значения в 'UserKeyPoints' напрямую. Затем проверьте «@@ ROWCOUNT», чтобы узнать, какое значение нужно вернуть. Таким образом, в основном хранимый процесс затем становится двумя операторами и устраняет проблему параллелизма. –

+0

@MartinSmith Ok. Это было бы намного лучше. Благодарю. Позволяет R & D эту технику. – analyticalpicasso

ответ

4

Первой проблемой, которую я вижу, является отсутствие CommandType, установленного в StoredProcedure.
Это основополагающее значение, позволяющее каркасному кодексу правильно интерпретировать вашу строку.

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

Как пояснил в комментарии ниже от Martin Smith, причиной провала вызова является то, что без CommandType правильно установить этот параметр не передается StoredProcedure, но сама процедура выполняется со значением по умолчанию для @ActivationCode параметр

Тогда я написал бы вызов хранимой процедуры с использованием ExecuteScalar вместо использовани SqlDataAdapter просто возвращает одну строку с помощью одного столбца в DataTable

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."; 
} 
+4

Да. отсутствующий тип команды означает, что сохраненная процедура по-прежнему выполняется (пакет, состоящий из одного слова «proc_getActivationCode1», будет рассматриваться как вызов процедуры), но параметр никогда не передается в него. –

+0

Я был уверен, что это вызывает неправильное толкование командного текста и, следовательно, не выполнение процедуры, но я могу ошибаться, есть ли у вас ссылка на добавление ответа? – Steve

+0

'EXEC' является необязательным для первого вызова в пакете. Если вы просто запускаете текст 'sp_help', например, самостоятельно, это рассматривается как вызов процедуры. То же самое произойдет и для 'proc_getActivationCode1' –

Смежные вопросы