2016-12-21 3 views
0

Zuerst überhaupt, ich weiß Fragen wie diese sind doppelt ABER, bitte achten Sie auf diese erwarten. Hier ist Code meine C#, hinter dem der Fehler als erhöhen:Prozedur oder Funktion 'x' erwartet Parameter '@y', der nicht mitgeliefert wurde. Fehler bei C#?

Prozedur oder Funktion ‚aaa‘ erwartet Parameter ‚@bbb‘, die nicht geliefert wurde.

if (Dt.Rows.Count > 0) 
{ 
    Cmd = new SqlCommand(); 
    Cmd.CommandText = ("[dbo].[aaa]"); 
    Cmd.CommandType = CommandType.StoredProcedure; 
    Cmd.Parameters.Add("@bbb", SqlDbType.Int).Value = 1; 
    Cmd.Parameters.Add("@LettType", SqlDbType.VarChar, 3).Value = LetterType; 
    Cmd.Parameters.Add("@IsTajamo", SqlDbType.Char, 1).Value = 1; 
    Da = new SqlDataAdapter(Cmd.CommandText, Con); 
    Dt.Clear(); 
    /*Line72:*/  
    Da.Fill(Dt); 
} 

Technisch kann ich nicht gefunden, wo der Fehler ist. Ich habe alle Parameter bestanden. Und wenn ich meine gespeicherte Prozedur separat in MS-SQL ausführen, funktioniert es mit diesen Werten.

Können Sie Experten bitte helfen Sie mir zu diesem Thema? Achtung: hier wird Stored Proc:

ALTER PROCEDURE [dbo].[aaa] (@bbb Int , @LettType CHAR(3) , @IsTajamo CHAR(1)) 

AS 
BEGIN 

select 1 


END 

Achtung: (kann dies helfen kann, hier ist mein Stack-Trace):

bei System.Data.SqlClient.SqlConnection.OnError (SqlException Ausnahme, Boolean Breakconnection, Aktion 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) bei System.Data.SqlClient.TdsParser.TryRun (RunBehavior runB ehavior, SqlCommand CmdHandler, SqlDataReader Datenstrom, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & Dataready) bei System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() bei System.Data.SqlClient.SqlDataReader.get_MetaData() bei -System .Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean IsInternal, Boolean forDescribeParameterEncryption) bei System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean asynchron, Int32-Zeitüberschreitung, Aufgabe & Aufgabe, Boolean AsyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) bei System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String Methode, TaskCompletionSource`1 Abschluss, Int32 Timeout, Aufgabe & Aufgabe, Boolean & usedCache, Boolean AsyncWrite, Boolean inRetry) bei System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String -Methode) bei System.Data.SqlClient.SqlCommand .ExecuteReader (CommandBehavior Beha vior, String-Methode) bei System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior Verhalten) bei System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (CommandBehavior Verhalten) bei System.Data.Common. DbDataAdapter.FillInternal (DataSet Datensatz, DataTable [] -Datentabellen, Int32 startRecord, Int32 maxRecords, Zeichenfolge srcTable, IDbCommand-Befehl, CommandBehavior-Verhalten) um System.Data.Common.DbDataAdapter.Fill (Datatable [] DataTables- Int32 startrecord, Int32 maxRecords, IDbCommand Befehl, CommandBehavior Verhalten) bei System.Data.Common.DbDataAdapter.Fill (Datatable Datatable) bei WebService.Services.GetLettersList (String username, String Passwort ein, String Codename, String letter) in D: \ Amiri \ WebService \ WebService \ Services.asmx.cs: Linie 79

+0

@Satpal Es gibt kein Problem mit der Prozedur. wenn Sie die Frage vor dem Markieren nur richtig gelesen haben. Du kannst verstehen, sagte ich. Prozedur funktioniert ordnungsgemäß. – AminAmiriDarban

+0

Ich habe die Frage gelesen und bin noch nicht markiert. Aber für mich scheint Problem Snippet für die Auflösung – Satpal

+0

@ نرخیاب hilfreich sein: Streiten mit denen, die versuchen, Ihnen zu helfen, ist ein guter Weg, um diese Hilfe wegzugehen. Das heißt, der häufigste Grund für diesen Fehler in meiner Erfahrung ist die falsche Schreibweise des Parameternamens. Überprüfe deine Rechtschreibung. –

Antwort

5

in Ihrer Linie:

Da = new SqlDataAdapter(Cmd.CommandText, Con); 

Sie nur das Bestehen der Namen des Prozedur und Ignorieren der Parameter. Übergeben Sie nur Cmd (und fügen Sie diese Verbindung dem Befehl hinzu), um Ihre definierten Parameter zu verwenden.

+0

ausführen if (Dt.Rows.Count> 0) { Da = neuer SqlDataAdapter (Cmd.CommandText, Con); Da.SelectCommand.Parameters.Add ("@ bbb", SqlDbType.Int) .Wert = 1; Da.SelectCommand.Parameters.Add ("@ LettType", SqlDbType.VarChar, 3) .Wert = LetterType; Da.SelectCommand.Parameters.Add ("@ IsTajamo", SqlDbType.Char, 1) .Wert = 1; FALSCHE ANTWORT FALSCHE ANTWORT – AminAmiriDarban

+0

Auch der Parameter '@ LettType' wird als' char (3) 'deklariert, aber im .net-Code wird er als' varchar' deklariert. –

2

@ Hans Kesting ist richtig, aber ich denke nicht, dass es gut erklärt wird. Was ist mit diesem geschieht ...

da = new SqlDataAdapter(Cmd.CommandText, Con); 

... ist Sie eine neue SqlCommand implizit erstellen, die die gleiche CommandText wie Cmd hat. Es ist das gleiche, als ob Sie wörtlich [dbo].[aaa] als Argumentwert verwendet hätten. Daher hat diese neue SqlCommand keine SqlParameters zugewiesen. Sie könnten dann tun: SqlDataAdapter.SelectCommand.Parameters.Add(...., aber das ist ein Durcheinander.

Was Sie tun müssen, ist die SqlCommand (Cmd) selbst zu verwenden. Aber Sie müssen auch sicherstellen, dass es mit der Verbindung verbunden ist:

Cmd = Con.CreateCommand(); //This hooks up the connection to this command 
    Cmd.CommandText = "[dbo].[aaa]"; 
    Cmd.CommandType = CommandType.StoredProcedure; 
    Cmd.Parameters.Add("@bbb", SqlDbType.Int).Value = 1; 
    Cmd.Parameters.Add("@LettType", SqlDbType.VarChar, 3).Value = LetterType; 
    Cmd.Parameters.Add("@IsTajamo", SqlDbType.Char, 1).Value = 1; 
    Da = new SqlDataAdapter(Cmd); //Just the command 
    Dt.Clear(); 
    Da.Fill(Dt); 
Verwandte Themen