在查询打开一个查询数据的页面时,经常会出现如下错误,然后重新刷新一下又可以正常获得数据(即使是在没有其他用户使用的情况下也会出现),发现就是在查询这个表时才会出现这样的错误,其他表还没有发现错误。调试时没有发现任何提示错误。
System.Exception: 数据查询失败!ExecuteTable查询语句为: SELECT TOP 10 * FROM (select * from [topicview] where t_id>0 and c_name='Flash课外知识' and t_enable=1) AS T ORDER BY t_addtime desc ---> System.NullReferenceException: Object reference not set to an instance of an object. at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values) at System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values) at System.Data.ProviderBase.SchemaMapping.LoadDataRow() at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping) at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at OLC.DAL.Database.ExecuteTable(CommandType cmdType, String cmdText, SqlParameter[] commandParameters) --- End of inner exception stack trace
ExcuteTable语句如下:
/// <summary> /// 获得一个表名为result数据表 /// </summary> /// <param name="cmdType">CommandType枚举</param> /// <param name="cmdText">命令字符串</param> /// <param name="commandParameters">命令参数</param> /// <returns>一个表名为Result的DataTable </returns> public DataTable ExecuteTable(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { DataTable result = new DataTable(); try { SqlCommand cmd = new SqlCommand(); cmd.CommandTimeout = 60; PrepareCommand(cmd,cmdType, cmdText, commandParameters); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(result); } catch (Exception ex) { throw new Exception("数据查询失败!ExecuteTable查询语句为:" + cmdText, ex); } return result; }
PrepareCommand?
Object reference not set to an instance of an object
NullReferenceException 未将对象应用到实例,调试一下,看看哪个引用对象为null
我怎么没有发现SqlConnection对象呢?
我一般都是这样写的。
public List<Iw_UserEntity> GetList(string sql) { List<Iw_UserEntity> item = new List<Iw_UserEntity>(); using (SqlConnection con = new SqlConnection(constr)) { using (SqlCommand com = new SqlCommand(sql, con)) { DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(com); da.Fill(dt); if (dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { DataRow dr = dt.Rows[i]; item.Add(new Iw_UserEntity { ID = Convert.ToInt32(dr["ID"]), ba = Convert.ToString(dr["ba"]), Names = Convert.ToString(dr["Names"]), pass = Convert.ToString(dr["pass"]), sex = Convert.ToInt32(dr["sex"]), sexstr = Convert.ToInt32(dr["sex"]) == 1 ? "女" : "男", age = DateTime.Now.Year - Convert.ToDateTime(dr["ba"]).Year }); } } } } return item; }
SqlConnection这个肯定是要有的。数据查询中,其他页是没有问题的,只是在查这一页的时候才会出现这样的错误
@过期的风子:
你的错误主要是 System.NullReferenceException,你进入调试模式一下子就可以发现那个对象为空啦。
你这一个是公共的方法吧!
那样你就检查一下你传递进来的参数
不用 Adaptor.Fill 换成 DataReader 试试吧。 Fill有时会有类型转换的错误。