关于C#中,未将对象引用设置设置对象实例,错误求解...

时间:2021-10-30 21:27:40
 private void Form1_Load(object sender, System.EventArgs e)
  {
   SqlConnection cn =new SqlConnection("Server=(local);Database=tempdb;Uid=sa");
   SqlCommand cmd =new SqlCommand("select CLASSID,CLASSNAME from dbo.tCLASS",cn);
   SqlDataReader rdr;
   try
   {
    cn.Open();
    rdr=cmd.ExecuteReader();
    while(rdr.Read())
    {
     comboBox1.Items.Add(rdr[1].ToString());
    }
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message);
   }
   finally
   {
    cn.Close();
   }
  } 

我想把Classname字段绑定到comboBox1 上,但总是报错,说未将引用对象设置为实例,很郁闷,,,还有tclass这张表是新建的,没有错,把代码烤到我同学的机子上就可以,不知道那里出错了,请高手指点...

22 个解决方案

#1


这个算不上绑定,动态生成ComboBox的Items罢了...
如果抛出异常的位置是在cn.Open();那是连接字符串的问题(没有看到密码的设定,你的Sql Server连接密码的设定与同学的不同?)如果位置在cmd.ExecuteReader(),那是表的问题,检查一下访问权限。

#2


哦,我那个连接密码为空,我SQL数据库定义的,那面的那个代码是cmd.ExecuteReader(),出现异常,不知道怎么样检查表的访问权限呢..
高手指点下....

#3


comboBox1.Items.Add(rdr[1].ToString()); 
直接comboBox1.Items.Add(rdr[1]); 

#4


tempdb中确实有这个表吗?我怎么记得tempdb会自动清除其中的表的?

#5


comboBox1.Items.Add(new item(rdr[1].ToString())); 这样试一下

#6


四楼确实不错,会自动清除掉,但我根据老师的代码COPY过来的 马上就在SQL中建的表,马上运行,还是不能用啊,提示 rdr=cmd.ExecuteReader(); 
出现异常,都郁闷的啊,
comboBox1.Items.Add(new item(rdr[1].ToString()));这句话不能施行,生成的时候提示出错,

#7


拿你的查询语句在查询分析器中试一下看看有什么结果。

#8


select CLASSID,CLASSNAME from dbo.tCLASS 把dbo去掉。
数据库所有者 (dbo)
dbo 是具有在数据库中执行所有活动的暗示性权限的用户。将固定服务器角色 sysadmin 的任何成员都映射到每个数据库内称为 dbo 的一个特殊用户上。另外,由固定服务器角色 sysadmin 的任何成员创建的任何对象都自动属于 dbo。

例如,如果用户 Andrew 是固定服务器角色 sysadmin 的成员,并创建表 T1,则表 T1 属于 dbo,并以 dbo.T1 而不是 Andrew.T1 进行限定。相反,如果 Andrew 不是固定服务器角色 sysadmin 的成员,而只是固定数据库角色 db_owner 的成员,并创建表 T1,则 T1 属于 Andrew,并限定为 Andrew.T1。该表属于 Andrew,因为该成员没有将表限定为 dbo.T1。

无法删除 dbo 用户,且此用户始终出现在每个数据库中。

只有由 sysadmin 固定服务器角色成员(或 dbo 用户)创建的对象才属于 dbo。由任何其他也不是 syadmin 固定服务器角色成员的用户(包括 db_owner 固定数据库角色成员)创建的对象: 

属于创建该对象的用户,而不是 dbo。


用创建该对象的用户名限定

#9


各位大峡,刚才按照你们的说的做了还是不行,SQL脚本语言如下,
create table 日志表 (
   顺序号                  numeric(20)          identity ,
   操作类型                 nvarchar(20)         null,
   操作对象                 varchar(30)          null,
   操作用户                 varchar(30)        null default suser_sname(),
   操作日期                 smalldatetime      null default getdate(),
   constraint PK_日志表 primary key  (顺序号)
)

go

if exists (select 1
            from  sysobjects
           where  id = object_id('tCLASS')
            and   type = 'U')
   drop table tCLASS
go

