Tejas@45 Ответов: 2

Я не могу вставить продукт expirydate ?


У меня есть таблица PurchaseInvoice Details, где у меня есть столбец pid_proexpiry, где я не могу добавить дату истечения срока действия.

Вот мой столик :
CREATE TABLE purchaseInvoiceDetails
(
    pid_id bigint IDENTITY NOT NULL,
    pid_purchaseID bigint NOT NULL,
    pid_proID int NOT NULL,
    pid_proquan int NOT NULL,
    pid_totprice money NOT NULL,
    pid_proexpiry date NULL
)
и это моя хранимая процедура :
Create procedure [dbo].[st_insertPurchaseInvoiceDetails]
    @purchaseID bigint,
    @proID int,
    @quan int,
    @totPrice money,
    @proExpiry date
As
    insert into purchaseInvoiceDetails values (@purchaseID,@proID,@quan, 
@totPrice,@proExpiry)


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

Я использовал эту функцию :
int pidcount;
public int insertPurchaseInvoiceDetails(Int64 purID,Int64 proID,int quan,float totPrice, DateTime? expiry=null)
{
    try
    {
        SqlCommand cmd = new SqlCommand("st_insertPurchaseInvoiceDetails", MainClass.con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@purchaseID",purID);
        cmd.Parameters.AddWithValue("@proID", proID);
        cmd.Parameters.AddWithValue("@quan", quan);
        cmd.Parameters.AddWithValue("@totPrice", totPrice);

        if (expiry == null)
        {
            cmd.Parameters.AddWithValue("@proExpiry", DBNull.Value);
        }
        else
        {
            cmd.Parameters.AddWithValue("@proExpiry", expiry);
        }
        MainClass.con.Open();
        pidcount = cmd.ExecuteNonQuery();            
        MainClass.con.Close();
    }
    catch (Exception ex)
    {
        MainClass.con.Close();
        MainClass.ShowMSG(ex.Message, "Error....", "Error");
    }
    return pidcount;
}

и вот как я вызываю функцию :
if (expiryPicker.Value.Date == DateTime.Now.Date)
{
    co += i.insertPurchaseInvoiceDetails(purchaseinvoiceID, Convert.ToInt32(row.Cells["proIDGV"].Value.ToString()), Convert.ToInt32(row.Cells["quantGV"].Value.ToString()), Convert.ToSingle(row.Cells["totalGV"].Value.ToString()));
}
else
{
    co += i.insertPurchaseInvoiceDetails(purchaseinvoiceID, Convert.ToInt32(row.Cells["proIDGV"].Value.ToString()), Convert.ToInt32(row.Cells["quantGV"].Value.ToString()), Convert.ToSingle(row.Cells["totalGV"].Value.ToString()), Convert.ToDateTime(row.Cells["expiryGV"].Value.ToString()));
}     
Это я уже пробовал, но в базе данных показывается нулевое значение в столбце pid_ProExpiry. Могу ли я получить какое-либо решение для этого?
Я хочу вставить только те даты, которые имеют срок годности, такие как еда и т. д.

ZurdoDev

Отладьте свой код. Это очень, очень легко исправить.

2 Ответов

Рейтинг:
2

OriginalGriff

Ваша ошибка проста: вы не перечисляете столбцы, в которые вставляете:

insert into purchaseInvoiceDetails values (@purchaseID,@proID,@quan,
@totPrice,@proExpiry)

Из-за этого SQL устает вставлять данные в том порядке, в котором определены элементы таблицы:
CREATE TABLE purchaseInvoiceDetails(
pid_id bigint IDENTITY NOT NULL,
pid_purchaseID bigint NOT NULL,
pid_proID int NOT NULL,
pid_proquan int NOT NULL,
pid_totprice money NOT NULL,
pid_proexpiry date NULL
Первый столбец-это столбец идентификаторов, и вы вообще не можете писать в него, поэтому SP не выполняет никаких операций вставки.
Перечислите ваши колонки, и это начнет работать:
INSERT INTO purchaseInvoiceDetails (pid_purchaseID, pid_proID, pid_proquan, pid_totprice, pid_proexpiry) VALUES (@purchaseID,@proID,@quan,
@totPrice,@proExpiry)
Всегда перечисляйте столбцы, которые вы пытаетесь вставить или выбрать - это просто напрашивается на проблемы, если вы этого не делаете!


Oshtri Deka

Из того, что я понимаю, его проблема заключается только в нулевом значении в столбце pid_proexpiry.

Ваш совет хорош, код, о котором идет речь, - это беспорядок.

OriginalGriff

Попробуйте - он ничего не вставит, так как не разрешит никаких записей в столбцы IDENTITY, если только IDENTITY_INSERT не был специально включен (по умолчанию он выключен)- и в этом случае все столбцы будут вставлены "в одно место слева", что всегда будет вставлять информацию о дате в столбец pid_totprice ...

К сожалению, я не думаю, что он слишком внимательно следил за тем, что делает.

Рейтинг:
2

Oshtri Deka

Я ничего не могу с собой поделать, я должен немного покровительствовать.
Float - плохой выбор для денежных значений, используйте decimal-базовый тип в db-это деньги. Есть много источников на эту тему в интернете.

if (expiryPicker.Value.Date == DateTime.Now.Date)
{
    co += i.insertPurchaseInvoiceDetails(
            purchaseinvoiceID,
            Convert.ToInt32(row.Cells["proIDGV"].Value.ToString()),
            Convert.ToInt32(row.Cells["quantGV"].Value.ToString()), 
            Convert.ToSingle(row.Cells["totalGV"].Value.ToString()),
            DateTime.Now.Date // you forgot to pass date
            );
}
else
{
    // original code
}