2013-05-14 15 views
7

Kullanıcı değişkenlerinin oturum değişkenleri ile eşleşen aşağıdaki kodu kullanıyorum. Saklı Yordam, Oturum Değişkenindeki veriler veritabanındaki verilerle eşleşirse, Satır Sayımını döndürür.Depolanan Prosedürün Yürütülmesi ve satır sayımının çıkışa ve sql parametrelerine geri dönmesi

Her şey, her zaman tek bir satır olacak Satır Sayısını döndürmek dışında çalışır: Özetle, bir form ziyaret edin, bilgi ekleyin ve gönderin. Veri oturumda saklanır ve saklanan prosedür eşleştirildiğinde verileri döndürür. Program intRecCount değişkeni çalışır halde

hep sıfır yerine satır sayısıdır. Yordam Saklı

:

CREATE PROCEDURE [dbo].[uspConfirmation] 

    @RecordID CHAR(36), 
    @LName VARCHAR(30), 
    @FName VARCHAR(30), 
    @MInit CHAR(1), 
    @RecordCount INT OUTPUT 
AS 

SELECT * FROM Registration 
WHERE RecordID = @RecordID AND 
     LName = @LName AND 
     FName = @FName AND 
     MInit = @MInit 

SET @RecordCount = @@ROWCOUNT 

RETURN 

Yöntem/Kod:

public static DataSet Confirmation() 
{ 
SqlCommand cmdSQL = new SqlCommand("uspConfirmation", Connection); 
cmdSQL.CommandType = CommandType.StoredProcedure; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordID", SqlDbType.VarChar, 36)); 
cmdSQL.Parameters["@RecordID"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@RecordID"].Value = RecordIDSession; 

cmdSQL.Parameters.Add(new SqlParameter("@LName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@LName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@LName"].Value = LNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@FName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@FName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@FName"].Value = FNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@MInit", SqlDbType.Char, 1)); 
cmdSQL.Parameters["@MInit"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@MInit"].Value = MNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordCount", SqlDbType.Int)); 
cmdSQL.Parameters["@RecordCount"].Direction = ParameterDirection.Output; 

... sonra değişken satır bir çıkış değişkeni üzerinden saymak tutmak için ..

Int32 intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

SqlDataAdapter da = new SqlDataAdapter(cmdSQL); 
DataSet ds = new DataSet(); 
da.Fill(ds); 

try { 
    Connection.Open(); 
    cmdSQL.ExecuteNonQuery(); 
} 
catch (Exception ex) { 
    dbMsg = ex.Message; 
} 
finally { 
    Connection.Close(); 
    cmdSQL.Dispose(); 
    cmdSQL.Parameters.Clear(); 
} 
return ds; 
} 
+1

+1 İyi, iyi ayrıntı dolu, soru düşünülmüş . Güzel. – Jonathan

+0

Teşekkürler! Ben C# için çok yeni ama bu kadar çok seviyorum ve hiçbir şey sizin gibi insanlardan daha cesaret verici değildir. Tekrar teşekkürler! – Asynchronous

cevap

11

Daha önce olmayan bir sorguyu yürüttükten sonra çıktı parametresinin değerine erişmeniz gerekiyor.

//VARIABLE TO HOLD ROW COUNT VIA OUTPUT VIARABLE 
Int32 intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

Yani yöntemi için kodunuzu olacaktır: Yani sorgu yürütme sonrasında ve benzeri parametreleri temizlemeden önce bu çizgiyi taşımak

public static DataSet Confirmation() 
{ 
SqlCommand cmdSQL = new SqlCommand("uspConfirmation", Connection); 
cmdSQL.CommandType = CommandType.StoredProcedure; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordID", SqlDbType.VarChar, 36)); 
cmdSQL.Parameters["@RecordID"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@RecordID"].Value = RecordIDSession; 

cmdSQL.Parameters.Add(new SqlParameter("@LName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@LName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@LName"].Value = LNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@FName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@FName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@FName"].Value = FNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@MInit", SqlDbType.Char, 1)); 
cmdSQL.Parameters["@MInit"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@MInit"].Value = MNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordCount", SqlDbType.Int)); 
cmdSQL.Parameters["@RecordCount"].Direction = ParameterDirection.Output; 



SqlDataAdapter da = new SqlDataAdapter(cmdSQL); 
DataSet ds = new DataSet(); 
da.Fill(ds); 
Int32 intRecCount = 0; 
try 
{ 
    Connection.Open(); 
    cmdSQL.ExecuteNonQuery(); 
    //VARIABLE TO HOLD ROW COUNT VIA OUTPUT VIARABLE 
    intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

} 
catch (Exception ex) 
{ 
    dbMsg = ex.Message; 
} 
finally 
{ 
    Connection.Close(); 
    cmdSQL.Dispose(); 
    cmdSQL.Parameters.Clear(); 
} 


return ds; 
} 
+3

"cmdSQL.Parameters.Clear();" ifadesinden sonra olmaz. Deneme yakalamadan önce Int32 intRecCount bildirmek ve açıktan önce ödevi yapmak zorundasınız. – Serge

+0

@Serge, evet işaret ettiğin için teşekkürler – Habib

+0

Teşekkürler Habib ve Serge de teşekkür ederim. Yardım ve bilginize minnettarım. Adam! – Asynchronous

İlgili konular