if exists (select 1
            from  sysobjects
           where  id = object_id('tSTUDENT')
            and   type = 'U')
   drop table tSTUDENT
go

/*==============================================================*/
/* Table: tCLASS                                                */
/*==============================================================*/
create table tCLASS (
   CLASSID              numeric              not null,
   CLASSNAME            varchar(20)          null,
   constraint PK_TCLASS primary key  (CLASSID)
)
go

/*==============================================================*/
/* Table: tSTUDENT                                              */
/*==============================================================*/
create table tSTUDENT (
   STUDENTID            varchar(15)          not null,
   CLASSID              numeric              null,
   STUDENTNAME          varchar(20)          null,
   Gentle               bit                  null,
   Picture              image                null,
   constraint PK_TSTUDENT primary key  (STUDENTID)
)
go

alter table tSTUDENT
   add constraint FK_TSTUDENT_REFERENCE_TCLASS foreign key (CLASSID)
      references tCLASS (CLASSID)
go


insert into tCLASS values(1,'06可视化1班')
insert into tCLASS values(2,'06可视化2班')
insert into tCLASS values(3,'06数据库')
insert into tCLASS values(4,'06WEB1班')
insert into tCLASS values(5,'06WEB2班')
insert into tCLASS values(6,'06移动班')
go

create procedure pUptStudent 
  @StudentID varchar(30),
  @classid integer,
  @studentname varchar(30),
  @errstr varchar(80) output
 as
begin
   if @classid is null 
    begin
       select @errstr='班级编号不能为空!'
       return -1000
   end
   
   if not exists (select classname from tCLASS where CLASSID=@classid) 
    begin
      select @errstr='未找到对应的班级!'
      return -1001   /*未找到对应的班级*/
    end
    
    begin tran
      update tSTUDENT set CLASSID=@classid,STUDENTNAME=@Studentname 
             where   STUDENTID=@StudentID
      if @@rowcount=0 
       begin
   rollback tran
           select @errstr='未找到相应的学号'
           return -1002
      end

      if @@error <>0 
       begin
  rollback tran
          select @errstr='修改失败!'
          return -1003
      end

     insert into  日志表(操作类型,操作对象)   
         values('修改','tSTUDENT.'+@StudentID)

     if @@error<>0 
       begin
         rollback tran
         select @errstr='修改失败,插入日志不成功!'
         return -1004
     end
     commit tran
     return 0
end

go

各位大峡,帮我看看,究竟我那里错了,真是郁闷死了,本来对C#就不是那么了解,好不容易下定决心来学习,没想到
就那么一个多月的时间,各种各样的程序出错快把我打跨了,真是奈何不了它啊,,,,

#10


我运行了一遍没错。
1.你要弄清楚你是在哪个数据库上添加这些表的,在最sql脚本最前面加上:use tempdb;去tmpdb数据库里看看有没有你所加的表,如果没就说明你加错地方了,按下面的方式运行。记得前面加上use tempdb;
2.把现在的表全部删除,再执行Sql脚本,刷新一下数据库。找到生成的表后,在查询分析器中运行select CLASSID,CLASSNAME from dbo.tCLASS 语句,有结果一般就没问题。

3。程序没问题。是在数据库上的问题.

#11


   我都弄过了,那个USING TEMPDB 我是直接在TEMPDB里面写的,我怀疑估计是那个数据库权限问题,
有些是我拿我老师的代码来运行,也是提示出现同样的错误,但是在运行可执行文件的时候却能运行,真是
郁闷啊,不知道是什么问题,我叫我同学帮我,他们也解决不了...

#12


在查询分析器中运行select语句有返回结果?

#13


应该是connectionString的问题,跟踪调试一下就知道错在那句话了。 
再加上一句dr.close();

#14


哎,高手都到那里去了,怎么个个都不能解决问题呢,上楼的楼主,我按照你说了做了,还是不行,因为connectionString字符串没有问题,我在SQL中运行可以才复制到.NET中去的,我实在是无语,10楼的问题我早就这样做,但就是不行,没办法,烂机子,更高手的到那里去了,学生需要详解,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

#15


