2017-05-10 10 views
0

データベースからID番号を返す次のコードがあります。ローカルで実行するとうまく動作しますが、ファイルをサーバーに置くとDBにデータが記録されますが、ID番号ではなく0が返されます。ストアドプロシージャは、サーバー上にあるときにのみ0を返します。ローカルでは実行されません。

HHIDは、DBに情報を記録するときに自動インクリメントするIDです。

SqlConnection conn = new SqlConnection("DB connection stuff"); 
SqlCommand cmd = conn.CreateCommand(); 
SqlDataReader reader; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "insert_workshop_requests"; 
cmd.Parameters.AddWithValue("@HHID", 1); 
cmd.Parameters.AddWithValue("@username", usernameData.Text); 
cmd.Parameters.AddWithValue("@name", nameData.Text); 
cmd.Parameters.AddWithValue("@email", emailData.Text); 

cmd.Parameters["@HHID"].Direction = System.Data.ParameterDirection.Output; 

try 
{ 
    conn.Open(); 
    reader = cmd.ExecuteReader(); 
    HHID = System.Convert.ToInt32(cmd.Parameters["@HHID"].Value); 
} 
catch (Exception exc) 
{ 

} 
finally 
{ 
    if (conn.State != ConnectionState.Closed) 
     conn.Close(); 
} 

これは私を夢中にしています! IDではなく0を格納しているSPに関する有用な記事がありましたが、問題は常にローカルでも実行されているため、誰かを助けることができます。ローカルで作業しているので、デバッグが非常に難しいです!

ありがとうございます!

+0

ためには、ExecuteNonQueryを使用する必要がありますSP? –

+0

ストアドプロシージャはどのように見えますか?あなたは希望のID番号の代わりに0を返すことをどのようにチェックしますか? – Ian

+0

@ hlh3406また、私はExecuteNonQueryを使うべきだと思います。 –

答えて

1

ExecuteReaderは、SELECTではないものに対して使用しています。これはリターンパラメータに興味深い副作用があります。読者を閉じるまで、パラメータの値Direction = Outputは利用できません。

SQL OUTPUT Stored Procedures not working with ExecuteReader

だから、あなたがリーダーを閉じることができますが、本当にあなたがのためのコードを共有することができINSERT/UPDATE/DELETEクエリ

conn.Open(); 
reader = cmd.ExecuteReader(); 
reader.Close(); 
HHID = System.Convert.ToInt32(cmd.Parameters["@HHID"].Value); 

またはより良い

conn.Open(); 
int records = cmd.ExecuteNonQuery(); 
HHID = System.Convert.ToInt32(cmd.Parameters["@HHID"].Value); 
+0

これは修正済みです!ありがとうございました! – hlh3406

0

限り、私が理解できるように、あなたが最後のエントリのIDを返すようにしようとしている、そのため あなたはこれを使用して結果を変数にバインドし

SELECT SCOPE_IDENTITY() 

それを返すことができます私はこのことを願っています

関連する問題