繁体   English   中英

DataTable在WinForms中起作用,但在ASP.NET中不起作用

[英]DataTable works in WinForms but not in ASP.NET

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

抛出NullReferenceException的原因是您对GridView1引用为空。 原因可能有两个。

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

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

将代码更改为下面的代码,在断点处放置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);
  }
} 

将代码更改为此:

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

在调试器中到达GridView1.DataSource = dt; 查看dt是否为null。 这将使您能够确定问题是否出在GridView或方法上。 如果是gridview,请尝试删除EnableModelValidation并查看异常是否消失。 发布以上测试的结果,我们将帮助进一步调查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM