DataTable работает в WinForms, но не в ASP.NET - PullRequest
0 голосов
/ 28 мая 2010

Я создал класс, который возвращает таблицу данных, когда я использую класс в winform c #, 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 ]

1 голос
/ 28 мая 2010

NullReferenceException выбрасывается, потому что у вас нулевая ссылка на GridView1. Это может быть вызвано несколькими причинами.

  1. Вы пытаетесь получить доступ к GridView1 в неправильной точке жизненного цикла страницы Asp.net . Возможно, в конструкторе страницы? В этом случае перемещение логики в PageLoad решит вашу проблему.
  2. Страница разметки (.aspx) не синхронизирована с кодом, стоящим за страницей (.aspx.cs / .aspx.designer.cs), в результате чего GridView1 никогда не создается Если это так, то лучшим вариантом будет удалить вид сетки из разметки и добавить его заново.
0 голосов
/ 28 мая 2010

измените код на ниже, поставьте точку останова на строке 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);
  }
} 
0 голосов
/ 28 мая 2010

Измените свой код на это:

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

В отладчике, когда вы достигнете GridView1.DataSource = dt;, посмотрите, является ли dt нулевым. Это позволит вам определить, связана ли проблема с GridView или методом. Если это вид сетки, попробуйте удалить EnableModelValidation и посмотреть, исчезнет ли исключение. Опубликуйте результаты вышеуказанных тестов, и мы поможем вам продолжить расследование.

0 голосов
/ 28 мая 2010

Вероятно, это зависит от строки подключения, которой нет в вашем asp.net web.config. Трудно сказать, потому что мы не можем на самом деле увидеть, что делает ваша dbLib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...