DataTable在WinForms中工作,但在ASP.NET中不工作

时间:2010-05-28 10:32:54

标签: c# asp.net sqlite gridview datatable

我创建了一个返回数据表的类,当我在c#winform中使用该类时,使用以下代码正确填充了dataGridView

DataTable dt = dbLib.GetData();
if (dt != null)
{
  dataGridView1.DataSource = dbLib.GetData();
}

然而,当我尝试使用ASP.NET时,我得到了一个

  

对象引用未设置为对象的实例。

使用以下代码

DataTable dt = dbLib.GetData();
if (dt != null)
{
  GridView1.DataSource = dt;
  GridView1.DataBind();
}

dbLib类GetData2可以证明它不是由SQlite或数据引起的

public static DataTable GetData()
{
  SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db");
  SQLiteCommand cmd = new SQLiteCommand("SELECT count(Message) AS Occurrences, Message FROM evtlog GROUP BY Message ORDER BY Occurrences DESC LIMIT 25", cnn);
  cnn.Open();
  SQLiteDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
  DataTable dt = new DataTable();
  dt.Load(dr);
  return dt;
}

public static DataTable GetData2()
{
  DataTable dt = new DataTable();
  dt.Columns.Add(new DataColumn("Occurrences", typeof(string)));
  dt.Columns.Add(new DataColumn("Message", typeof(string)));

  DataRow dataRow = dt.NewRow();
  dataRow["Occurrences"] = "1";
  dataRow["Message"] = "a";
  dt.Rows.Add(dataRow);
  return dt;
}

asp代码

<asp:GridView ID="GridView1" runat="server">
  <Columns>
    <asp:BoundField DataField="Occurrences" HeaderText="Occurrences"></asp:BoundField>
    <asp:BoundField DataField="Message" HeaderText="Message"></asp:BoundField>
  </Columns>
</asp:GridView>

4 个答案:

答案 0 :(得分:1)

抛出NullReferenceException因为您对GridView1有空引用。这可能是由于几个原因引起的。

  1. 您正试图在Asp.net Page Life cycle的错误位置访问GridView1。可能在页面的构造函数中?如果是这种情况,将逻辑移至PageLoad将解决您的问题。
  2. 标记页面(.aspx)与页面后面的代码(.aspx.cs / .aspx.designer.cs)不同步,导致GridView1永远不会被实例化。如果是这种情况,最好的选择是从标记中删除gridview并重新添加它。

答案 1 :(得分:0)

它可能取决于asp.net web.config中不存在的连接字符串。很难说,因为我们实际上无法看到你的dbLib做了什么。

答案 2 :(得分:0)

将代码更改为下面,在行throw new Exception("Error in GetData()", ex);上添加一个断点,让我们知道实际的异常是什么。我怀疑ASPNET工作进程帐户没有权利打开你的数据库。

public static DataTable GetData() 
{ 
  try
  {
    SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db"); 
    SQLiteCommand cmd = new SQLiteCommand("SELECT count(Message) AS Occurances, Message FROM evtlog GROUP BY Message ORDER BY Occurances DESC LIMIT 25", cnn); 
    cnn.Open(); 
    SQLiteDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    DataTable dt = new DataTable(); 
    dt.Load(dr); 
    return dt; 
  }
  catch (Exception ex)
  {
    throw new Exception("Error in GetData()", ex);
  }
} 

答案 3 :(得分:0)

将您的代码更改为:

DataTable dt = dbLib.GetData();
GridView1.DataSource = dt;
GridView1.DataBind();

在调试器中,当您到达GridView1.DataSource = dt;时,请查看dt是否为空。这将允许您确定问题是GridView还是方法。如果是gridview,请尝试删除EnableModelValidation并查看异常是否消失。发布上述测试的结果,我们将进一步调查。