Asp.net 解决错误:对象引用未设置为对象的实例

Asp.net 解决错误:对象引用未设置为对象的实例,asp.net,c#-4.0,Asp.net,C# 4.0,我在使用FileUpload上传图像文件时收到此eror。我在要插入的按钮单击事件中遇到此错误 public int InsertData(ProductPhoto prdctphoto) { int ans = 0; SqlCommand cmd = DataConnection.GetConnection().CreateCommand(); cmd.CommandText = "prcProduct

我在使用FileUpload上传图像文件时收到此eror。我在要插入的按钮单击事件中遇到此错误

  public int InsertData(ProductPhoto prdctphoto)
        {
            int ans = 0;
            SqlCommand cmd = DataConnection.GetConnection().CreateCommand();
            cmd.CommandText = "prcProductPhoto";
            cmd.CommandType = CommandType.StoredProcedure;
           // cmd.Parameters.Add(new SqlParameter("@PhotoID", prdctphoto.PhotoID));
            cmd.Parameters.Add(new SqlParameter("@PhotoName", prdctphoto.PhotoName));
            cmd.Parameters.Add(new SqlParameter("@ExtName", prdctphoto.ExtName));
            cmd.Parameters.Add(new SqlParameter("@PhotoType", prdctphoto.PhotoType));
            cmd.Parameters.Add(new SqlParameter("@PhotoSize", prdctphoto.PhotoSize));
            cmd.Parameters.Add(new SqlParameter("@ProductID", prdctphoto.ProductID));
            ans = int.Parse(cmd.ExecuteScalar().ToString());
            cmd.Dispose();
            DataConnection.CloseConnection();
            return ans;
        }
我正在纠正错误

ans=int.Parsecmd.ExecuteScalar.ToString

我的存储过程的代码是

create proc prcProductPhoto
(
@PhotoName  Varchar(100),
@ExtName    Varchar(100),
@PhotoType  Varchar(100),
@PhotoSize  int,
@ProductID  Int
)
as
insert into ProductPhoto(PhotoName,ExtName,PhotoType,PhotoSize,ProductID) values (@PhotoName,@ExtName,@PhotoType,@PhotoSize,@ProductID)
按钮点击事件的代码是

protected void Insert_Click(object sender, EventArgs e)
    {
        try
        {

            if (photoupload.HasFile)
            {
                ProductPhoto prdctphoto = new ProductPhoto();
                prdctphoto.PhotoName = photoupload.FileName;
                prdctphoto.PhotoSize = photoupload.PostedFile.ContentLength;
                prdctphoto.PhotoType = photoupload.PostedFile.ContentType;
                prdctphoto.ExtName = prdctphoto.PhotoName.Substring(prdctphoto.PhotoName.LastIndexOf(".") + 1);
                prdctphoto.ProductID = int.Parse(ddlproductname.SelectedValue);
                //Response.Write(data.ExtName);
                int ans = new InsertAction().InsertData(prdctphoto);
                if (ans != 0)
                {
                    string path = Server.MapPath("~/upload/") + ans.ToString() + "." + prdctphoto.ExtName;
                    photoupload.SaveAs(path);
                    Response.Write(" File is Uploaded ");
                }
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }

今天早些时候我遇到了这个问题。此错误意味着您应该在ans中初始化的值为空。尝试调试它并确保它实际存储了一个值

将从查询生成的第一个结果集的第一行返回第一列的值

存储过程不返回任何结果集,因此ExecuteScalar将返回null。当您调用cmd.ExecuteScalar.ToString时,您正在对null实例调用一个方法,这就是为什么您会得到一个NullReferenceException

要解决此问题,需要更改存储过程以返回适当的值。从查询中看不出该值应该是什么,但假设ProductPhoto表上有一个要返回的标识列,可以尝试以下操作:

create proc prcProductPhoto
(
   @PhotoName  varchar(100),
   @ExtName    varchar(100),
   @PhotoType  varchar(100),
   @PhotoSize  int,
   @ProductID  Int
)
As
   insert into ProductPhoto
   (
      PhotoName,
      ExtName,
      PhotoType,
      PhotoSize,
      ProductID
   ) 
   values 
   (
      @PhotoName,
      @ExtName,
      @PhotoType,
      @PhotoSize,
      @ProductID
   )

   select Scope_Identity()

您的SP是否确实返回了一个数字?我的Crystal ball今天正在维护中,因此您可以显示存储过程的代码吗?因此您可以测试结果的值,重新编写代码,如下所示:var result=cmd.ExecuteScalar;ans=int.Parseresult.ToString;,通过这种方式,您可以在var结果行上放置断点,以便在尝试将查询结果硬塞入int之前查看查询结果。非常感谢您,先生。。。因为帮助了我,我并没有特权去投票,但无论何时我得到了,我都会为你投票。谢谢