Scribling Doodle Ответов: 3

"Строка или данные будут усечены"


Привет, ребята, я создаю программное обеспечение, чтобы помочь мне в моем тренажерном зале, и я хочу добавить план клиенту, но когда я добавляю его, он выдает мне эту ошибку "строка или данные будут усечены".


Это код, который у меня есть на самом деле для кнопки сохранения.

try
{
    if (txtMemberName.Text == "")
    {
        MessageBox.Show("Introduza os dados de cliente", "",
        MessageBoxButtons.OK, MessageBoxIcon.Warning);
        txtMemberName.Focus();
        return;
    }
    if (txtMonths.Text == "")
    {
        MessageBox.Show("Introduza o tempo de subscrição (meses)", "",
        MessageBoxButtons.OK, MessageBoxIcon.Warning);
        txtMonths.Focus();
        return;
    }
    if (cmbMembershipType.Text == "")
    {
        MessageBox.Show("Escolha o tipo de plano", "",
        MessageBoxButtons.OK, MessageBoxIcon.Warning);
        cmbMembershipType.Focus();
        return;
    }
    if (txtDiscountPer.Text == "")
    {
        MessageBox.Show("Introduza o desconto", "", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        txtDiscountPer.Focus();
        return;
    }
    if (txtTotalPaid.Text == "")
    {
        MessageBox.Show("Introduza o valor pago", "",
        MessageBoxButtons.OK, MessageBoxIcon.Warning);
        txtTotalPaid.Focus();
        return;
    }
    double val1 = 0;
    double val2 = 0;
    double.TryParse(txtGrandTotal.Text, out val1);
    double.TryParse(txtTotalPaid.Text, out val2);
    if (val2 > val1)
    {
        MessageBox.Show("O total não pode ser maior do que o valor pago", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        txtTotalPaid.Text = "";
        txtTotalPaid.Focus();
        return;

    }
    cc.con = new SqlConnection(cs.DBConn);
    cc.con.Open();
    string ct = "SELECT * FROM CustomerMembership WHERE DateFrom <= '" + dtpDateTo.Value.Date + "' AND DateTo >= '" + dtpDateFrom.Value.Date + "' and CustomerID=" + txtM_ID.Text + "";
    cc.cmd = new SqlCommand(ct);
    cc.cmd.Connection = cc.con;
    cc.rdr = cc.cmd.ExecuteReader();
    if (cc.rdr.Read())
    {
        MessageBox.Show("A mensalidade ainda não expirou.." + "\n" + "O pagamento não é permitido", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        if ((cc.rdr != null))
        {
            cc.rdr.Close();
        }
        return;
    }
    cc.con = new SqlConnection(cs.DBConn);
    cc.con.Open();
    string cb = "insert into CustomerMembership(CM_ID,BillDate,CustomerID,MembershipID,DateFrom,Months,DateTo,ChargesPerMonth,TotalCharges,DiscountPer,DiscountAmount,SubTotal,VATPer,VATAmount,ServiceTaxPer,ServiceTaxAmount,GrandTotal,TotalPaid) VALUES (@d1,@d2,@d3,@d4,@d5,@d6,@d7,@d8,@d9,@d10,@d11,@d12,@d13,@d14,@d15,@d16,@d17,@d18)";
    cc.cmd = new SqlCommand(cb);
    cc.cmd.Connection = cc.con;
    cc.cmd.Parameters.AddWithValue("@d1",txtMembershipID.Text);
    cc.cmd.Parameters.AddWithValue("@d2",dtpBillDate.Value);
    cc.cmd.Parameters.AddWithValue("@d3",txtM_ID.Text);
    cc.cmd.Parameters.AddWithValue("@d4", txtMembershipTypeID.Text);
    cc.cmd.Parameters.AddWithValue("@d5", dtpDateFrom.Value);
    cc.cmd.Parameters.AddWithValue("@d6", txtMonths.Text);
    cc.cmd.Parameters.AddWithValue("@d7", dtpDateTo.Value);
    cc.cmd.Parameters.AddWithValue("@d8", txtChargesPerMonth.Text);
    cc.cmd.Parameters.AddWithValue("@d9", txtTotalCharges.Text);
    cc.cmd.Parameters.AddWithValue("@d10",txtDiscountPer.Text);
    cc.cmd.Parameters.AddWithValue("@d11",txtDiscountAmount.Text);
    cc.cmd.Parameters.AddWithValue("@d12",txtSubTotal.Text);
    cc.cmd.Parameters.AddWithValue("@d13", txtVATPer.Text);
    cc.cmd.Parameters.AddWithValue("@d14", txtVATAmount.Text);
    cc.cmd.Parameters.AddWithValue("@d15", txtServiceTaxPer.Text);
    cc.cmd.Parameters.AddWithValue("@d16", txtServiceTaxAmount.Text);
    cc.cmd.Parameters.AddWithValue("@d17", txtGrandTotal.Text);
    cc.cmd.Parameters.AddWithValue("@d18", txtTotalPaid.Text);
    cc.cmd.ExecuteReader();
    cc.con.Close();
    st1 = lblUser.Text;
    st2 = "Foi adicionada uma nova mensalidade com o id '" + txtMembershipID.Text + "' ao membro '" + txtMemberName.Text + "'";
    cf.LogFunc(st1, System.DateTime.Now, st2);
    btnSave.Enabled = false;
    MessageBox.Show("Gravado com sucesso", "Registo", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
}


Таблица Sql:
CREATE TABLE [dbo].[CustomerMembership] (
    [CM_ID]            INT            NOT NULL,
    [CustomerID]       INT             NOT NULL,
    [MembershipID]     INT             NOT NULL,
    [DateFrom]         DATETIME        NOT NULL,
    [Months]           VARCHAR (2)     NOT NULL,
    [DateTo]           DATETIME        NOT NULL,
    [ChargesPerMonth]  DECIMAL (18, 2) NOT NULL,
    [DiscountPer]      DECIMAL (3)     NOT NULL,
    [VATPer]           DECIMAL (3)     NOT NULL,
    [VATAmount]        DECIMAL (3)     NOT NULL,
    [ServiceTaxPer]    DECIMAL (3)     NOT NULL,
    [ServiceTaxAmount] DECIMAL (3)     NOT NULL,
    [TotalCharges]     DECIMAL (18, 2) NOT NULL,
    [BillDate]         DATETIME        NOT NULL,
    [SubTotal]         DECIMAL (18, 2) NOT NULL,
    [GrandTotal]       DECIMAL (18, 2) NOT NULL,
    [TotalPaid]        DECIMAL (18, 2) NOT NULL,
    [DiscountAmount]   DECIMAL (3)     NOT NULL,
    CONSTRAINT [PK_CustomerMembership] PRIMARY KEY CLUSTERED ([CM_ID] ASC),
    CONSTRAINT [FK_CustomerMembership_Customer] FOREIGN KEY ([CustomerID]) REFERENCES [dbo].[Customer] ([C_ID]) ON UPDATE CASCADE,
    CONSTRAINT [FK_CustomerMembership_Membership] FOREIGN KEY ([MembershipID]) REFERENCES [dbo].[Membership] ([M_ID]) ON UPDATE CASCADE
);


Что я уже пробовал:

Попытался установить CM_ID в VARCHAR, а затем запрограммировать своего рода алгоритм, чтобы установить id в I-{number} вместо просто {number}.
Попытался установить значения в соответствии с функцией Add
Экс:
... Добавить ("@d1", SqlDbType.Int).Значение = txtMemberShipID.Текст;
Но и это не сработало.

Есть идеи?

NotPolitcallyCorrect

"Есть идеи?", да, найдите поле, в которое вы пытаетесь запихнуть слишком много информации, и измените его так, чтобы оно соответствовало.

Scribling Doodle

Моя главная проблема связана с CM_ID, который задан как строка, но для каждой функции, такой как акции или даже клиенты, у меня есть ST-{number} для акций и C-{number} для клиентов, и все остальные формы работают правильно, эта дает мне боль в заднице...

NotPolitcallyCorrect

Согласно вашему сообщению, CM_ID - это не строка, а int.

3 Ответов

Рейтинг:
25

OriginalGriff

Сообщение об ошибке довольно явное:

String or data would be truncated
Это означает, что вы передаете значение, которое слишком длинно для определения поля. Используйте отладчик, чтобы посмотреть, какие именно значения вы передаете в SQL (обратите особое внимание на поле месяцев), и либо измените свое приложение, чтобы оно не отправляло так много данных, либо таблицу, чтобы она принимала отправляемые данные.


Scribling Doodle

Я уже проверил его, и кажется, что все в порядке, но этот CM_ID не принимает такие значения, как I{number}. Даже если я поменяю его на варчар.

Рейтинг:
16

Peter Leow

Чтобы сгенерировать уникальный CM_ID в виде

I-{number}
для каждой вставки сначала измените тип поля CM_ID на varchar, а затем Запросите у своей базы данных этот уникальный идентификатор[^]


Scribling Doodle

Делал то и не получалось. Если я вручную вставлю значения в базу данных, все будет в порядке. Но если я использую свой интерфейс, он не будет работать.

Рейтинг:
0

Ramesh Kumar Barik

Эта проблема возникла из-за несоответствия между размером столбца таблицы и данными, которые вы передали для толкания. В режиме отладки проверьте, что длина передаваемых данных больше размера этих столбцов.