private void Form1_Load(object sender, System.EventArgs e) 
  { 
   SqlConnection cn =new SqlConnection("Server=(local);Database=tempdb;Uid=sa"); 
   SqlCommand cmd =new SqlCommand("select CLASSID,CLASSNAME from dbo.tCLASS",cn); 
   SqlDataReader rdr; ////这里要这样写SqlDataReader rdr=null;
   try 
   { 
    cn.Open(); 
    rdr=cmd.ExecuteReader(); 
    while(rdr.Read()) 
    { 
     comboBox1.Items.Add(rdr[1].ToString()); 
    } 
   } 
   catch(Exception ex) 
   { 
    MessageBox.Show(ex.Message); 
   } 
   finally 
   { 
    cn.Close(); 
   } 
  }  

#16


lz要干嘛?

#17


我也碰到了类似的问题。。。不过貌似是别人动了我的电脑或才出来的。。。。

#18


将 catch里面的 运行错误的messagebox显示的信息 仔细打出来给大家看
光凭你说

不知所云 也不知道你问题到底在哪

#19


引用 10 楼 hackenliu 的回复:
我运行了一遍没错。 
1.你要弄清楚你是在哪个数据库上添加这些表的,在最sql脚本最前面加上:use tempdb;去tmpdb数据库里看看有没有你所加的表,如果没就说明你加错地方了,按下面的方式运行。记得前面加上use tempdb; 
2.把现在的表全部删除,再执行Sql脚本,刷新一下数据库。找到生成的表后,在查询分析器中运行select CLASSID,CLASSNAME from dbo.tCLASS 语句,有结果一般就没问题。 

3。程序没问题。是在数据库上的问题.


如果程序没问题 就是或许是,我是说或许是

就是你在登陆sql的时候 服务器的名字MICROSOF-D7A1F9\SQLEXPRESS 和MICROSOF-D7A1F9

MICROSOF-D7A1F9这个才是local指向的服务器 你看下你的表是在哪个服务器下面的

#20


昨天晚上我也碰到了这个问题,不要在之前定义SqlDataReader,就是说把“SqlDataReader rdr; ”去掉,然后把“rdr=cmd.ExecuteReader(); ”改成“SqlDataReader rdr=cmd.ExecuteReader(); ”。
具体原因我不太记得了。
另外:这可是我第一次回答问题哦,^_^!

#21


ToString()的时候一定要判空的

#22


Server=(local);Database=tempdb;Uid=sa ;pwd=;

rdr=cmd.ExecuteReader();
    while(rdr.Read())
    {
    comboBox1.Items.Add(rdr[1].ToString());
    } 
rdr.Close();

#1


这个算不上绑定,动态生成ComboBox的Items罢了...
如果抛出异常的位置是在cn.Open();那是连接字符串的问题(没有看到密码的设定,你的Sql Server连接密码的设定与同学的不同?)如果位置在cmd.ExecuteReader(),那是表的问题,检查一下访问权限。

#2


哦,我那个连接密码为空,我SQL数据库定义的,那面的那个代码是cmd.ExecuteReader(),出现异常,不知道怎么样检查表的访问权限呢..
高手指点下....

#3


comboBox1.Items.Add(rdr[1].ToString()); 
直接comboBox1.Items.Add(rdr[1]); 

#4


tempdb中确实有这个表吗?我怎么记得tempdb会自动清除其中的表的?

#5


comboBox1.Items.Add(new item(rdr[1].ToString())); 这样试一下

#6


四楼确实不错,会自动清除掉,但我根据老师的代码COPY过来的 马上就在SQL中建的表,马上运行,还是不能用啊,提示 rdr=cmd.ExecuteReader(); 
出现异常,都郁闷的啊,
comboBox1.Items.Add(new item(rdr[1].ToString()));这句话不能施行,生成的时候提示出错,

#7


拿你的查询语句在查询分析器中试一下看看有什么结果。

#8


select CLASSID,CLASSNAME from dbo.tCLASS 把dbo去掉。
数据库所有者 (dbo)
dbo 是具有在数据库中执行所有活动的暗示性权限的用户。将固定服务器角色 sysadmin 的任何成员都映射到每个数据库内称为 dbo 的一个特殊用户上。另外,由固定服务器角色 sysadmin 的任何成员创建的任何对象都自动属于 dbo。

