Этот же объект получил исключение при обновлении, но не при вставке - PullRequest
0 голосов
/ 27 апреля 2018

Я строю объект с информацией, что после этого он будет работать в фоновом потоке, чтобы сделать то, что должно быть сделано с БД.

Один и тот же объект всегда создается одинаково, поэтому он увидит, существуют ли все rdy внутри БД, если он это сделает, обновит его, если не вставит новый.

Вставка работала на все 100%, но при попытке обновления возникла ошибка

Control.Invoke должен использоваться для взаимодействия с элементами управления, созданными на отдельная тема.

в Microsoft.AGL.Common.MISC.HandleAr (PAL_ERROR ar) в System.Windows.Forms.Control.get_Text () в System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery () в DocumentForm.RunOnBackGroundDB ()

Это код:

Как я строю Объект

this._IdentifierToCheck = this.textBoxIdentifier.Text;
this._CodBarToCheck = this.textBoxCodBar.Text;
this._prodToShow = new ProdToShow();
this._prodToShow.Ref = this.textBoxRef.Text;
this._prodToShow.Descr = this.textBoxDescr.Text;
this._prodToShow.PreviousQtd = float.Parse(this.textBoxPrevQtd.Text);
this._prodToShow.Qtd = float.Parse(this.textBoxNewQtd.Text);
this._prodToShow.Price = float.Parse(this.textBoxPrice.Text);
this._prodToShow.UnitType = this._unitList[this.comboBoxUnits.SelectedIndex].id;
this._prodToShow.UnitValue = float.Parse(this._unitList[this.comboBoxUnits.SelectedIndex].unit);
if (String.Equals(this.btnNewProdOpType.Text, "+"))
{
    this._prodToShow.AddEquals = true;
}
else
{
    this._prodToShow.AddEquals = false;
}
this._workerThread.Start();

Код, когда Новый или должен быть обновлен

if (prodExistOnDoc)
{
    using (SqlCommand cmd = con.CreateCommand())
    {
        float total = 0;
        if (this._prodToShow.AddEquals)
        {
            total = this._prodToShow.PreviousQtd + this._prodToShow.Qtd;
        }
        else
        {
            total = this._prodToShow.Qtd;
        }
        cmd.CommandText = "UPDATE Pda_Lancamentos_lin Cod_Art = @codArt, Descricao = @descr, Qtd = @Qtd, Preço = @price, id_uni = @unitID, unidade = @unit "
            + "WHERE Tipo = @type AND Identificador = @iden AND Cod_Barras = @codBar";
        cmd.Parameters.AddWithValue("@type", this._tempDocInfo.Type);
        cmd.Parameters.AddWithValue("@iden", this._IdentifierToCheck);
        cmd.Parameters.AddWithValue("@codBar", this._CodBarToCheck);
        cmd.Parameters.AddWithValue("@codArt", this._prodToShow.Ref);
        cmd.Parameters.AddWithValue("@descr", this._prodToShow.Descr);
        cmd.Parameters.AddWithValue("@Qtd", total);
        cmd.Parameters.AddWithValue("@price", this._prodToShow.Price);
        cmd.Parameters.AddWithValue("@unitID", this._prodToShow.UnitType);
        cmd.Parameters.AddWithValue("@unit", this._prodToShow.UnitValue);
        cmd.ExecuteNonQuery();
    }
}
// New prod to the document
else
{
    using (SqlCommand cmd = con.CreateCommand())
    {
        cmd.CommandText = "INSERT INTO Pda_Lancamentos_Lin (Tipo, Identificador, Cod_Barras, Cod_Art, Descricao, Qtd, Preço, id_uni, unidade) VALUES " +
            "(@type, @iden, @codBar, @codArt, @descr, @Qtd, @price, @unitID, @unit)";
        cmd.Parameters.AddWithValue("@type", this._tempDocInfo.Type);
        cmd.Parameters.AddWithValue("@iden", this._IdentifierToCheck);
        cmd.Parameters.AddWithValue("@codBar", this._CodBarToCheck);
        cmd.Parameters.AddWithValue("@codArt", this._prodToShow.Ref);
        cmd.Parameters.AddWithValue("@descr", this._prodToShow.Descr);
        cmd.Parameters.AddWithValue("@Qtd", this._prodToShow.Qtd);
        cmd.Parameters.AddWithValue("@price", this._prodToShow.Price);
        cmd.Parameters.AddWithValue("@unitID", this._prodToShow.UnitType);
        cmd.Parameters.AddWithValue("@unit", this._prodToShow.UnitValue);
        cmd.ExecuteNonQuery();
    }
}

Из того, что я понял из Исключения, можно сказать, что я не могу получить доступ к Forms.Control, но у меня нет доступа ни к чему подобному, при обновлении единственная разница состоит в том, что я должен вычислить qtd, если нужно добавить к предыдущему, и я передаю все, что мне нужно, в фоновый поток в переменную, чтобы я не получил доступ к материалу из потока пользовательского интерфейса, чтобы предотвратить эту ошибку

Rly не понимает -1 все rdy ... так как один и тот же объект работает на вставке, единственное отличие состоит в том, что я делаю некоторые вычисления, когда его обновление и переменная создаются в фоновом потоке. ..

1 Ответ

0 голосов
/ 27 апреля 2018

Забыл плотину 'установить' после названия стола -.- время немного отдохнуть

...