2012-04-28 5 views
1
SqlDataSource myQuiz = new SqlDataSource(); 

myQuiz.ConnectionString = ConfigurationManager.ConnectionStrings["yafnet"].ToString(); 
myQuiz.InsertCommand = "INSERT INTO [QuizTable]([Quiz_Title],[Quiz_Description]) VALUES (@Quiz_Title,@Quiz_Description)"; 

myQuiz.InsertParameters.Add("Quiz_Title",Quiz_Title.Text); 
myQuiz.InsertParameters.Add("Quiz_Description",Quiz_Description.Text); 

myQuiz.Insert(); 
Response.Redirect("QuizQuests.aspx"); 

自動的に生成された新しい行のIDを取得してローカル変数に格納する方法はありますか?insert文を実行し、ローカル変数にidを入れますか?

事前のおかげで多く、 エイドリアン

+4

実行(http://blog.sqlauthority.com/2007/03/25/sql-server-identity- [SCOPE_IDENTITY()を選択] vs-scope_identity-vs-ident_current-retrieval-last-inserted-identity-of-record /)をC#コードで使用します:http://stackoverflow.com/questions/3913115/scope-identity-in-c-sharp-range –

答えて

1

あなたが本当にあなたの実際のQuizTableであなたの挿入からのIDを取得することは100%を確認したい場合は、あなたが使用する必要がありますSCOPE_IDENTITY()(彼のコメントでLuiggi Mendozaによって既に言及されているように)であり、@@IDENTITYまたはIDENT_CURRENTではない。

@@IDENTITYは、it will return the identity from the last insert that happened from your connectionのため動作しない場合があります。したがって、QuizTableにID列を持つ別のテーブルに行を挿入するトリガーがある場合は、に元の挿入物の値ではなく、その2番目の挿入物の値を返します。

IDENT_CURRENTは、テーブルの最後のID値を返します(前の例のようなトリガーがあるかどうかは関係ありません)。
の最後のID値は、セッションを返します。そう別の行があなたとあなたのINSERTIDENT_CURRENTとの間の別のセッションから挿入された場合、you'll get the identity value from that row, not from yours.

2

使用

SELECT IDENT_CURRENT(‘QuizTable’) 

それは関係なく、値を作成し、接続の、とに関わらずの範囲の、テーブルで生産最後のIDENTITY値を返します。値を生成したステートメント。 IDENT_CURRENTはスコープとセッションによって制限されません。指定された表に限定されています。 IDENT_CURRENTは、任意のセッションおよびスコープ内の特定の表に対して生成されたID値を戻します。

+1

しかし、別のセッションが 'QuizTable'を挿入した後、あなたの' IDENT_CURRENT'呼び出しの前にあなたのものではなく、他の挿入物のID値を取得します([my answer](http:// stackoverflow .com/a/10365118/6884)を参照してください) –

1

@Adrianデバロ:こんにちはあなたが挿入されたレコードのIDを取得し、次のステートメントを追加するには、sqlqueryの中で変数

に保存するには、次のコードを使用することができます。

return @@IDENTITY 

と、次のようにあなたのC#コードは次のようになります:

SqlConnection cn = new 
    SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);   
    cn.Open(); 
    SqlCommand cmd = new SqlCommand(procname, cn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlParameter str = new SqlParameter("name", SqlDbType.VarChar); 
    str.Direction = ParameterDirection.ReturnValue; 
    foreach (SqlParameter par in param) 
    { 
     cmd.Parameters.Add(par); 
    } 
    string name = Convert.ToString(cmd.ExecuteScalar()); 
    cmd.Dispose(); 
    cn.Close(); 
    return name; 
関連する問題