2013-06-13 3 views
0

У меня следующий код читает набор данных из хранимой процедуры, а затем я сохраняю его в списке. Набор данных из хранимой процедуры работает нормально, он возвращает таблицу со значениями. Но я сохраняю исключение, сохраняя его в списке.Значение не может быть нулевым исключением

Код

public class mList 
     { 
      public DateTime Ee { get; set; } 
      public DateTime ndate { get; set; } 
      public int SNo { get; set; } 
      public int CId { get; set; } 
      public int rID { get; set; } 
     } 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
    string procName = "listest"; 
       SqlConnection conn=new SqlConnection(cs); 
       try 
       { 
        SqlDataAdapter da = new SqlDataAdapter(); 
        da.SelectCommand = new SqlCommand(procName, conn); 
        da.SelectCommand.CommandType = CommandType.StoredProcedure; 

        DataSet ds = new DataSet(); 
        da.Fill(ds); 
        ds.Tables["t0"].TableName = "Rows"; 

     List<mL> newlist = ds.Tables["t0"].AsEnumerable().Select(row => new mList 
     { 
      Ee = row.Field<DateTime?>(0).GetValueOrDefault(), 
      ndate = row.Field<DateTime?>(1).GetValueOrDefault(), 
      SNo = row.Field<int?>(2).GetValueOrDefault(), 
      CId = row.Field<int?>(3).GetValueOrDefault(), 
      rID = row.Field<int?>(4).GetValueOrDefault() 
     }).ToList(); 
    } 
} 

Исключение я получаю System.ArgumentNullException was caught, Message=Value cannot be null.

+0

Have/Можете ли вы отладку в и проверили эти значения во время выполнения? – Josh

+0

Какое определение для 'mList'? Разрешает ли NULL? –

+0

Надеюсь, вы уже проверили это (это не ясно из вашего вопроса), но таблица в вашем наборе данных действительно называется '' t0 "'? – hvd

ответ

1

мне удалось воспроизвести вашу проблему, и это выглядит как ваше имя таблицы должно быть «Ряды», а не «t0». Вы переименовываете таблицу выше в своем коде. Кто-то в комментариях уже упоминал об этом. Я заново создал ваш пример в консольном приложении и ниже работает:

Примечание: пример основан на некоторых предположениях. Ваши данные верны, что запрос возвращается на основе определения объекта mList. Я могу предположить это, потому что, если бы они не были, вы получили бы исключение литых.

class Program 
{ 
    public class mList 
    { 
     public DateTime Ee { get; set; } 
     public DateTime ndate { get; set; } 
     public int SNo { get; set; } 
     public int CId { get; set; } 
     public int rID { get; set; } 
    } 

    static void Main(string[] args) 
    { 

     DataSet ds = new DataSet(); 

     DataTable t = new DataTable("Rows"); 
     t.Columns.Add("ee", typeof(DateTime)); 
     t.Columns.Add("ndate", typeof(DateTime)); 
     t.Columns.Add("sno", typeof(int)); 
     t.Columns.Add("cid", typeof(int)); 
     t.Columns.Add("rid", typeof(int)); 

     t.Rows.Add(DateTime.Now, DateTime.Now, 0, 1, null); 
     t.Rows.Add(DateTime.Now, DateTime.Now, 2, 1, 2); 
     t.Rows.Add(DateTime.Now, DateTime.Now, 4, 1, 1); 
     t.Rows.Add(DateTime.Now, DateTime.Now, 5, 1, 1); 

     ds.Tables.Add(t); 

     //IF TABLE IS t0 - You get a null reference exception 
     List<mList> newlist = ds.Tables["Rows"].AsEnumerable().Select(row => new mList 
     { 
      Ee = row.Field<DateTime?>(0).GetValueOrDefault(), 
      ndate = row.Field<DateTime?>(1).GetValueOrDefault(), 
      SNo = row.Field<int?>(2).GetValueOrDefault(), 
      CId = row.Field<int?>(3).GetValueOrDefault(), 
      rID = row.Field<int?>(4).GetValueOrDefault() 
     }).ToList(); 
    } 

} 

Ниже приведен пример использования хранимой процедуры. Обратите внимание, что мое начальное имя таблицы - Table, а не t0.

Хранимая процедура представляет собой mockedup хранимой процедура:

CREATE PROCEDURE ListTest 
AS 
BEGIN 
    SELECT GETDATE()+1 AS EE 
      ,GETDATE()-1 AS ndate 
      ,1 AS SNo,2 AS CId,NULL AS rID 
    UNION ALL 
    SELECT GETDATE()+1 
      ,GETDATE()-1 
      ,1 ,2, 2 
    UNION ALL --TEST WITH ALL NULL VALUES 
    SELECT NULL 
      ,NULL 
      ,NULL ,NULL, NULL 
END 

Измененные консольное приложение с помощью C#:

string procName = "listtest"; 
string cs = "Data Source=server;Initial Catalog=dbname;User ID=user;Password=password;Trusted_Connection=False;"; 
SqlConnection conn=new SqlConnection(cs); 

SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = new SqlCommand(procName, conn); 
da.SelectCommand.CommandType = CommandType.StoredProcedure; 

DataSet ds = new DataSet(); 
da.Fill(ds); 
ds.Tables["Table"].TableName = "Rows"; 

List<mList> newlist = ds.Tables["Rows"].AsEnumerable().Select(row => new mList 
{ 
    Ee = row.Field<DateTime?>(0).GetValueOrDefault(), 
    ndate = row.Field<DateTime?>(1).GetValueOrDefault(), 
    SNo = row.Field<int?>(2).GetValueOrDefault(), 
    CId = row.Field<int?>(3).GetValueOrDefault(), 
    rID = row.Field<int?>(4).GetValueOrDefault() 
}).ToList(); 
+0

Код выглядит нормально, но он не заполняет данные из хранимой процедуры, как в моем коде. Я получаю данные из хранимой процедуры –

Смежные вопросы