2016-07-19 6 views
0
geliefert wurden

Ich habe diese gespeicherte Prozedur bekommt:C# gespeicherte Prozedur Start: Prozedur oder Funktion erwartet Parameter, die nicht

ALTER PROCEDURE [dbo].[sp_XNet_Backup] 
    @backupPath NVARCHAR(4000) = null, 
    @rc INT OUT 
AS 
BEGIN 

    SET @rc = 0 
    ... 
    ... 

von C# Projekt auf diese Weise gestartet:

SqlParameter[] paramters = new SqlParameter[2]; 
byte i = 0; 

string sp = "dbo.sp_XNet_Backup"; 

using (SqlConnection conn = DBManager.CreateADOConnMaster()) 
{ 
    conn.Open(); 

    SqlCommand cmd = new SqlCommand(sp, conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    paramters[i++] = new SqlParameter("@backupPath", completePath); 
    paramters[i] = new SqlParameter("@rc", SqlDbType.Int); 
    paramters[i].Direction = ParameterDirection.InputOutput; 

    foreach (SqlParameter param in paramters) 
     cmd.Parameters.Add(param); 

    cmd.ExecuteNonQuery(); 
    ... 
    ... 

Aber es diesen Fehler gibt mir:

Procedure or function 'sp_XNet_Backup' expects parameter '@rc', which was not supplied.

+3

hilft Wenn Sie keinen Wert auf '@ rc' zuweisen, dann verwenden Sie' ParameterDirection.Output' – stuartd

+0

Randbemerkung, sollten Sie Ihre Umbenennung Prozedur und Entfernen des Präfix sp_ (oder noch besser alle Präfixe fallen lassen). Das Präfix sp_ ist von MS reserviert und kann einige Probleme verursachen. http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+0

Ok sieht gut aus :-) – user3518663

Antwort

0

Vielmehr dann ParameterDirection.InputOutput arbeiten, verwenden ParameterDirection.Output

cmd.Parameters.Add("@rc", SqlDbType.Int).Direction = ParameterDirection.Output; 
try 
{ 
    if (cmd.Connection.State == ConnectionState.Closed) 
    { 
     cmd.Connection.Open(); 
    } 
    cmd.ExecuteNonQuery(); 
    result = Convert.ToInt32(cmd.Parameters["@rc"].Value);  
} 
catch (Exception) 
{ 

} 
finally 
{     
    cmd.Connection.Close(); 
    Response.Write(result); 
} 
0

Ich glaube, dies geschieht, da es keine Parameterwerte zugeordnet sind vor cmd.ExecuteNonQuery Aufruf();

bitte Werte hinzufügen und versuchen, hoffen, dass diese

foreach (SqlParameter param in paramters) 
    { 
    param.Value = //somevalue 
    cmd.Parameters.Add(param); 
    } 
Verwandte Themen