2013-11-18 3 views
0

Я прочитал данные из моей хранимой процедуры. Когда я вставить точку останова Я получаю эту ситуацию:Как получить данные из хранимой процедуры в SQL Server

enter image description here

Хранимая процедура возвращает одну строку с 8 столбцов. Вы можете видеть это на картинке. Но когда я пытаюсь читать одно значение:

var post_id = reader[4].ToString(); 

Я получил это исключение:

недействительная попытка читать, когда нет данных нет.

Моя модель:

public class Alarm 
{ 
    public long Id { get; set; } 
    public DateTime StartDate { get; set; } 
    public int Snoozes { get; set; } 
    public bool Repeat { get; set; } 
    public DateTime AlarmUpdateTime { get; set; } 

    public virtual User User { get; set; } 
    public virtual List<FacebookNotificationStatus> StatusUpdates { get; set; } 
} 

public class FacebookStatusUpdate 
{ 
    public long Id { get; set; } 
    public DateTime FacebookUpdateTime { get; set; } 
    public string PostId { get; set; } 
    public DateTime? FacebookPostTime { get; set; } 
    public DateTimeOffset ClientTime { get; set; } 
    public int Offset { get; set; } 

    public virtual FacebookNotificationStatus Status { get; set; } 
    public virtual Alarm Alarm { get; set; } 
} 

Может кто-нибудь мне помочь?

ответ

2

после выполнения command.ExecuteReader() Вы можете цикл по данным с следующий код (только образец):

var rdr = command.ExecuteReader(); 
while(rdr.Read()) 
{ 
    var obj = new MyClass(); 
    obj.Id = (int)rdr["Id"]; 
    if (rdr["Name"] != DBNull.Value) 
    { 
    obj.name = (string)rdr["Name"]; 
    } 
} 
rdr.Close(); 

этот образец считывает все данные неправдоподобные из БД строка за строкой.

Также не забудьте прочитать читать SqlDataReader manual для получения дополнительной информации, как работать с читателями.

+0

Спасибо большое !!! – Oleh

2

Перед чтением записей необходимо позвонить reader.Read().

Пример:

String column1=""; 
String column2=""; 
while(reader.Read()) 
    { 
     column1 = reader["column1"].ToString(); 
     column2 = reader["column2"].ToString(); 
    } 
+0

И вам нужно зациклиться, пока 'reader.Read() == true', чтобы получить все записи. –

+0

Я отредактировал свой ответ :) –

+0

@Oleh: Вы приветствуете :), я рад помочь вам. –

1

Работа со всеми тонкостями ADO.NET не увлекательна; честно говоря, я подозреваю, что вы могли бы найти его проще использовать что-то вроде «щеголеватый», которая позволяет:

using(var conn = ...) 
{ 
    return conn.Query<FacebookStatusUpdate>("GetPostList"), 
     commandType: CommandType.StoredProcedure).ToList(); 
} 

(при условии, что имена столбцов являются прямым соответствие с именами собственности на FacebookStatusUpdate)

И для прохождение параметров:

string region = ... 
DateTime minDate = ... 
using(var conn = ...) 
{ 
    return conn.Query<FacebookStatusUpdate>("GetPostList"), 
     new { region, minDate }, 
     commandType: CommandType.StoredProcedure).ToList(); 
} 
+0

не может решить символ 'Query' – Oleh

+0

@Oleh нуждается в ["dapper"] (http://www.nuget.org/packages/dapper) –

+0

Он работает, но не сохраняет отношения. У меня есть одна таблица Alarm и FacebookStatusUpdate. Таким образом, FBSU включает идентификатор Alarm. Когда я использую запрос в поле Alarm, я получил null – Oleh

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