这是一个简单的客户资源管理系统,三层架构设计,但我在填写完客户表单提交按钮时,却出错了:异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例.即无法添加客户!
页面层代码:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using crm.Components;
using System.Data.SqlClient;
using SQLHelper;namespace crm.DesktopModules.Client
{

public class AddOldClient : System.Web.UI.Page
{
.......................
..................


private void Page_Load(object sender, System.EventArgs e)
{
if(Session["UserID"]==null)
{
Response.Redirect("~/Default.aspx");
}
if(Components.User.IsAuthorityAdmin(Session["UserID"].ToString()) >= Components.User.USERTYPENORMAL)
{
Response.Write("<script>alert(\"你没有权限,请与管理员联系!\")</script>");
Response.Write("<script>history.back();</script>");
}
if(!Page.IsPostBack)
{
UpdateTime.Text=DateTime.Now.ToShortDateString();
}

} private void AddBtn_Click(object sender, System.EventArgs e)
{ if(Page.IsValid == true)
{


crm.Components.Old_Client old_client = new crm.Components.Old_Client();
try                 //这里调用数据访问层Old_Client.cs的AddClient()方法
{
old_client.AddClient(Int32.Parse(AreaList.SelectedValue),Int32.Parse(ClientTypeList.SelectedValue),Int32.Parse(ManagerList.SelectedValue),Int32.Parse(Visit_Intent_List.SelectedValue),Int32.Parse(Visit_Way_List.SelectedValue),Convert.ToDateTime(VisitTime.Text.Trim()),ClientName.Text.Trim(),Address.Text.Trim(),Man_Visited.Text.Trim(),Man_Visited_Position.Text.Trim(),Man_Visited_Tel.Text.Trim(),Now_State.Text.Trim(),Products.Text.Trim(),Use_State.Text.Trim(),Month_Complain_Handle.Text.Trim(),Int32.Parse(Client_Stability_List.SelectedValue),New_Demand.Text.Trim(),Competitor_Activity.Text.Trim(),Topic.Text.Trim(),Solution.Text.Trim(),Int32.Parse(Start_Flow_List.SelectedValue),Int32.Parse(After_Handle_Dep_List.SelectedValue),Result.Text.Trim(),Gift.Text.Trim(),Company.Text.Trim(),Int32.Parse(Grade_List.SelectedValue),Convert.ToDateTime(UpdateTime.Text.Trim()));


Response.Write("<script>window.alert('数据添加成功!')</script>");}
catch(Exception ex)
{

SystemError.SystemLog(ex.Message);
throw new Exception(ex.Message,ex);
     }
      
} }
             }
}数据访问层代码Old_Client.cs    AddClient()方法的定义
public int AddClient(
int nAreaID  ,
int nClientTypeID  ,
int nManagerID ,
int nVisit_IntentID ,
int nVisit_WayID   ,
DateTime dVisitTime   ,
string sClientName  ,
string sAddress   ,
string sMan_Visited ,
string sMan_Visited_Position  ,
string sMan_Visited_Tel ,
string sNow_State   ,
string sProducts  ,
string sUse_State   ,
string sMonth_Complain_Handle ,
int nClient_StabilityID   ,
string sNew_Demand   ,
string sCompetitor_Activity   ,
string sTopic ,
string sSolution  ,
int nStart_FlowID    ,
int nAfter_Handle_DepID ,
string sResult ,
string sGift     ,
string sCompany,
int nGrade_ID,
DateTime dUpdateTime )
{
     SQLHelper.SQLHelper sqlHelper = new SQLHelper.SQLHelper();
SqlParameter[] paramList = {
   sqlHelper.CreateInParam("@AreaID",SqlDbType.Int,4,nAreaID),
  
   sqlHelper.CreateInParam("@ClientType",SqlDbType.Int,4,nClientTypeID),
   sqlHelper.CreateInParam("@ManagerID",SqlDbType.Int,4,nManagerID),
   sqlHelper.CreateInParam("@Visit_IntentID",SqlDbType.Int,4,nVisit_IntentID),
            sqlHelper.CreateInParam("@Visit_WayID",SqlDbType.Int,4,nVisit_WayID),     sqlHelper.CreateInParam("@VisitTime",SqlDbType.DateTime,8,dVisitTime),
    sqlHelper.CreateInParam("@ClientName",SqlDbType.VarChar,50,sClientName),
     sqlHelper.CreateInParam("@Address",SqlDbType.VarChar,50,sAddress), sqlHelper.CreateInParam("@Man_Visited",SqlDbType.VarChar,50,sMan_Visited),

sqlHelper.CreateInParam("@Man_Visited_Position",SqlDbType.VarChar,50,sMan_Visited_Position),
 sqlHelper.CreateInParam("@Man_Visited_Tel",SqlDbType.VarChar,50,sMan_Visited_Tel),
sqlHelper.CreateInParam("@Now_State",SqlDbType.VarChar,200,sNow_State),
sqlHelper.CreateInParam("@Products",SqlDbType.VarChar,200,sProducts),
    sqlHelper.CreateInParam("@Use_State",SqlDbType.VarChar,200,sUse_State),
   sqlHelper.CreateInParam("@Month_Complain_Handle",SqlDbType.VarChar,200,sMonth_Complain_Handle),
sqlHelper.CreateInParam("@Client_StabilityID",SqlDbType.Int,4,nClient_StabilityID),
 sqlHelper.CreateInParam("@New_Demand",SqlDbType.VarChar,50,sNew_Demand),
sqlHelper.CreateInParam("@Competitor_Activity",SqlDbType.VarChar,50,sCompetitor_Activity),
      sqlHelper.CreateInParam("@Topic",SqlDbType.VarChar,50,sTopic),
     sqlHelper.CreateInParam("@Solution",SqlDbType.VarChar,50,sSolution),
   sqlHelper.CreateInParam("@Start_FlowID",SqlDbType.Int,4, nStart_FlowID),
     sqlHelper.CreateInParam("@After_Handle_DepID",SqlDbType.Int,4, nAfter_Handle_DepID),
   sqlHelper.CreateInParam("@Result",SqlDbType.VarChar,50,sResult),
   sqlHelper.CreateInParam("@Gift",SqlDbType.VarChar,50,sGift),
    sqlHelper.CreateInParam("@Company",SqlDbType.VarChar,50,sCompany),
                                            sqlHelper.CreateInParam("@Grade_ID",SqlDbType.Int,4,nGrade_ID),
   sqlHelper.CreateInParam("@UpdateTime",SqlDbType.DateTime,8,dUpdateTime)    };
try
{         //出错提示的地方在这里(但感觉未必就真是这里的错)
                   //调用存储过程(添加客户信息)

return(sqlHelper.RunProc("Pr_AddOld_Client",paramList));
}
catch(Exception ex)
{

SystemError.SystemLog(ex.Message);
throw new Exception(ex.Message,ex);
}
}类似的功能页面,我在AddNewClient.aspx都可以添加,奇怪
到底是什么原因呢?请各位高手,专家,大师帮忙分析一下吧,为了这个我快疯了,感激不尽呀!
(新手分数不多,给80分吧)

