未将对象引用设置到对象的实例--一直找不到原因,
数据库联接字符串:
<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)判断一下 。