首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

未将对象引用设置到对象的实例-一直找不到原因,该如何处理

2012-03-14 
未将对象引用设置到对象的实例--一直找不到原因,数据库联接字符串:addname MemberCardConnectionString

未将对象引用设置到对象的实例--一直找不到原因,
数据库联接字符串:
  <add   name= "MemberCardConnectionString "   connectionString= "Data   Source=CHINESE;Initial   Catalog=MemberCard;User   ID=sa;Password=1234 "
            providerName= "System.Data.SqlClient "   />  
实现一个网数据库中添加信息的功能,两个字段,点击添加的事件如下:

        protected   void   Button1_Click(object   sender,   EventArgs   e)
        {
                //实例化一个会员卡类型实体
                CardTypeEntity   mycard   =   new   CardTypeEntity();

                //设置实体的属性
                mycard.CardTypeName   =   txttype.Text;
                //会员卡积分规则是数值类型的数据,必须进行类型转换
                mycard.CardRule   =   Int32.Parse(txtrule.Text);
                //实例化一个会员卡类型实体访问方法
                CardTypeDA   myda   =   new   CardTypeDA();
                bool   result   =   myda.InsertCardType(mycard);

                //添加成功则清空屏幕
                if   (result)
                {
                        txttype.Text   =   " ";
                        txtrule.Text   =   " ";
                }

        }

添加方法如下:
  ///   <summary>
        ///   添加卡类型
        ///   </summary>
        ///   <param   name= "mycard "> 卡类型实体 </param>
        ///   <returns> </returns>
        public   bool   InsertCardType(CardTypeEntity   mycard)
        {  
                //首先判断新的会员卡类型名是否后已经存在
                bool   exits   =   GetCardType(mycard.CardTypeName);//调用这个方法的时候出错
                //如果不存在,正常执行,如果存在,方法返回flase
                if   (exits)
                {
                        StringBuilder   strSQL   =   new   StringBuilder();
                        //获取添加卡类型的T-SQL语句的参数
                        SqlParameter[]   cardParms   =   GetParameters();
                        SqlCommand   cmd   =   new   SqlCommand();

                        //给参数赋值


                        cardParms[0].Value   =   mycard.CardTypeName;
                        cardParms[1].Value   =   mycard.CardRule;

                        //遍历参数列表,并将参数添加金SqlCommand命令中
                        foreach   (SqlParameter   parm   in   cardParms)
                                cmd.Parameters.Add(parm);
                        //定义对象资源保存的范围,一旦using范围结束,将释放对象所占的资源
                        using   (SqlConnection   conn   =   new   SqlConnection(SqlHelper.ConnectionStringLocalTransaction))
                        {
                                strSQL.Append(SQL_INSERT_CARDTYPE);
                                conn.Open();

                                //设定sqlcommand的属性
                                cmd.Connection   =   conn;
                                cmd.CommandType   =   CommandType.Text;
                                cmd.CommandText   =   strSQL.ToString();
                                //执行sqlcommand命令
                                int   val   =   cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                                if   (val   >   0)
                                        return   true;
                                else
                                        return   false;
                        }

                }
                else
                        return   false;
        }

GetCardType方法如下:
private   bool   GetCardType(string   typename)
        {  
                //创建新参数并给参数赋值,用来指定会员卡类型名


                SqlParameter   parm   =   new   SqlParameter(PARM_CARD_TYPENAME,SqlDbType.NVarChar,20);
                parm.Value   =   typename;

                //调用sqlhelper访问组件的方法返回第一行第一列的值
                object   obj   =   SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction,   CommandType.Text,   SQL_SELECT_CARDNAME,   parm).ToString();

                //如果卡类型不存在返回true,如果存在返回false
                if   (obj   ==   null)
                        return   true;
                else
                        return   false;
        }


       

