@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

UniqueIdentifier型の列に自動採番されたIDをSCOPE_IDENTITYで取得できない

1
投稿者投稿内容
inetkob
会議室デビュー日: 2008/11/06
投稿数: 2
投稿日時: 2008-11-06 14:27
こんにちは
以下の疑問にご回答頂ければ幸いです。

主キーにUniqueIdentifier型列を持ち、
既定値に「newid()」を設定しているあるテーブルに対して
ASP.NETより、採番された値を取得する為に「SCOPE_IDENTITY()」を
用いようとしていますが、値がうまく取れません。(NULLが帰ってくる)
UniqueIdentifier型ではなく、int型でIDENTITYによる自動採番号にすれば
問題なく値が取れる事は確認済みです。
また、テーブルに手で直接レコードを作成した際に主キーが自動採番号されている
ことも確認済みです。

なぜ、前者の場合、値がNULLになってしまうのでしょうか?
受け取り側(ASP.NETのコード)の書き方の問題でしょうか?

#.netの問題ではなく、DB側の問題/仕様の様な気もします。
#話題が大きくそれそうならご指摘ください。

以下、サンプルコード
'−−−−−−−−−−−−−−−−−−−−−−−−−−
'テーブル名:hoge/列:RecID(主キー)、AAA
Dim sNewID as string = "NONE"
Dim objCon As SqlConnection = New SqlConnection("(接続文字列)")
Try
  objCon.Open()
  Dim sSQL as string = "insert into hoge (A)values(@inpVal);" _
& "SELECT @GetID = SCOPE_IDENTITY();"
  objCmd = New SqlCommand(sSQL, objCon)
  objCmd.Parameters.AddWithValue("@inpVal", "テスト")
  Dim objRetParam As SqlParameter = _
objCmd.Parameters.AddWithValue("@GetID", SqlDbType.UniqueIdentifier)
  objRetOutParam.Direction = ParameterDirection.Output
  
  sNewTicketID = ""
objCmd.ExecuteNonQuery() 'INSERT & SELECT EXECUTE
sNewID = CType(objRetOutParam.Value, String)
objCmd.Dispose()
Finally
  objCon.Close()
End Try
※「@GetID」の値が、NULLなので、CTYPEのところで落ちます。
  値がNULLであることは、ウォッチで確認しました。

以上、宜しくお願いします。
inetkob
会議室デビュー日: 2008/11/06
投稿数: 2
投稿日時: 2008-11-06 15:44
その後の追記です。

 差し当たり・・・・
(1)”UniqueIdentifier型はMUST要件ではない”ので
    IDENTITYのint型を主キーとする方法

 (2)ASP.NET側で、NewGuideによりキーを発行して
    これをインサートする方法(要重複チェック)

 のどちらかを天秤にかけることにしました。

疑問は残ったままですが。。。。有難うございました。
1

スキルアップ/キャリアアップ(JOB@IT)