System.NullReferenceException:未将对象引用设置为对象的实例

时间:2015-09-05 14:53:08

标签: sql image asp.net-mvc-4

问题是没有显示图像。一切都是正确的数据传输到数据库并传递给视图没有错误只有这个标签中的问题:

<img src="data:image/png;base64,@Convert.ToBase64String(Model.student_image.Image_Data,0, Model.student_image.Image_Data.Length)" width="100" />

我存储了.png类型的图片但没有成功。

  

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

来源错误:

Line 328:
Line 329:            byte[] abc = obj.DisImage("ali87613@yahoo.com");
Line 330:            cls.S_image.Image_Data = abc;
Line 331:            return View(cls);
Line 332:        }

代码:

    public ActionResult StudentAcount() 
    {
        ViewModelQuestion cls = new ViewModelQuestion();
        StudentDAL obj = new StudentDAL();

        byte[] abc = obj.DisImage("ali87613@yahoo.com");
        cls.S_image.Image_Data = abc;
        return View(cls);
    }

    public byte[] DisImage(string Email)
    {
        byte[] byteData;
        SqlConnection con = null;
        SqlDataReader reader;

        try
        {
            con = new SqlConnection(ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString);

            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "usp_StudentDisplayImage";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = con;

            cmd.Parameters.AddWithValue("@S_Email", Email);

            con.Open();
            reader = cmd.ExecuteReader();
            if (reader.Read())
            {
                byteData = (byte[])reader["S_Image_Data"];
                return byteData;

            }
            else
            {
                byteData = (byte[])reader["S_Image_Data"];
            }
        }
        catch (Exception ex) 
        {
            throw ex;
        }
       return  byteData = (byte[])reader["S_Image_Data"];

    }
public class ImageGallery
{

    public Guid Image_Id { get; set; }
    public byte[] Image_Data { get; set; }
    public DateTime Image_Date { get; set; }
    public DateTime Image_Time { get; set; }
    public int Image_Status { get; set; }

}
public class StudentImage : ImageGallery
{}
public class ViewModelQuestion 
{

    public List<Tutor_Subject> tutor_subject { get; set; }
    public List<Student_Subject> student_subject { get; set; }

    public Student_PointsAcount student_PointsAcount { get; set; }
    public Tutor_Points tutor_Points { get; set; }

    public StudentImage student_image { get; set; }
    public Stu_Question stu_Question { get; set; }

    public StudentImage S_image { get; set; }
    public TutorImage T_image { get; set; }


    public List<Tutor_Answer> tutor_Ans { get; set; }
    public List<TutorImage> tutor_image { get; set; }
}

2 个答案:

答案 0 :(得分:3)

首先实例化此模型:

ViewModelQuestion cls = new ViewModelQuestion();

然后尝试分配:

cls.S_image.Image_Data = abc;

但是S_image属于StudentImage类型,并且从未实例化,因此它应该是null。这就是空引用错误发生的地方。

您应该在S_imageStudentAcount()的构造函数中实例化ViewModelQuestion。其他属性可能也应该这样做。例如,tutor_subject也将null与您的代码保持一致。

答案 1 :(得分:1)

行。 StackTrace说这行错误:

cls.S_image.Image_Data = (byte[])dt.Rows[0]["S_Image_Data"];

在该行上放置一个断点;运行系统,当它在该行停止时,检查其上的所有内容是否为空。你应该检查的可能是null的东西是:

  • CLS
  • cls.S_image
  • DT
  • dt.Rows
  • dt.Rows [0]
  • dt.Rows [0] [ “S_Image_Data”]

一旦你发现它是什么,那么你需要找出为什么,然后你就可以解决它。

然而,进一步的堆栈跟踪似乎表明它正在Lambda方法中发生 -

f:\ StudentHLP \ 20150726 \ StudentHelpp(0.0.0.8)\ StudentHelpp(0.0.0.3)\ StudentHelpp \ Controllers \ StudentController.cs:330 lambda_method(Closure,ControllerBase,Object [])+101

这意味着即时评估某些内容。 (例如,在实际使用生成的变量之前,Linq不会运行。)我看不到你所显示的代码中的任何内容,看起来它会像这样做,但我觉得你有点像比我在这里显示的代码可以分析的更复杂。

在第330行停止,然后尝试评估我在即时窗口中列出的变量,看看会发生什么。