2

C#とMSAccessデータベースを使用してレコードがテーブルに挿入されたときにテーブルの自動インクリメントIDを返す方法に問題がありました。以下は私が試したコードです。

string data1 = string.Format("insert into Enquiry(fname,mname,lname,date_of_enq,address,contact_no,email_id,course_id,other,probable_date,updated_date,status)values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}')", 
        txtfName.Text, txtmName.Text, txtlName.Text, fullDate.Text, txtaddress.Text, txtContactNo.Text, varemail, CBCourse.SelectedValue.ToString(), txtOther.Text, DTPFeedBackDate.Text, updated_date, status);

テーブルに自動インクリメントされる、挿入されたレコードのIDが必要です。どうすれば入手できますか?

4

3 に答える 3

3

以下を使用できます。

Select Ident_Current(TableName); 

SELECT @@IDENTITY;

SELECT SCOPE_IDENTITY();

SELECT @@IDENTITY 値を生成したテーブルや、値を生成したステートメントのスコープに関係なく、接続で生成された最後の IDENTITY 値を返します。@@IDENTITY は、現在のセッションでテーブルに入力された最後の ID 値を返します。@@IDENTITY は現在のセッションに限定されますが、現在のスコープに限定されません。別のテーブルに ID を作成するトリガーがテーブルにある場合、ID を作成したのがトリガーであっても、最後に作成された ID が取得されます。

SELECT SCOPE_IDENTITY() 値を生成したテーブルに関係なく、接続上および同じスコープ内のステートメントによって生成された最後の IDENTITY 値を返します。SCOPE_IDENTITY() は、@@IDENTITY と同様に、現在のセッションで作成された最後の ID 値を返しますが、現在のスコープにも制限されます。つまり、トリガーまたはユーザー定義関数によって作成された ID ではなく、明示的に作成された最後の ID 値が返されます。

SELECT IDENT_CURRENT('tablename') 値を作成した接続や、値を作成したステートメントのスコープに関係なく、テーブルで最後に作成された IDENTITY 値を返します。IDENT_CURRENT はスコープとセッションによって制限されません。指定されたテーブルに限定されます。IDENT_CURRENT は、任意のセッションおよび任意のスコープで特定のテーブルに対して生成された ID 値を返します。

後でトリガーを追加することに関連する潜在的な問題を回避するには、常に SCOPE_IDENTITY() を使用して、T SQL ステートメントまたはストアド プロシージャに最近追加された行の ID を返します。

MsAccess で

// Include a variable and a command to retrieve the identity value from the Access database.
int newID = 0;
OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);
// Retrieve the identity value and store it in the CategoryID column.
newID = (int)idCMD.ExecuteScalar();
return newID;
于 2012-04-26T05:38:30.330 に答える
3

クエリにegを追加SELECT @@IDENTITYし、これをスカラーとして実行するだけです(IDの範囲に応じて、他の方法があることに注意してください)

これは mssql に適用されます。他のシステムについては、私のコメントに対する回答を待っています。

ところで:私はこの方法でクエリを実行しません-キーワードはsql-injectionです。むしろパラメータに行きましょう!

于 2012-04-26T05:38:39.090 に答える