Procedura stocată cu parametrii de ieșire conectați la metoda în C #

Vedeți ceva greșit cu această linie:

commaSepString1 = com.Parameters["@CommaSepString"].Value.ToString();

Se afișează o eroare cum ar fi:

Referința obiectului nu este setată la o instanță a unui obiect.

Pe scurt, metoda C# arata ca:

public static DataTable GetFilmDetails(string filmId, out string
commaSepString1)

Este nevoie de următoarea procedură stocată (care se execută corect pe cont propriu):

com.CommandText = "CatalogGetFilmDetails2";

Și din moment ce @CommaSepString este un parametru de ieșire în procedura stocată , în C# am următoarele:

param = com.CreateParameter();
param.ParameterName = "@CommaSepString";
param.Direction = ParameterDirection.Output;
param.DbType = DbType.String;
com.Parameters.Add(param);

commaSepString1 = com.Parameters["@CommaSepString"].Value.ToString();

Dacă sunteți curios cu privire la procedura stocată, aceasta începe astfel: CREATE PROCEDURE CatalogGetFilmDetails2

(@FilmID int, @CommaSepString VARCHAR(50) OUTPUT) AS

SP introduce anumite rânduri într-o variabilă de tabelă bazată pe anumite legături, pune toate valorile din coloana x din tabelul respectiv într-un șir cu valori separate prin virgulă:

  SELECT @CommaSepString
= STUFF ((SELECT ',' + Categ FROM @ Filme1 PATH xml ('')), 1,1, '')
 

apoi selectează tabelul.

Vă mulțumim pentru răbdarea de a citi acest lucru. Ar fi mai clar dacă am publicat întregul cod pentru procedura stocată și metoda C #? Nu sunt sigur dacă mi se permite acest lucru și sunt îngrijorat că ar putea fi prea lungă pentru a citi.

PS: There must be something wrong about the commaSepString! The code worked perfectly before I added it in both places.

0
Mulțumesc tuturor, ordinul a fost defect într-adevăr așa cum ați spus. Acum am o altă eroare: String [1]: proprietatea Size are o dimensiune nevalidă de 0.
adăugat autor Anna T, sursa
Codul nu se așteaptă să primească o bază de date NULL înapoi. commaSepString1 = com.Parameters ["@ CommaSepString"] Valoare == DBNull.Value? null: (șir) (com.Parameters ["@ CommaSepString"] Valoare);
adăugat autor HABO, sursa
În ce moment apelați de fapt procedura stocată?
adăugat autor Michael Liu, sursa
Întrebarea mea este aceeași cu cea pe care o pune Michael. Fragmentul de cod nu afișează procedura memorată. Deoarece parametrul este desemnat drept ieșire, valoarea nu va fi setată fără a invoca sprocul, lăsându-l ca nul. Referința ta nulă este probabil datorată încercării de a apela metoda ToString la valoarea parametrului.
adăugat autor Jesse Squire, sursa

2 răspunsuri

You should set a breakpoint on the offending line, then you should examine your parameters collection to check if the parameter exists.
If it exists, then check if its value is null.
In this case the .ToString() will give you the error described.

0
adăugat
Mulțumesc foarte mult! Am fost ridiculos folosind parametrul de ieșire înainte de a executa procedura memorată. Tocmai am rezolvat comanda, dar acum primesc o altă eroare: String [1]: proprietatea Size are o valoare nevalidă de 0. Cred că acest lucru s-ar putea datora faptului că procedura stocată nu a returnat niciun rezultat pentru acest parametru? Cum pot verifica singură procedura stocată?
adăugat autor Anna T, sursa
Bună, funcționează! Nu m-aș fi gândit niciodată la o astfel de soluție. Este prima dată când întâlnesc această expresie: param.Size . Îmi amintesc. Mulțumesc gazdei, Steve!
adăugat autor Anna T, sursa
Adăugați un param.Size = 100; sau ce așteptați este lungimea șirului returnat, de asemenea, asigurați-vă că actualizați setarea procedurii memorate la aceeași dimensiune nvarchar (100) code>. MSDN Refs
adăugat autor Steve, sursa

SQL Server nu cunoaște output , ci știe doar input/output . Atunci când specificați

param.Direction = ParameterDirection.Output;

SQL Server va citi de fapt și șirul. Deoarece nu ați furnizat o valoare, SQL Server determină că lungimea sa este zero.

Incredibil, dacă specificați numărul magic -1 , SQL Server va determina dimensiunea pentru dvs.:

param.Size = -1;

Aceasta este probabil cea de-a doua cea mai slabă problemă despre ADO.NET. Chiar în spatele faptului că SQL NULL se traduce la DBNull.Value în loc de null .

0
adăugat
+1, chiar în spatele returnării DBNull.Value .. argh!
adăugat autor Zachary, sursa