-2

C# asp.net を使用して、SQL Server 2008 テーブルにレコードを挿入したいのですが、列の値はすべて「nvarchar」として宣言されており、最初の列のサブ ID は主キーです。私のコードでは、最後の列 ID を取得します。それをインクリメントして新しいレコードのサブIDとして使用します。レコードを挿入すると、順番に保存されず、代わりに途中に保存されます。次回は最後のID列の値を取得しようとします(私は"order by" を使用すると、既存の値が得られますが、これをインクリメントすると、"値が重複しています。許可されていません" というエラーが発生します。これは、最後の id 値を取得してインクリメントするための私のコードです。

       SqlCommand myCommand = new SqlCommand("SELECT TOP 1 subid FROM subjects                         

       ORDER BY subid DESC", con1);         

             reader = myCommand.ExecuteReader();
            if (reader.HasRows == false)
            {
                Label4.Text = "1";
                reader.Close();
            }
            else
            {
                while (reader.Read()) // if can read row from database
                {

                    id = reader[0].ToString();

                }
                int n = Convert.ToInt32(id);
                int j = n + 1;
                Label4.Text = j.ToString();

私の挿入コードは次のとおりです。

        SqlDataAdapter da = new SqlDataAdapter("SELECT TOP 1 * FROM subjects ORDER BY       
        subid DESC", con);
        SqlCommandBuilder cb = new SqlCommandBuilder(da);
        DataSet ds = new DataSet("subjects");
        da.Fill(ds, "subjects");
        DataRow row = ds.Tables["subjects"].NewRow(); 
        row["subid"] = Label4.Text;
        row["dept"] = (string)Session["deptmnt"];
        row["yr"] = DropDownList2.SelectedValue;
        row["sem"] = DropDownList3.SelectedValue;
        row["subname"] = TextBox1.Text;
        row["subcode"] = TextBox2.Text;

        ds.Tables["subjects"].Rows.Add(row);
        da.Update(ds, "subjects");

        Label10.Visible = true;
        con.Close();

値を最後の行として挿入するにはどうすればよいですか。私のサブ ID には、「IT10001」、「EC10001」などの値があり、最初の 2 文字に基づいて部門を識別します。そのため、varchar を使用しています。

4

2 に答える 2

2

式がありますSELECT TOP 1 * FROM subjects ORDER BY subid DESC

あなたsubidが言ったように、NVarCharの場合、順序付けは数字ではなく文字列で行われます。つまり、「10」<「2」です。1000 件のレコードがあると仮定すると、次のように並べ替えられます。

1 
10
11
..
19
100
101
...
1000
2
20
21
...
...
999   

そのため、最大の数値を取得しようとするたびに、字句的に最大であるため、文字列 '999' が返されます。

最も簡単な解決策は、実際には整数であるため、列を整数に変更することです。絶対に変更できない場合は、少なくとも値をゼロで埋めてください。そのため、「1」、「2」、「10」の代わりに「0001」、「0002」、「0010」を使用してください。

さらに、MAX+1 アプローチを使用すると、同時実行の問題により、トランザクションを使用してすべてを行う必要があります。int ID を主キーとして使用すると、これらの問題が解決されます。

于 2013-08-12T11:25:07.987 に答える