例如,如果用户 Andrew 是固定服务器角色 sysadmin 的成员,并创建表 T1,则表 T1 属于 dbo,并以 dbo.T1 而不是 Andrew.T1 进行限定。相反,如果 Andrew 不是固定服务器角色 sysadmin 的成员,而只是固定数据库角色 db_owner 的成员,并创建表 T1,则 T1 属于 Andrew,并限定为 Andrew.T1。该表属于 Andrew,因为该成员没有将表限定为 dbo.T1。

无法删除 dbo 用户,且此用户始终出现在每个数据库中。

只有由 sysadmin 固定服务器角色成员(或 dbo 用户)创建的对象才属于 dbo。由任何其他也不是 syadmin 固定服务器角色成员的用户(包括 db_owner 固定数据库角色成员)创建的对象: 

属于创建该对象的用户,而不是 dbo。


用创建该对象的用户名限定

#9


各位大峡,刚才按照你们的说的做了还是不行,SQL脚本语言如下,
create table 日志表 (
   顺序号                  numeric(20)          identity ,
   操作类型                 nvarchar(20)         null,
   操作对象                 varchar(30)          null,
   操作用户                 varchar(30)        null default suser_sname(),
   操作日期                 smalldatetime      null default getdate(),
   constraint PK_日志表 primary key  (顺序号)
)

go

if exists (select 1
            from  sysobjects
           where  id = object_id('tCLASS')
            and   type = 'U')
   drop table tCLASS
go

if exists (select 1
            from  sysobjects
           where  id = object_id('tSTUDENT')
            and   type = 'U')
   drop table tSTUDENT
go

/*==============================================================*/
/* Table: tCLASS                                                */
/*==============================================================*/
create table tCLASS (
   CLASSID              numeric              not null,
   CLASSNAME            varchar(20)          null,
   constraint PK_TCLASS primary key  (CLASSID)
)
go

/*==============================================================*/
/* Table: tSTUDENT                                              */
/*==============================================================*/
create table tSTUDENT (
   STUDENTID            varchar(15)          not null,
   CLASSID              numeric              null,
   STUDENTNAME          varchar(20)          null,
   Gentle               bit                  null,
   Picture              image                null,
   constraint PK_TSTUDENT primary key  (STUDENTID)
)
go

alter table tSTUDENT
   add constraint FK_TSTUDENT_REFERENCE_TCLASS foreign key (CLASSID)
      references tCLASS (CLASSID)
go


insert into tCLASS values(1,'06可视化1班')
insert into tCLASS values(2,'06可视化2班')
insert into tCLASS values(3,'06数据库')
insert into tCLASS values(4,'06WEB1班')
insert into tCLASS values(5,'06WEB2班')
insert into tCLASS values(6,'06移动班')
go

create procedure pUptStudent 
  @StudentID varchar(30),
  @classid integer,
  @studentname varchar(30),
  @errstr varchar(80) output
 as
begin
   if @classid is null 
    begin
       select @errstr='班级编号不能为空!'
       return -1000
   end
   
   if not exists (select classname from tCLASS where CLASSID=@classid) 
    begin
      select @errstr='未找到对应的班级!'
      return -1001   /*未找到对应的班级*/
    end
    
    begin tran
      update tSTUDENT set CLASSID=@classid,STUDENTNAME=@Studentname 
             where   STUDENTID=@StudentID
      if @@rowcount=0 
       begin
   rollback tran
           select @errstr='未找到相应的学号'
           return -1002
      end

      if @@error <>0 
       begin
  rollback tran
          select @errstr='修改失败!'
          return -1003
      end

     insert into  日志表(操作类型,操作对象)   
         values('修改','tSTUDENT.'+@StudentID)

     if @@error<>0 
       begin
         rollback tran
         select @errstr='修改失败,插入日志不成功!'
         return -1004
     end
     commit tran
     return 0
end

go

各位大峡,帮我看看,究竟我那里错了,真是郁闷死了,本来对C#就不是那么了解,好不容易下定决心来学习,没想到
就那么一个多月的时间,各种各样的程序出错快把我打跨了,真是奈何不了它啊,,,,

