异常详细信息: 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];
}
当时求解方法如下:
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;
}
经测试可能达到解决问题的目的






