【问题标题】:DataTable works in WinForms but not in ASP.NETDataTable 在 WinForms 中有效,但在 ASP.NET 中无效
【发布时间】:2010-05-28 10:32:53
【问题描述】:

我创建了一个返回数据表的类,当我在 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>

【问题讨论】:

  • @charles 你能发帖GetData() 方法吗..
  • 您是否在 gridview 的标记上正确声明了 BoundFields? programming.top54u.com/post/…
  • @mamoo 我是 ASP.NET 的新手,你能扩展你所说的吗?谢谢
  • @charles:您的标记(您的 asp.net 页面)中应该有一个或多个 标签内的 标签。此标签(在您的情况下)指的是您的 DataTable 列。也许有什么问题......你能发布你的 asp.net 标记吗?
  • 你在哪里运行这段代码?在 asp.net 生命周期的哪个阶段?

标签: c# asp.net sqlite gridview datatable


【解决方案1】:

NullReferenceException 被抛出,因为您有一个对 GridView1 的空引用。这可能是由几个原因造成的。

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

【讨论】:

  • 我给你打分,这是因为我的 gridview 使用了错误的 aspx 代码
【解决方案2】:

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

【讨论】:

  • 出于测试目的,dblib 执行连接和查询并返回数据表类型。我这样做是为了证明该库在 c# 中工作,而不是在 asp.net 中工作
【解决方案3】:

将代码更改为下面,在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);
  }
} 

【讨论】:

  • GetData 不会抛出异常,异常是在调用代码中抛出的。该库也适用于 c#,它返回一个数据表,它适用于 ASP.NET,调试时,我可以看到 dt 对象已填充。但只是为了确保我确实按照你的建议做了,但我认为不是图书馆失败了。
【解决方案4】:

将您的代码更改为:

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

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

【讨论】:

  • 我添加了“if (dt != null)”子句,dt 不为空。我删除了 EnableModelValidation 标签,但仍然是同样的错误。
  • 在asp.net WORKS中将数据表绑定到gridviews,这里肯定有更多的事情发生,例如SQLiteDataReader正在以某种方式创建一个狡猾的数据表。尝试将网格视图绑定到您手动创建的表格,其中一行和一列包含一段简单的文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多