#10


我运行了一遍没错。
1.你要弄清楚你是在哪个数据库上添加这些表的,在最sql脚本最前面加上:use tempdb;去tmpdb数据库里看看有没有你所加的表,如果没就说明你加错地方了,按下面的方式运行。记得前面加上use tempdb;
2.把现在的表全部删除,再执行Sql脚本,刷新一下数据库。找到生成的表后,在查询分析器中运行select CLASSID,CLASSNAME from dbo.tCLASS 语句,有结果一般就没问题。

3。程序没问题。是在数据库上的问题.

#11


   我都弄过了,那个USING TEMPDB 我是直接在TEMPDB里面写的,我怀疑估计是那个数据库权限问题,
有些是我拿我老师的代码来运行,也是提示出现同样的错误,但是在运行可执行文件的时候却能运行,真是
郁闷啊,不知道是什么问题,我叫我同学帮我,他们也解决不了...

#12


在查询分析器中运行select语句有返回结果?

#13


应该是connectionString的问题,跟踪调试一下就知道错在那句话了。 
再加上一句dr.close();

#14


哎,高手都到那里去了,怎么个个都不能解决问题呢,上楼的楼主,我按照你说了做了,还是不行,因为connectionString字符串没有问题,我在SQL中运行可以才复制到.NET中去的,我实在是无语,10楼的问题我早就这样做,但就是不行,没办法,烂机子,更高手的到那里去了,学生需要详解,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

#15


private void Form1_Load(object sender, System.EventArgs e) 
  { 
   SqlConnection cn =new SqlConnection("Server=(local);Database=tempdb;Uid=sa"); 
   SqlCommand cmd =new SqlCommand("select CLASSID,CLASSNAME from dbo.tCLASS",cn); 
   SqlDataReader rdr; ////这里要这样写SqlDataReader rdr=null;
   try 
   { 
    cn.Open(); 
    rdr=cmd.ExecuteReader(); 
    while(rdr.Read()) 
    { 
     comboBox1.Items.Add(rdr[1].ToString()); 
    } 
   } 
   catch(Exception ex) 
   { 
    MessageBox.Show(ex.Message); 
   } 
   finally 
   { 
    cn.Close(); 
   } 
  }  

#16


lz要干嘛?

#17


我也碰到了类似的问题。。。不过貌似是别人动了我的电脑或才出来的。。。。

#18


将 catch里面的 运行错误的messagebox显示的信息 仔细打出来给大家看
光凭你说

不知所云 也不知道你问题到底在哪

#19


引用 10 楼 hackenliu 的回复:
我运行了一遍没错。 
1.你要弄清楚你是在哪个数据库上添加这些表的,在最sql脚本最前面加上:use tempdb;去tmpdb数据库里看看有没有你所加的表,如果没就说明你加错地方了,按下面的方式运行。记得前面加上use tempdb; 
2.把现在的表全部删除,再执行Sql脚本,刷新一下数据库。找到生成的表后,在查询分析器中运行select CLASSID,CLASSNAME from dbo.tCLASS 语句,有结果一般就没问题。 

3。程序没问题。是在数据库上的问题.


如果程序没问题 就是或许是,我是说或许是

就是你在登陆sql的时候 服务器的名字MICROSOF-D7A1F9\SQLEXPRESS 和MICROSOF-D7A1F9

MICROSOF-D7A1F9这个才是local指向的服务器 你看下你的表是在哪个服务器下面的

#20


昨天晚上我也碰到了这个问题,不要在之前定义SqlDataReader,就是说把“SqlDataReader rdr; ”去掉,然后把“rdr=cmd.ExecuteReader(); ”改成“SqlDataReader rdr=cmd.ExecuteReader(); ”。
具体原因我不太记得了。
另外:这可是我第一次回答问题哦,^_^!

#21


ToString()的时候一定要判空的

#22


Server=(local);Database=tempdb;Uid=sa ;pwd=;

rdr=cmd.ExecuteReader();
    while(rdr.Read())
    {
    comboBox1.Items.Add(rdr[1].ToString());
    } 
rdr.Close();