Qty Control в C # - PullRequest
       5

Qty Control в C #

0 голосов
/ 07 декабря 2010

pstrjds, из кода, который вы предоставили, я пытаюсь реализовать этот код и ссылку msdn, которую вы предоставили пару дней назад. Я не уверен, как его собрать, но я вижу сообщение: «Имя переменной @ID» уже объявлено. Имена переменных должны быть уникальными в пакете запроса или хранимой процедуре » Нужно ли создавать хранимые процедуры? Могу ли я предположить, что у меня тоже есть правильный бит идентификатора, где вы объясняли, сколько раз? Спасибо. введите код здесь

        cs.Open();
        int remainingStock = 0;
        string Query = "SELECT StockA SET QTY = @QTY " + "WHERE ID = @ID;";
           SqlCommand cmd = new SqlCommand(Query, cs);
            cmd.Parameters.Add("@ID", SqlDbType.Int);
            cmd.Parameters["@ID"].Value = 1;
            cmd.Parameters.AddWithValue("@ID", Query);
            try
            {
                if (remainingStock == 1)
                {
                    lbqty.Text = "Not enough stocks.";
                }
                else
                {
                    cmd.CommandText = "UPDATE StockA SET QTY = QTY-1   
                    WHERE ID=1";
                    int rowsUpdated = cmd.ExecuteNonQuery();
                    remainingStock--;
                    string remaining = "Remaining stocks: " +  
                    remainingStock.ToString();
                    txQty.Text = remaining;
                    lbqty.Text = remaining;
                    DGA.Update(); //this is DataGridView
                }
                Int32 rowsAffected = cmd.ExecuteNonQuery();
                Console.WriteLine("RowsAffected: {0}", rowsAffected);

            }
            catch (Exception ex)
            {
               MessageBox.Show(ex.Message);
            }
            cs.Close();

    }

Ответы [ 5 ]

5 голосов
/ 08 декабря 2010

Проблема в том, что вы не проверяете случай, когда ret == -1.Изменение вашего второго оператора if на if(ret < 1) должно исправить вашу проблему.

Кроме того, непосредственно после строки cmd.ExecuteNonQuery(); добавьте ret--;, чтобы синхронизировать переменную ret со значением, которое сейчас находится в базе данных..

3 голосов
/ 08 декабря 2010

Я думаю, что это ваша проблема - вы делаете ret - 1 во время обработки, а затем

txtQty.Text = "Remaining stocks: " + (ret - 1).ToString();
lbqty.Text = "Remaining stocks: " + (ret - 1).ToString();

, что показывает на один элемент меньше.Попробуйте сделать это:

txtQty.Text = "Remaining stocks: " + ret.ToString();
lbqty.Text = "Remaining stocks: " + ret.ToString();
1 голос
/ 08 декабря 2010

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

cmd.ExecuteNonQuery();

в вашем операторе else, я полагаю, вы получите значение 0. Это означает, что записи не обновлялись. Я считаю, что проблема в точности связана с вашим запросом. Если вы подключаетесь к своей базе данных с помощью такой утилиты, как LINQPad или Sql Management studio, и запускаете запрос, который вы указали в своем коде, я думаю, вы обнаружите, что он ничего не обновляет. Я очень подозреваю, что ваш инвентарь не хранится в таблице с именем tblContacts. Вот почему вы не можете выбрать количество или обновить количество в нем.

Edit: Имел в виду упомянуть об этом сначала, а затем отвлекся и забыл добавить его. Я бы поместил ваш SqlCommand в оператор использования. Объект SqlCommand является одноразовым, поэтому рекомендуется размещать одноразовые объекты в операторе using или в некотором виде шаблона try / finally, где их можно очистить.

Дополнительное редактирование - реструктуризация вашего кода:

    cs.Open();
    int remainingStock = 0;
    string Query = "SELECT QTY from tblInventory WHERE ID=19";
    using(SqlCommand cmd = new SqlCommand(Query, cs))
    {
        var result = cmd.ExecuteScaler();
        if (result != null)
        {
            string str = result.ToString();
            if (!string.isNullOrWhiteSpace(str))
            {
                // NOTE: It would probably be safer to use int.TryParse here
                remainingStock = Convert.ToInt32(cmd);
            }

            if (remainingStock == 0)
            {
                lbqty.Text = "Not enough stocks.";
            }
            else
            {
                cmd.CommandText = "UPDATE tblInventory SET QTY = QTY-1 WHERE ID=19";
                int rowsUpdated = cmd.ExecuteNonQuery();
                remainingStock--;

                if (remainingStock == 1)
                {
                    lbqty.Text = "Re-order. Remaining stocks: 1";
                }
                else
                {
                    string remaining = "Remaining stocks: " + remainingCount.ToString();
                    txtQty.Text = remaining;
                    lbqty.Text = remaining;
                }
            }
        }
        else
            lbqty.Text = "No stock for contact";
        }

        dgUpdate();
    }
    cs.Close();
1 голос
/ 07 декабря 2010

Ваш поток приложений должен быть следующим:

protected void Button1_Click(object sender, EventArgs e)
    {
        SqlConnection c = new SqlConnection("Data Source=.; Integrated Security=SSPI; Initial Catalog=FA");


        SqlCommand cmd = new SqlCommand();
        cmd.Connection = c;
        c.Open();

        // get remaining stocks
        cmd.CommandText = "SELECT Qty from TEST WHERE Id=1";
        int ret = Convert.ToInt32(cmd.ExecuteScalar().ToString());

        if (ret == 0)
        {
            Label1.Text = "Not enough stocks.";
        }
        else 
        {
            cmd.CommandText = "UPDATE TEST SET Qty = Qty-1 WHERE Id=1";
            cmd.ExecuteNonQuery();

            if (ret == 2)
            {
                Label1.Text = "Re-order. Remaining stocks: 1";
            }
            else
            {
                Label1.Text = "Remaining stocks: " + (ret-1).ToString();
            }
        }


        c.Close();
    }
0 голосов
/ 08 декабря 2010

Первое, что я вижу, это то, что это неправильно

 if (ret == 1)
        {
            lbqty.Text = "Re-order. Remaining stocks: 1";
            dgUpdate();
        }
        else

должно быть

 if (ret - 1  == 1)
        {
            lbqty.Text = "Re-order. Remaining stocks: 1";
            dgUpdate();
        }
        else

потому что когда значение, которое вы читаете, равно 1, а вы уменьшаете его, оно равно 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...