1

ここで私のコードはをDR.HasRows()返しますがTrue、 SQLManagementStudioで動作している間DR("LastID")は戻ります。DBNUllSELECT IDENT_CURRENT ('SiteSection') AS 'LastID'

__SQLString= "SELECT IDENT_CURRENT ('SiteSection') AS 'LastID'"
Dim DR As SqlDataReader
ddConnect() 'It's my custom class that opens a connection to db, it works
DR = ddExecuteReader()
DR.Read()
If DR.HasRows() Then
    GetLastID = DR("LastID")
End If
4

4 に答える 4

4

.NET アプリケーションが使用しているアカウントには、Management Studio 経由で接続するために使用しているアカウントと同じアクセス許可がないと思われます。

とはいえ、あなたのアプローチはせいぜい疑わしいと思います。から得た情報をどうするつもりIDENT_CURRENT()ですか?それを利用して、まだ実行していない に対してどのようなIDENTITY価値が生成されるかを推測できると思われる場合は、もう一度考えてみてください。INSERTいくつかの要因がその仮定を無効にする可能性があります。その間に誰かが ID を再シードしたり、増分を変更したり、一連の行を挿入したりする可能性があります。

ですから、正確に何をする必要があるのか​​、なぜそれIDENT_CURRENTがその方法だと思うのかを再考することをお勧めします. あなたのコメントに基づいて、あなたは以下を送るべきです:

INSERT ... ; SELECT LastID = SCOPE_IDENTITY();

これで、挿入した ID であることを確認できます。

于 2013-01-13T02:47:40.220 に答える
3

MSDNから:

SQL Server では、ユーザーは、ユーザーが所有するか、ユーザーがアクセス許可を付与されているセキュリティ保護可能なもののメタデータのみを表示できます。これは、ユーザーがオブジェクトに対する権限を持っていない場合、IDENT_CURRENT などのメタデータを生成する組み込み関数が NULL を返す可能性があることを意味します。

これは興味深いかもしれません:

IDENT_CURRENT 値が NULL の場合 (テーブルに行が含まれていないか、切り捨てられているため)、IDENT_CURRENT 関数はシード値を返します。

于 2013-01-12T22:06:44.810 に答える
2

これを確認してください ..SQL 2005でNULLを返すIdent_Current

ident_current またはその他の関数を使用して最後の ID を取得するには、ユーザーはメタデータを読み取る権限を持っている必要があるため、そのデータベースにdb_onwerが必要です。

于 2013-01-12T22:05:00.490 に答える