源代码如下:问题出在 foreach (DataRow row in dsRead.Tables[0].Rows)这句话上,出现的问题如下所示:
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 行 57: //DataRow row = null;
行 58:
行 59: foreach (DataRow row in dsRead.Tables[0].Rows)
行 60: {
行 61: 源文件: e:\softbak\experimentmanage修改后\experimentmanage\open_experiment\teacher\get_data_from_excel.aspx.cs 行: 59 堆栈跟踪: [NullReferenceException: 未将对象引用设置到对象的实例。]
open_experiment_teacher_get_data_from_excel.SubmitBtn_Click(Object sender, ImageClickEventArgs e) in e:\softbak\experimentmanage修改后\experimentmanage\open_experiment\teacher\get_data_from_excel.aspx.cs:59
System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) +75
System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +115
System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4919
----------下面是源代码----------
public partial class open_experiment_teacher_get_data_from_excel : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.Session["xueyuan_id"] = "03";
this.Session["lab_id"] = "0302";
}
} private static int getMaxID(String xueyuan_id, String lab_id)
{
SqlDataReader sdr = BigdaddySP.SelectSomethingNoPageWithWhere_SqlDataReader("V_getMaxProjectID", "xueyuan_id='" + xueyuan_id + "' and lab_id='" + lab_id + "'");
if (sdr.Read())
{
return Convert.ToInt32(sdr["max_id"].ToString());
}
sdr.Close();
return 0;
}
private static String computeProjectID(int id)
{
String str = Convert.ToString(id);
if (str.Length == 1)
return "000" + str;
else if (str.Length == 2)
return "00" + str;
else if (str.Length == 3)
return "0" + str;
else if (str.Length == 4)
return str;
else return "0000";
}
protected void SubmitBtn_Click(object sender, ImageClickEventArgs e)
{
//tecselclassid,name,url,_time ViewState["excel_name"] = excel_name.Text;
DataSet dsRead= CreateDataSource(ViewState["excel_name"].ToString());
//DataRow row = null;
------------------------------------
foreach (DataRow row in dsRead.Tables[0].Rows)//???????????
--------------------------------
{ int pro_id=getMaxID(this.Session["xueyuan_id"].ToString(),this.Session["lab_id"].ToString())+1;
int iRet = 0;
SqlParameter[] prams = {
DataBase.MakeInParam("@id", SqlDbType.Int, 4,row["id"].ToString()),
DataBase.MakeInParam("@name", SqlDbType.VarChar, 50,row["姓名"].ToString()),
DataBase.MakeInParam("@type", SqlDbType.VarChar, 50,row["type"].ToString()),
DataBase.MakeInParam("@request", SqlDbType.VarChar, 50,row["请求"].ToString()),
DataBase.MakeInParam("@xueyuan_id", SqlDbType.VarChar, 2,this.Session["xueyuan_id"].ToString()),
DataBase.MakeInParam("@lab_id", SqlDbType.VarChar, 4,this.Session["lab_id"].ToString()),
DataBase.MakeInParam("@project_id", SqlDbType.VarChar, 4,computeProjectID(pro_id))
};
iRet = DataBase.RunProcInsert("insert_project", prams);
if (iRet > 0)
{
message.Text = "<script>this.alert('信息提交成功.')</script>";
}
else
{
message.Text = "<script>this.alert('信息提交失败.')</script>";
}
}
DataSet ds = BigdaddySP.SelectSomethingNoPageWithWhere_DataSet("open_project", "1=1");
list.DataSource = ds.Tables[0].DefaultView;
list.DataBind();
//Databind();
} public static DataSet CreateDataSource(string Src)
{
try
{
string strConn; strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + Src + ";" +
"Extended Properties=\"Excel 8.0;IMEX=1;\"";//连接 OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); string tableName = schemaTable.Rows[0][2].ToString().Trim();//得到excel表名 OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [" + tableName + "]", strConn);//查找excel数据 DataSet myDataSet = new DataSet();//定义数据 myCommand.Fill(myDataSet); conn.Close(); return myDataSet;
}
catch
{
return null;
}
}}
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 行 57: //DataRow row = null;
行 58:
行 59: foreach (DataRow row in dsRead.Tables[0].Rows)
行 60: {
行 61: 源文件: e:\softbak\experimentmanage修改后\experimentmanage\open_experiment\teacher\get_data_from_excel.aspx.cs 行: 59 堆栈跟踪: [NullReferenceException: 未将对象引用设置到对象的实例。]
open_experiment_teacher_get_data_from_excel.SubmitBtn_Click(Object sender, ImageClickEventArgs e) in e:\softbak\experimentmanage修改后\experimentmanage\open_experiment\teacher\get_data_from_excel.aspx.cs:59
System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) +75
System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +115
System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4919
----------下面是源代码----------
public partial class open_experiment_teacher_get_data_from_excel : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.Session["xueyuan_id"] = "03";
this.Session["lab_id"] = "0302";
}
} private static int getMaxID(String xueyuan_id, String lab_id)
{
SqlDataReader sdr = BigdaddySP.SelectSomethingNoPageWithWhere_SqlDataReader("V_getMaxProjectID", "xueyuan_id='" + xueyuan_id + "' and lab_id='" + lab_id + "'");
if (sdr.Read())
{
return Convert.ToInt32(sdr["max_id"].ToString());
}
sdr.Close();
return 0;
}
private static String computeProjectID(int id)
{
String str = Convert.ToString(id);
if (str.Length == 1)
return "000" + str;
else if (str.Length == 2)
return "00" + str;
else if (str.Length == 3)
return "0" + str;
else if (str.Length == 4)
return str;
else return "0000";
}
protected void SubmitBtn_Click(object sender, ImageClickEventArgs e)
{
//tecselclassid,name,url,_time ViewState["excel_name"] = excel_name.Text;
DataSet dsRead= CreateDataSource(ViewState["excel_name"].ToString());
//DataRow row = null;
------------------------------------
foreach (DataRow row in dsRead.Tables[0].Rows)//???????????
--------------------------------
{ int pro_id=getMaxID(this.Session["xueyuan_id"].ToString(),this.Session["lab_id"].ToString())+1;
int iRet = 0;
SqlParameter[] prams = {
DataBase.MakeInParam("@id", SqlDbType.Int, 4,row["id"].ToString()),
DataBase.MakeInParam("@name", SqlDbType.VarChar, 50,row["姓名"].ToString()),
DataBase.MakeInParam("@type", SqlDbType.VarChar, 50,row["type"].ToString()),
DataBase.MakeInParam("@request", SqlDbType.VarChar, 50,row["请求"].ToString()),
DataBase.MakeInParam("@xueyuan_id", SqlDbType.VarChar, 2,this.Session["xueyuan_id"].ToString()),
DataBase.MakeInParam("@lab_id", SqlDbType.VarChar, 4,this.Session["lab_id"].ToString()),
DataBase.MakeInParam("@project_id", SqlDbType.VarChar, 4,computeProjectID(pro_id))
};
iRet = DataBase.RunProcInsert("insert_project", prams);
if (iRet > 0)
{
message.Text = "<script>this.alert('信息提交成功.')</script>";
}
else
{
message.Text = "<script>this.alert('信息提交失败.')</script>";
}
}
DataSet ds = BigdaddySP.SelectSomethingNoPageWithWhere_DataSet("open_project", "1=1");
list.DataSource = ds.Tables[0].DefaultView;
list.DataBind();
//Databind();
} public static DataSet CreateDataSource(string Src)
{
try
{
string strConn; strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + Src + ";" +
"Extended Properties=\"Excel 8.0;IMEX=1;\"";//连接 OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); string tableName = schemaTable.Rows[0][2].ToString().Trim();//得到excel表名 OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [" + tableName + "]", strConn);//查找excel数据 DataSet myDataSet = new DataSet();//定义数据 myCommand.Fill(myDataSet); conn.Close(); return myDataSet;
}
catch
{
return null;
}
}}
if(ds.Tables[0].Rows.Count > 0)//遍历前先确保rows有值
{
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{ }
}
{
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{ }
}
DataSet ds= CreateDataSource(ViewState["excel_name"].ToString());
list.DataSource = ds.Tables[0].DefaultView;
list.DataBind();
然后在aspx页面里设置相应的表格显示list里的数据都是很正常的,为什么同样的createdatasource语句,在使用foreach的时候就出现null的结果,为什么?
{
MessageBox.Show(ex.ToString());//看看这里的信息
return null;
}
1. 同意jiatong1981(末日之痕),这是个典型的错误,你的dataset为null,以后一定要加上
if(ds != null && ds.Tables[0].Rows.Count > 0这些话,保证程序的容错性。
2. 我当时excel表格是打开着的,这个难道导致了错误???
应该是的,你的Excel.exe进程打开的时候未必允许oledb的链接。我经常遇到此类情况,但是你程序跑起来以后,再去打开Excel不会有问题。