2016-05-23 9 views
0

これはC#とストアプロシージャの両方を使用することができるので、私は緑です。これは本当の学習体験でしたが、私はほとんどそこにいます。私は2つのストアドプロシージャを持っています(最初のものは、2番目のものが完了した後に2番目のものが終了し、ドキュメントIDを返します...新しく作成されたレコードの 'DID'を返します) C#コード。新しいレコードのIDを返すための助けが必要

これは、C#ページの背後にある私のASP.NET Webプロジェクトコードから呼び出すことを目的としています。私は、Microsoft KB記事(kb#320916)のほとんどのロジックをベースにしています。そこにある下のコードセグメントを見ると、自分の参照を引き出しているセクションが表示されます。

私は徹底的に作業していたので、複数のレコードでデータセットを取り戻す部分に着くまでは完璧な意味合いを持っていました。私は自分自身に「ああ、私は困っています!私はちょうど1つの値を持っているので、私は戻ってくる必要があり、その単一の値以上を返すことを期待しない。ちょうどそのレコードID。ここ は、私がこれまで持っているものです。

SqlConnection GETTNewDocs = new SqlConnection("server = gbaptccsr01; database = ARFS; Integrated Security=True"); 
SqlDataAdapter InsertANewDoc = new SqlDataAdapter("putthedatain", GETTNewDocs); 
InsertANewDoc.SelectCommand.CommandType = CommandType.StoredProcedure; 
InsertANewDoc.SelectCommand.Parameters.Add(new SqlParameter("@EventID", SqlDbType.VarChar(50))); 
InsertANewDoc.SelectCommand.Parameters["@EventID"].Value = (EleIDLBL.Text).Trim(); 
InsertANewDoc.SelectCommand.Parameters.Add(new SqlParameter("@AltSub", SqlDbType.Int)); 
InsertANewDoc.SelectCommand.Parameters.["@AltSub"].Value = (Convert.ToInt32(Session["AltSubDocIdx"])+5); 
InsertANewDoc.SelectCommand.Parameters["@DID"].Direction = ParameterDirection.Output; 

と呼ばれ、データを返すされているストアドプロシージャ自体は、次のようになります。ここfinshラインの上に私をプッシュする

CREATE PROCEDURE [dbo].[NewGETTDoc] 
@EventID VARCHAR(50), 
@AltSub int, 
@DocName VARCHAR(512) = "New", 
@new_identity int = NULL OUTPUT, 
@param1 VARCHAR(50) = @EventID 
AS BEGIN 
SET NOCOUNT ON; 

INSERT dbo.GETT_Documents(EID, alt_sub_idx, DocName)SELECT @EventID, @AltSub, @DocName; 
SET @new_identity = SCOPE_IDENTITY(); 

EXEC UpdateSubIdx @param1 
END 

どれでも役立つだろう大変感謝します。私は私がそれを味わうことができるように近いと感じる! SPと呼ばれるパラメータがありませんので、

おかげで、 ケン...

+2

て配置されなければならない '@のDID'は何ですか?あなたはあなたの 'C#'のoutパラメータとしてそれを持っていますが、そのパラメータはあなたのprocで '@ new_identity'と呼ばれています – Kritner

+0

これは助けになるかもしれません:http://stackoverflow.com/questions/7917695/sql-server-return-value-アフターインサート –

+0

あなたの現在のコードはどういったところに間違いがありますか? –

答えて

0

は、それは(私はこれで暗闇での撮影だから、不完全なコードの言うことトリッキーだが、この行を削除してみてください@DID );

InsertANewDoc.SelectCommand.Parameters["@DID"].Direction = ParameterDirection.Output; 

これらを追加します。

InsertANewDoc.SelectCommand.Parameters.Add(new SqlParameter("@new_identity", SqlDbType.Int)); 
InsertANewDoc.SelectCommand.Parameters.["@new_identity"].Direction = ParameterDirection.Output; 

データベースコールの後、このIDを使用して新しいIDを取得できます。

int newID = int.Parse(InsertANewDoc.SelectCommand.Parameters.["@new_identity"].Value); 
0

コードにエラーがあり、ここではいくつかのより良い方法が使用できます。

最初にエラーが発生した場合、ストアドプロシージャは名前を付けて正しい構文を使用しているため、パラメータの名前を正確に指定する必要があります(SqlDbType.NVarChar(50)はメソッドの呼び出しとして誤って解釈されます) SqlDbTypeクラスのNVarChar?)

第2に、SqlDataAdapterは必要ありません。新しい行を挿入するだけなので、レコードを返すために特別に作成されたクラスを使用する必要はありません。単純なSqlCommandが行います。

第三に、使い捨てのオブジェクトがusing声明

using(SqlConnection con = new SqlConnection(.....)) 
using(SqlCommand cmd = new SqlCommand("NewGETTDoc", con)) 
{ 
    con.Open(); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@EventID", SqlDbType.VarChar, 50).Value = EleIDLBL.Text.Trim(); 
    cmd.Parameters.Add("@AltSub", SqlDbType.Int).Value = Convert.ToInt32(Session["AltSubDocIdx"])+5; 
    SqlParameter p = cmd.Parameters.Add("@new_identity", SqlDbType.Int) 
    p.Direction = ParameterDirection.Output; 
    int rowsAffected = cmd.ExecuteNonQuery(); 
    if(rowsAffected > 0) 
    { 
     int newID = Convert.ToInt32(p.Value); 
     ... do your task with the newID .... 
    } 
} 
関連する問題