Създавам система за бюро за помощ, но изглежда се натъквам на лек проблем, когато потребителят щракне върху бутон за „предварителна регистрация“ на номера на билета за бюро за помощ, моят скрипт се задейства към SQL Express сървъра, създавайки нов ред -> получава ID на ред -> Използва ID на реда, за да създаде окончателната реф на билета (във формат RAD000001 например за ред 1) този процес изглежда работи добре за мен, докато стигна до номер 9... когато потребителят щракне върху " бутон за създаване на нов номер на билет" (Генериране на номер на билет 10) получавам следната грешка:
Arithmetic overflow error converting expression to data type nvarchar.
Създава реда, но изглежда се проваля при актуализацията (редът е създаден, идентификаторът е върнат и след това рефът е създаден от идентификатора)
Моята SQL таблица изглежда така:
CREATE TABLE [dbo].[tickets](
[id] [int] IDENTITY(1,1) NOT NULL,
[ticket_ref] [varchar](15) NULL,
[details_id] [int] NULL,
[state] [int] NULL,
[create_date_Time] [datetime] NOT NULL,
[details_subject] [varchar](255) NULL,
[details_main_body] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
и това е C# кодът зад:
private string Reform_TicketId(string original_ticket_id)
{
switch (original_ticket_id.Length)
{
case 1:
return "RAD00000" + original_ticket_id.ToString();
case 2:
return "RAD0000" + original_ticket_id.ToString();
case 3:
return "RAD000" + original_ticket_id.ToString();
case 4:
return "RAD00" + original_ticket_id.ToString();
case 5:
return "RAD0" + original_ticket_id.ToString();
case 6:
return "RAD" + original_ticket_id.ToString();
default:
return "ERROR!";
}
}
protected void DsCreateTicketEntry_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
string original_id = e.Command.Parameters["@ticket_id"].Value.ToString();
string reformed_id = Reform_TicketId(original_id.ToString()).ToString();
if (original_id != "0")
{
//It has returned a value that is a DB ID field and seems correct! lets proceed!
DsCreateTicketEntry.UpdateParameters["ticket_db_id"].DefaultValue = original_id;
//DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = reformed_id;
DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = "RAD000002";
DsCreateTicketEntry.Update();
LblTicketOutput.Text = reformed_id;
}
else
{
//@TODO: Write to the label stating we had problems generating a Ticket ID!
}
}
protected void btnCreateTicket_Click(object sender, EventArgs e)
{
DsCreateTicketEntry.Insert();
btnCreateTicket.Enabled = false;
}
със следните заявки в моя SQLDataSource:
InsertCommand="INSERT INTO tickets(state, create_date_Time) VALUES (1,GETDATE()) SET @ticket_id=SCOPE_IDENTITY();"
UpdateCommand="UPDATE tickets SET ticket_ref = @new_ticket_id WHERE (id = @ticket_db_id)"
Надяваме се, че някой може да хвърли малко светлина върху това къде греша!? Гледах този код цял ден и той падна малко извън моето ниво на обучение...