0

ヘルプデスク システムを作成していますが、ユーザーがボタンをクリックしてヘルプデスク チケット番号を「事前登録」すると、スクリプトが SQL Express サーバーに対して起動し、新しい行が作成されます。行 ID -> 行 ID を使用して、最終的なチケット ref を作成します (たとえば、行 1 の場合は RAD000001 の形式で) このプロセスは、ユーザーが「 create new Ticket ref" ボタン (チケット番号 10 の生成) 次のエラーが表示されます。

Arithmetic overflow error converting expression to data type nvarchar.

行を作成しますが、更新に失敗したようです (行が作成され、ID が返され、ID から参照が作成されます)。

私の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)"

うまくいけば、誰かが私が間違っているところに光を当てることができます!? 私は一日中このコードを見ていましたが、私の学習範囲からわずかに外れました...

4

3 に答える 3

2

@ticket_idを出力パラメーターとして定義する必要があり、SETステートメントの前にセミコロンが必要になる場合があります。

使用する:

String.Format("RAD{0:d6}", ticket_Id)

チケット番号をフォーマットします。私の例では、ticket_idは整数であることに注意してください。

一般的な推奨事項として、SQLDataSourceとそのデザインパターンは一般的に避けたいと思います。今日のデータアクセスには、はるかに優れた、より洗練されたソリューションがあります。EntityFrameworkを見てください。EFを使用すると、コードにSQLステートメントを埋め込むことなく、すばやく起動して実行できます。DBからエンティティクラスを生成することも、コードファーストアプローチを使用してクラスからDBスキーマを生成することもできます。

于 2012-05-17T01:05:17.943 に答える
1

問題の正確な解決策ではありませんが、テーブルを次のように再定義できればうまくいくかもしれません。

...

    Id int identity not null,
    Ticket_ref as 'RAD'+replicate('0', 5-len(cast(Id as varchar)))+Cast(Id as Varchar) persisted,
...

不要なコードに多くの行を削除します...

于 2012-05-16T23:07:56.440 に答える
0

Saille の回答の後、コードを確認したところ、@ticket_id を宣言した場所で次のように宣言したことに気付きました。

<asp:Parameter DefaultValue="0" Direction="Output" Name="ticket_id" />

次のように「DbType=Int32」を指定した後:

<asp:Parameter DefaultValue="0" Direction="Output" DbType=Int32 Name="ticket_id" />

すべてが正しく機能しているように見えましたが、問題は解決されていません!

なぜこれが問題を引き起こしたのかは100%確信が持てませんが、誰かが私にこれを説明して、私(そしてうまくいけば他の人)がなぜこれが何をしたのかを理解できるようにします...

PS。私はこのプロジェクトを使用して、一般的な C#/ASP.net (セッションなど) を学習しています。完了すると、バージョン 1.5 がより優れたデータベース層 (エンティティなど) で構築されます... !

みんな助けてくれてありがとう!

トム。

于 2012-05-17T07:06:37.713 に答える