//常量用来表示T-Sql语句中用到的变量名称和T-SQL语句本身
        private   const   string   PARM_CARD_TYPENAME   =   "@cardtypename ";
        private   const   string   PARM_CARD_RULE   =   "@cardrule ";
        private   const   string   SQL_SELECT_CARDRULE   =   "SELECT   cardrule   FROM   cardtype   WHERE   cardtypename=@cardtypename ";
        private   const   string   SQL_UPDATE_CARDTYPENAME   =   "UPDATE   cardtype   SET   cardtypename=@cardtypename   WHERE   cardtypename=@oldname ";
        private   const   string   SQL_UPDATE_CARDRULE   =   "UPDATE   cardtype   SET   cardrule=@cardrule   WHERE   cardtypename=@cardtypename ";
        private   const   string   SQL_INSERT_CARDTYPE   =   "INSERT   INTO   cardtype   VALUES(@cardtypename,@cardrule) ";
        private   const   string   SQL_SELECT_CARDNAME   =   "SELECT   cardtypename   FROM   cardtype   WHERE   cardtypename=@cardtypename ";

那位兄弟有时间帮我看下这个错误怎么弄啊!我找了好长时间了,没找到错误,这个里面的parm.Value已经的到了一个值

        public   static   object   ExecuteScalar(string   connectionString,   CommandType   cmdType,   string   cmdText,   params   SqlParameter[]   commandParameters)
        {
                SqlCommand   cmd   =   new   SqlCommand();

                using   (SqlConnection   connection   =   new   SqlConnection(connectionString))
                {
                        PrepareCommand(cmd,   connection,   null,   cmdType,   cmdText,   commandParameters);
                        object   val   =   cmd.ExecuteScalar();
                        cmd.Parameters.Clear();
                        return   val;


                }
        }


        public   static   object   ExecuteScalar(SqlConnection   connection,   CommandType   cmdType,   string   cmdText,   params   SqlParameter[]   commandParameters)
        {
                SqlCommand   cmd   =   new   SqlCommand();

                PrepareCommand(cmd,   connection,   null,   cmdType,   cmdText,   commandParameters);
                object   val   =   cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return   val;
        }  

大家帮忙看看吧,小弟初学,谢谢了!

[解决办法]
具体哪个地方出错?贴出来看.
[解决办法]
未将对象引用设置到对象的实例
这个错误,总得指向一行吧。你给这么多代码,让大家怎么帮你啊
[解决办法]
跟踪一下,估计是哪出null或是没new了。
[解决办法]
private bool GetCardType(string typename)
{
//创建新参数并给参数赋值,用来指定会员卡类型名
SqlParameter parm = new SqlParameter(PARM_CARD_TYPENAME,SqlDbType.NVarChar,20);
parm.Value = typename;

//调用sqlhelper访问组件的方法返回第一行第一列的值
object obj = SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_CARDNAME, parm).ToString();

//如果卡类型不存在返回true,如果存在返回false
if (obj == null)
return true;
else
return false;
}
可能是判断出错了,object 的null值在 .tostring()的时候会出错的
[解决办法]
private bool GetCardType(string typename)
{
//创建新参数并给参数赋值,用来指定会员卡类型名
SqlParameter parm = new SqlParameter(PARM_CARD_TYPENAME,SqlDbType.NVarChar,20);
parm.Value = typename;

//调用sqlhelper访问组件的方法返回第一行第一列的值
try
{
object obj = SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_CARDNAME, parm).ToString();

//如果卡类型不存在返回true,如果存在返回false
return false;
}
catch(Exception E)
{
return true;
}
}

把产生的异常抛出,就是使用ExecuteScalar()方法经常出现的问题
我以前也遇到过类似的问题,至今未找到一个好的方法解决.
其实LZ可以采用一个折中的方法
用ExecuteReader()方法反回一个记录集,再用HasRows来判断是否已经有了重复的记录
这样就可以避免上述问题

[解决办法]
顶ls的,ExecuteScalar()方法问题。或者代码丑陋一点用
if(SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_CARDNAME, parm)!=null)判断一下 。

热点排行