Я создаю систему службы поддержки, но, похоже, столкнулся с небольшой проблемой: когда пользователь нажимает кнопку, чтобы «предварительно зарегистрировать» номер билета службы поддержки, мой скрипт срабатывает на сервере SQL Express, создавая новую строку -> получает идентификатор строки -> использует идентификатор строки для создания окончательной ссылки на билет (в формате 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]
и это код С#:
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)"
Надеюсь, кто-то сможет пролить свет на то, где я ошибаюсь!? Я смотрел на этот код весь день, и он немного вышел за рамки моей лиги обучения...