异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:
行 27 : ... {
行 28: DataRow SmallClassName =DBOperate.GetDataRow("select * from Small_Class where SmallClass_ID="+SmallClass_ID,"Small_Class","DBConnection");
行 29: return SmallClassName["SmallClass_ID"].ToString();
行 30: }
行 31 : }
源文件: c:InetpubwwwrootTragramMiniWebTragMiniApp_CodeNavigation.cs 行: 29
堆栈跟踪:
[NullReferenceException: 未将对象引用设置到对象的实例。]
TangramMiniWeb.Navigation.GetSmallClassName(Int32 SmallClass_ID) in c:InetpubwwwrootTragramMiniWebTragMiniApp_CodeNavigation.cs: 29
TangramMiniWeb.pith.Page_Load(Object sender, EventArgs e) in c:InetpubwwwrootTragramMiniWebTragMini anpith.aspx.cs: 132
System.Web.UI.Control.OnLoad(EventArgs e) + 99
System.Web.UI.Control.LoadRecursive() + 47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) + 1061
它的源码:
public static string GetBigClassName( int BigClass_ID)
... {
DataRow BigClassName =DBOperate.GetDataRow("select * from Big_Class where BigClass_ID="+BigClass_ID,"Big_Class","DBConnection");
return BigClassName["BigClass_ID"].ToString();
}
public static string GetSmallClassName( int SmallClass_ID)
... {
DataRow SmallClassName =DBOperate.GetDataRow("select * from Small_Class where SmallClass_ID="+SmallClass_ID,"Small_Class","DBConnection");
return SmallClassName["SmallClass_ID"].ToString();-------此句有问题,就是它测试不过去的?????????
}
用到的数据库的表为:
CREATE TABLE [dbo].[Small_Class](
[SmallClass_Id] [ int ] IDENTITY( 1 , 1 ) NOT NULL,
[BigClass_Id] [ int ] NULL,
[SmallClass_Name] [nvarchar]( 255 ) COLLATE Chinese_PRC_CI_AS NULL,
[Enable] [ int ] NULL,
[Memo] [nvarchar]( 255 ) COLLATE Chinese_PRC_CI_AS NULL
primary key ([SmallClass_Id])
)
public static DataRow GetDataRow( string sql, string TableName, string dbname)
... {
SqlConnection sqlConnection = new SqlConnection(strCon);
SqlDataAdapter sqlAdapter1 = new SqlDataAdapter(sql, sqlConnection);
DataSet product = new DataSet();
sqlAdapter1.Fill(product, TableName);
return product.Tables[0].Rows.Count == 0 ? null : product.Tables[0].Rows[0];
}
源错误:
行 27 : ... {
行 28: DataRow SmallClassName =DBOperate.GetDataRow("select * from Small_Class where SmallClass_ID="+SmallClass_ID,"Small_Class","DBConnection");
行 29: return SmallClassName["SmallClass_ID"].ToString();
行 30: }
行 31 : }
源文件: c:InetpubwwwrootTragramMiniWebTragMiniApp_CodeNavigation.cs 行: 29
堆栈跟踪:
[NullReferenceException: 未将对象引用设置到对象的实例。]
TangramMiniWeb.Navigation.GetSmallClassName(Int32 SmallClass_ID) in c:InetpubwwwrootTragramMiniWebTragMiniApp_CodeNavigation.cs: 29
TangramMiniWeb.pith.Page_Load(Object sender, EventArgs e) in c:InetpubwwwrootTragramMiniWebTragMini anpith.aspx.cs: 132
System.Web.UI.Control.OnLoad(EventArgs e) + 99
System.Web.UI.Control.LoadRecursive() + 47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) + 1061
它的源码:
public static string GetBigClassName( int BigClass_ID)
... {
DataRow BigClassName =DBOperate.GetDataRow("select * from Big_Class where BigClass_ID="+BigClass_ID,"Big_Class","DBConnection");
return BigClassName["BigClass_ID"].ToString();
}
public static string GetSmallClassName( int SmallClass_ID)
... {
DataRow SmallClassName =DBOperate.GetDataRow("select * from Small_Class where SmallClass_ID="+SmallClass_ID,"Small_Class","DBConnection");
return SmallClassName["SmallClass_ID"].ToString();-------此句有问题,就是它测试不过去的?????????
}
用到的数据库的表为:
CREATE TABLE [dbo].[Small_Class](
[SmallClass_Id] [ int ] IDENTITY( 1 , 1 ) NOT NULL,
[BigClass_Id] [ int ] NULL,
[SmallClass_Name] [nvarchar]( 255 ) COLLATE Chinese_PRC_CI_AS NULL,
[Enable] [ int ] NULL,
[Memo] [nvarchar]( 255 ) COLLATE Chinese_PRC_CI_AS NULL
primary key ([SmallClass_Id])
)
public static DataRow GetDataRow( string sql, string TableName, string dbname)
... {
SqlConnection sqlConnection = new SqlConnection(strCon);
SqlDataAdapter sqlAdapter1 = new SqlDataAdapter(sql, sqlConnection);
DataSet product = new DataSet();
sqlAdapter1.Fill(product, TableName);
return product.Tables[0].Rows.Count == 0 ? null : product.Tables[0].Rows[0];
}
当时求解方法如下:
1 .主要是引用没有实例为空所造成的。
应该是那个查询语句 select * from Small_Class where SmallClass_ID = " +SmallClass_ID, " Small_Class " , " DBConnection " 返回一个NULL,使得
DataRow SmallClassName = null了。
我把select * from Small_Class where SmallClass_ID = " +SmallClass_ID放入SQL2005中进行测试,但这个
SmallClass_ID是外来的变量,所以我只能这样写了
delcare @SmallClass_ID int
select * from Small_Class where SmallClass_ID = @SmallClass_ID
结果数据正常,为了再具体点我取了个具体的值
select * from Small_Class where SmallClass_ID = 1结果出现一行数据。
可以证明我在SQL方面的语句是没有问题的。
2 .SmallClassName可能没有得到值SmallClassName[ " SmallClass_ID " ]就会出错.
断点看SmallClassName是否能得到值.没得到那就是DBOperate.GetDataRow(...)有问题了.
SmallClassName = DBOperate.GetDataRow( " select * from Small_Class where SmallClass_ID= " + SmallClass_ID, " Small_Class " , " DBConnection " );
GetSmallClassName( 1 ) 经过测试发现这使程序进入死循环中,问题为空还没有解决。
我思维回归到了 public static DataRow GetDataRow( string sql, string TableName, string dbname)
... {
SqlConnection sqlConnection = new SqlConnection(strCon);
SqlDataAdapter sqlAdapter1 = new SqlDataAdapter(sql, sqlConnection);
DataSet product = new DataSet();
sqlAdapter1.Fill(product, TableName);
return product.Tables[0].Rows.Count == 0 ? null : product.Tables[0].Rows
}
这样子就把return product.Tables[ 0 ].Rows.Count == 0 ? null : product.Tables[ 0 ].Rows改为原来的
return product.table[ 0 ].rows.count or
return product.table[ 0 ].rows.count = 0
return product.table[ 0 ].rows[ 0 ][ 0 ]
return product.table[ 0 ].rows[ 0 ]
这样子都不行的。
3 . int a = return product.table[ 0 ].row.count
console.writeline( " s " );
但这样子也没有返回值。
并那问题依然存在。这种方法也不对。
1 .主要是引用没有实例为空所造成的。
应该是那个查询语句 select * from Small_Class where SmallClass_ID = " +SmallClass_ID, " Small_Class " , " DBConnection " 返回一个NULL,使得
DataRow SmallClassName = null了。
我把select * from Small_Class where SmallClass_ID = " +SmallClass_ID放入SQL2005中进行测试,但这个
SmallClass_ID是外来的变量,所以我只能这样写了
delcare @SmallClass_ID int
select * from Small_Class where SmallClass_ID = @SmallClass_ID
结果数据正常,为了再具体点我取了个具体的值
select * from Small_Class where SmallClass_ID = 1结果出现一行数据。
可以证明我在SQL方面的语句是没有问题的。
2 .SmallClassName可能没有得到值SmallClassName[ " SmallClass_ID " ]就会出错.
断点看SmallClassName是否能得到值.没得到那就是DBOperate.GetDataRow(...)有问题了.
SmallClassName = DBOperate.GetDataRow( " select * from Small_Class where SmallClass_ID= " + SmallClass_ID, " Small_Class " , " DBConnection " );
GetSmallClassName( 1 ) 经过测试发现这使程序进入死循环中,问题为空还没有解决。
我思维回归到了 public static DataRow GetDataRow( string sql, string TableName, string dbname)
... {
SqlConnection sqlConnection = new SqlConnection(strCon);
SqlDataAdapter sqlAdapter1 = new SqlDataAdapter(sql, sqlConnection);
DataSet product = new DataSet();
sqlAdapter1.Fill(product, TableName);
return product.Tables[0].Rows.Count == 0 ? null : product.Tables[0].Rows
}
这样子就把return product.Tables[ 0 ].Rows.Count == 0 ? null : product.Tables[ 0 ].Rows改为原来的
return product.table[ 0 ].rows.count or
return product.table[ 0 ].rows.count = 0
return product.table[ 0 ].rows[ 0 ][ 0 ]
return product.table[ 0 ].rows[ 0 ]
这样子都不行的。
3 . int a = return product.table[ 0 ].row.count
console.writeline( " s " );
但这样子也没有返回值。
并那问题依然存在。这种方法也不对。
An unhandled exception of type 'System.StackOverflowException' occurred in App_Code.ovf-vfb-.dll
怎么会出现这超出栈的错误呀
那是死循环的原因。
4
.
我的思维再次回到为空的问题上。
代码为:
public static string GetSmallClassName( int SmallClass_ID)
... {
DATAROW SmallClassName = DBOperate.GetDataRow("select * from Small_Class where SmallClass_ID=" + SmallClass_ID, "Small_Class", "DBConnection");
return SmallClassName["SmallClass_ID"].ToString();
}
既然return SmallClassName[ " SmallClass_ID " ].ToString();为空,那就要判断下SmallClassName是否为空。
DataRow smallClass_ID
SmallClassName = DBOperate.GetDataRow( " select * from Small_Class where SmallClass_ID= " + SmallClass_ID, " Small_Class " , " DBConnection " );
return SmallClassName[ " SmallClass_ID " ].ToString
这个不这是不行,但只有判断下了
DataRow smallClass_ID = null ;
SmallClassName = DBOperate.GetDataRow( " select * from Small_Class where SmallClass_ID= " + SmallClass_ID, " Small_Class " , " DBConnection " );
if (smallClass_ID == null )
... {
return smallClassName["smallClass_ID"].ToString();
}
else
... {
return null;
}
经测试可能达到解决问题的目的
我的思维再次回到为空的问题上。
代码为:
public static string GetSmallClassName( int SmallClass_ID)
... {
DATAROW SmallClassName = DBOperate.GetDataRow("select * from Small_Class where SmallClass_ID=" + SmallClass_ID, "Small_Class", "DBConnection");
return SmallClassName["SmallClass_ID"].ToString();
}
既然return SmallClassName[ " SmallClass_ID " ].ToString();为空,那就要判断下SmallClassName是否为空。
DataRow smallClass_ID
SmallClassName = DBOperate.GetDataRow( " select * from Small_Class where SmallClass_ID= " + SmallClass_ID, " Small_Class " , " DBConnection " );
return SmallClassName[ " SmallClass_ID " ].ToString
这个不这是不行,但只有判断下了
DataRow smallClass_ID = null ;
SmallClassName = DBOperate.GetDataRow( " select * from Small_Class where SmallClass_ID= " + SmallClass_ID, " Small_Class " , " DBConnection " );
if (smallClass_ID == null )
... {
return smallClassName["smallClass_ID"].ToString();
}
else
... {
return null;
}
经测试可能达到解决问题的目的