解决方案 »

  1.   

    System.NullReferenceException,出现这种错误一般是某个对象没有被初始化,我觉得你应该跟踪一下,看看那个对象在使用的时候没有被初始化。
      

  2.   

    自己debug一下,看看操作相关的对象是否有效,可以通过watch来查看。你的问题,可能就是在asp.net中,所有control触发的postback,那么以前初始化的对象都需要重新初始化,因为postback会触发页面重新load,那么以前初始化的对象都丢失了。
      

  3.   

    return(sqlHelper.RunProc("Pr_AddOld_Client",paramList));
    可能这句的写法有问题~
    变革写法,将里面的东西给一个变量~ 然后返回变量式下
      

  4.   

    -----引用-------------------
    return(sqlHelper.RunProc("Pr_AddOld_Client",paramList));
    可能这句的写法有问题~
    变革写法,将里面的东西给一个变量~ 然后返回变量式下
    --------------------------
    对不起,忘了说了,
    我的Pr_AddOld_Client存储过程已经包含了返回值  RETURN @@Identity,也许1\2楼的大侠说的有道理,可是我不知道怎么去调试 ,F9插断点,F11单步运行,监视窗口的信息是我在控件上填写的那些变量值,没错啊....惆怅!
      

  5.   

    to 我的Pr_AddOld_Client存储过程已经包含了返回值  RETURN @@Identity,也许1\2楼的大侠说的有道理,可是我不知道怎么去调试 ,F9插断点,F11单步运行,监视窗口的信息是我在控件上填写的那些变量值你的程序分为两部分,一部分是存储,另一部分是调用。前者你可以用sql server的查询分析器调用,看看是否正确,不过建议不要使用Return来返回数据,用output类型参数,可能效果更好,例如:
    Select @NewID = @@Identity后者主要查看参数的配置,以及各个db操作对象的初始化。
      

  6.   

    附上我添加客户信息的存储过程,如下:
    CREATE PROCEDURE Pr_AddOld_Client
    (
        @AreaID   int,
        @ClientTypeID    int,
        @ManagerID  int,
        @Visit_IntentID    int,
        @Visit_WayID   int,
        @VisitTime   datetime,    
        @ClientName    varchar(50),
        @Address   varchar(50),
        @Man_Visited varchar(50),
        @Man_Visited_Position  varchar(50),
        @Man_Visited_Tel   varchar(50),
        @Now_State   varchar(200),
        @Products  varchar(200),
        @Use_State   varchar(200),
        @Month_Complain_Handle varchar(200),
        @Client_StabilityID   int,
        @New_Demand   varchar(50),
        @Competitor_Activity   varchar(50),
        @Topic  varchar(50),
        @Solution  varchar(50),
        @Start_FlowID   int ,
        @After_Handle_DepID  int,
        @Result  varchar(50),
        @Gift    varchar(50)  ,
        @Company varchar(50),
        @Grade_ID   int,
        @UpdateTime  datetime    
      
    )    
    ASINSERT INTO
        Old_Client
        (    AreaID  ,
        ClientTypeID  ,
        ManagerID ,
        Visit_IntentID ,
        Visit_WayID   ,
        VisitTime   ,                   
        ClientName  ,
        Address   ,
        Man_Visited ,
        Man_Visited_Position  ,
        Man_Visited_Tel ,
        Now_State   ,
        Products  ,
        Use_State   ,
        Month_Complain_Handle ,
        Client_StabilityID   ,
        New_Demand   ,
        Competitor_Activity   ,
        Topic ,
        Solution  ,
        Start_FlowID    ,
        After_Handle_DepID ,
        Result ,
        Gift     ,
        Company,
        Grade_ID,
        UpdateTime  
            
        
        )
        VALUES
        (
        @AreaID  ,
        @ClientTypeID  ,
        @ManagerID ,
        @Visit_IntentID ,
        @Visit_WayID   ,
        @VisitTime   ,              
        @ClientName  ,
        @Address   ,
        @Man_Visited ,
        @Man_Visited_Position  ,
        @Man_Visited_Tel ,
        @Now_State   ,
        @Products  ,
        @Use_State   ,
        @Month_Complain_Handle ,
        @Client_StabilityID   ,
        @New_Demand   ,
        @Competitor_Activity,
        @Topic ,
        @Solution  ,
        @Start_FlowID    ,
        @After_Handle_DepID ,
        @Result ,
        @Gift     ,
        @Company,
        @Grade_ID,
        @UpdateTime        
    )
    RETURN @@Identity   //返回一个表自动递增的标识
    GO
    愚翁大侠,恳请看一下,这个错与存储过程有关么?
      

  7.   

    你没有定义参数来接收返回值,
    我不太习惯在存储中用返回值,如果要用返回值,你可以查查这方面的帮助如果是可以使用output参数,可以如下进行修改。
    1.
    //Stored Procedure
    ..
    @UpdateTime datetime,
    @NewID Int OUTPUT --Add new parameter2.
    change
    RETURN @@Identitywith
    SELECT @NewID = @@Identity3.
    //Add parameter in "paramList"
    ..
    sqlHelper.CreateInParam("@UpdateTime",SqlDbType.DateTime,8,dUpdateTime),
    sqlHelper.CreateInParam("@NewID",SqlDbType.Int )//Set its type
    paramList[paramList.Length -1 ].Direction = ParameterDirection.Output;
      

  8.   

    单独用sql语句插入可行,如下:
    INSERT INTO
        Old_Client
        (    AreaID  ,
        ClientTypeID  ,
        ManagerID ,
        Visit_IntentID ,
        Visit_WayID   ,
        VisitTime   ,                   
        ClientName  ,
        Address   ,
        Man_Visited ,
        Man_Visited_Position  ,
        Man_Visited_Tel ,
        Now_State   ,
        Products  ,
        Use_State   ,
        Month_Complain_Handle ,
        Client_StabilityID   ,
        New_Demand   ,
        Competitor_Activity   ,
        Topic ,
        Solution  ,
        Start_FlowID    ,
        After_Handle_DepID ,
        Result ,
        Gift     ,
      Company,
      Grade_ID,
        UpdateTime  
            
        
        )
        VALUES
        (
       1  ,
       1  ,
       1,
       1 ,
       1  ,
       '2006-06-06' ,              
       'a'  ,
       ' b'   ,
       ' c',
       ' d',
       'e' ,
       'f'  ,
      ' g ',
      'h' ,
      ' i' ,
       1  ,
        'j' ,
     ' k',
       'l' ,
       ' m ',
       1  ,
         1 ,
       ' o' ,
        ' p  '  ,
      'q',
       1,
        '2006-09-09'     
    )GO
    那所谓对象没有初始化是什么意思呢?
    是.aspx文件,
    还是.aspx.cs文件