2011-12-29 20 views
3

私はいくつかのパラメータを挿入し、挿入されたIDを返す私のサーバ上にストアドプロシージャを持っています。私はこれを簡単に行うフォームを書いていますが、私は戻って渡されるパラメータを取得するように見えません。C#SQLストアドプロシージャ(挿入) - パラメータを渡してパラメータを取得する

おそらく無意味な読書を一からやっていないように、私のC#コードに注意を払い、パラメータを渡して返すために何が必要なのかを教えてください。

C#Default.aspxの

connection = new SqlConnection(ConfigurationManager.AppSettings["ConnectionInfo"]); 
sql = "aStoredProc"; 

command = new SqlCommand(sql, connection); 
command.CommandType = CommandType.StoredProcedure; 

command.Parameter.Add(new SqlParameter("@FirstName", SqlDbType.VarChar)).Value = sFirstname; 
command.Parameter.Add(new SqlParameter("@SurName", SqlDbType.VarChar)).Value = sSurname; 

connection.Open(); 
int ID = command.ExecuteNonQuery(); 
connection.Close(); 

SQL aStoredProc

IF EXISTS(SELECT * FROM aTable WHERE ID = @ID) 
    -- User exists, update details 
    BEGIN 
    BEGIN TRAN 
     UPDATE aTable 
     SET 
      FirstName = @FirstName, 
      SurName = @SurName, 
      LastUpdate = GetDate() 
     WHERE ID = @ID 

     IF (@@Error != 0) 
      ROLLBACK TRAN 
     ELSE 
      COMMIT TRAN 
     END 
ELSE 
    -- New user 
    BEGIN 
    BEGIN TRAN 
     INSERT aTable (
     FirstName, 
     SurName, 
     GetDate() 
    ) 
     VALUES (
      @FirstName, 
      @SurName, 
      @LastUpdate 
    ) 

     SELECT @ID = @@IDENTITY 

     IF (@@Error != 0) 
     ROLLBACK TRAN 
     ELSE 
     COMMIT TRAN 
     END 

パラメータ@IDは次のようにストアドプロシージャに記載されている:

@ID (int, Input/Output, No default) 

procは 'Return integer'を持ちます。これは、SQL Server 2005をアップグレードする前にVBAソリューションで正常に動作していました。

ありがとうございます。あなたはパラメータコレクションに出力PARAMTERを追加する必要が

+3

http://stackoverflow.com/questions/8633821/を参照してください:

INSERT aTable (FirstName,SurName,LastUpdate) VALUES (@FirstName, @SurName, GetDate()) 

これは好きではscope-identity-always-returning-0/8633835#8633835同様の質問/回答です。 –

+1

あなたはストアドプロシージャにロジックの欠陥があります。 (else 'new user'ブランチ):@@ ERRORを検査する前に実行されているステートメントは@@ ERRORをリセットします –

+3

新しく挿入されたIDを取得するために何かの代わりに** SCOPE_IDENTITY()を使用することをお勧めします値。 [WHYの説明については、このブログの記事を参照してください](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity -of-record /) –

答えて

6
connection = new SqlConnection(ConfigurationManager.AppSettings["ConnectionInfo"]); 
sql = "aStoredProc"; 
command = new SqlCommand(sql, connection); 
command.CommandType = CommandType.StoredProcedure; 
command.Parameter.Add(new SqlParameter("@FirstName", SqlDbType.VarChar)).Value = sFirstname; 
command.Parameter.Add(new SqlParameter("@SurName", SqlDbType.VarChar)).Value = sSurname; 
command.Parameter.Add(new SqlParameter("@SurName", SqlDbType.VarChar)).Value = sSurname; 
SqlParameter ParamId = cmd.Parameters.Add("@Id", SqlDbType.Int); 
command.Direction = ParameterDirection.InputOutput; 
command.Parameter.Add(ParamId); 
connection.Open(); 
command.ExecuteNonQuery(); 
int ID = ParamId.Value; 
connection.Close(); 
  1. 上記の値を読み取ります。
+0

ありがとうございます。 –

+0

私は 'ベンダー'は 'ParamId'であるべきだと思います。しかし、このエラーは、 'int ID = ParamId.Value;' - オブジェクトをintに変換できません。 –

+1

int ID =(int)ParamId.Value; – dotnetstep

2

あなたはSQLでエラーを持って、それは次のようになります。

INSERT aTable (
    FirstName, 
    SurName, 
    GetDate() 
) 
    VALUES (
     @FirstName, 
     @SurName, 
     @LastUpdate 
) 
+0

それは私の正確なSQLではなく、それが何であるかの大まかな考えです。 –

関連する問題