5 Stimmen

ExecuteScalar throws NullReferenceException

Dieser Code wirft ein NullReferenceException wenn es aufruft ExecuteScalar :

selectedPassengerID = 0;

//SqlCommand command = GenericDataAccess.CreateCommand();

// 2nd test
string connectionString = "";
SqlConnection conn;

connectionString = ConfigurationManager.
    ConnectionStrings["ConnST-MHM"].ConnectionString;
conn = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand();
command.CommandType = CommandType.StoredProcedure ;
command.Connection = conn;
command.CommandText = "SearchForPassenger";

SqlParameter param;

param = command.CreateParameter();
param.ParameterName = "@name";
param.Value = pName; // Session[""];
param.DbType = DbType.String;
command.Parameters.Add(param);

param = command.CreateParameter();
param.ParameterName = "@flightDate";
param.Value = date; 
param.DbType = DbType.String;
command.Parameters.Add(param);

param = command.CreateParameter();
param.ParameterName = "@ticketNo";
param.Value = ticketNumber; 
param.DbType = DbType.Int32;
command.Parameters.Add(param);

int item;

command.Connection.Open();
item = (int)command.ExecuteScalar();

13voto

Mark Brittingham Punkte 28280

Ich habe den größten Teil meiner SQL-Logik in einer DAL gekapselt. Eine dieser DAL-Methoden zieht skalare Ints unter Verwendung der folgenden Logik. Es könnte für Sie funktionieren:

  object temp = cmnd.ExecuteScalar();
  if ((temp == null) || (temp == DBNull.Value)) return -1;
  return (int)temp;

Ich weiß, dass Sie oben eine Menge Code eingegeben haben, aber ich denke, dass dies wirklich der Kern Ihres Problems ist. Viel Glück!

0 Stimmen

Die Prüfung auf DBNull ist von entscheidender Bedeutung, da es Ihnen sehr helfen wird, wenn Sie nulluable Typen verwenden können. +1

7voto

Matt Hamilton Punkte 193704

ExecuteScalar gibt null zurück, wenn keine Datensätze von der Abfrage zurückgegeben wurden (z.B. wenn Ihre SearchForPassenger gespeicherte Prozedur gibt keine Zeilen zurück).

Also diese Zeile:

item = (int) command.ExecuteScalar();

Versucht zu besetzen null zu einer int in diesem Fall. Das wirft ein NullReferenceException .

Gemäß Markus' Antwort die gerade aufgetaucht ist, müssen Sie prüfen, ob null :

object o = command.ExecuteScalar();
item = o == null ? 0 : (int)o;

0 Stimmen

Danke, warum null? Ich habe das in ssms überprüft und es hat funktioniert, bitte helfen Sie

0 Stimmen

Was gibt Ihre gespeicherte Prozedur zurück, wenn Sie dieselben Parameter verwenden, mit denen Ihr Programm sie aufruft?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X