2017-09-11 14 views
0

私は以下のような挿入クエリを持っています。しかし、scopeIdentityは42を返しません、それは1042SCOPE_IDENTITY()は1000の数値を返します

これはSQL Serverテーブルで返します

enter image description here

マイコード:

int masterId = 0; 

using (SqlConnection cmd = new SqlConnection(connString)) 
{ 
    using (SqlCommand conn = cmd.CreateCommand()) 
    { 
     conn.CommandText = "INSERT INTO[MasterReportData]([ReportName],[CaseList],[EmployeeId],[datetime]) VALUES(@reportName, @caseList, @employeeId, @datetime) SET @ID = SCOPE_IDENTITY()"; 

     conn.Parameters.Add("@reportName", SqlDbType.VarChar).Value = reportName; 
     conn.Parameters.Add("@caseList", SqlDbType.VarChar).Value = caseList; 
     conn.Parameters.Add("@employeeId", SqlDbType.Char).Value = employeeId; 
     conn.Parameters.Add("@datetime", SqlDbType.DateTime).Value = datetime; 
     conn.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output; 

     cmd.Open(); 
     conn.ExecuteNonQuery(); 

     masterId = Convert.ToInt32(conn.Parameters["@ID"].Value); 
     cmd.Close(); 
    } 
} 
+0

セミコロンがありません。 ?なぜそれが42を返すべきだと思いますか?最後の行が '41'であっても、ロールバックされた挿入または削除によってカウンタが前進する可能性があります –

+4

したがって、データベースを見ると、実際にどの値が挿入されましたか?アイデンティティ列の1000のジャンプはかなり一般的です(2012年以降、IIRC)、とにかく*実際の数値*を気にしていれば、あなたはIDを間違って使用していると思います。 –

+0

このテーブルのID列の現在の値を確認してください: 'SELECT IDENT_CURRENT( 'MasterReportData')' - それは何を返しますか? –

答えて

0

https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql

を見てください

説明は: 最後の身元を返します同じスコープ内のID列に挿入された値。スコープとは、ストアドプロシージャ、トリガ、ファンクション、バッチなどのモジュールです。したがって、2つのステートメントが同じストアド・プロシージャ、ファンクションまたはバッチ内にある場合、それらは同じスコープにあります。

単語:it最後のIDを返します。使用する次のIDは返しません。したがって、そのようなINSERTコマンドを使用することはできません。できることは次のとおりです。

IDを自動増分IDとして設定します。その後、INSERTコマンドを実行し、その後にSELECT SCOPE_IDENTITY()を実行して、どのIDが使用されたかを調べます。

関連する問題