c # SqlDataReader База данных хранится guid или ноль - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть две записи в базе данных: запись 1 и запись 2. Хранилище данных вернет значение guid для записи 1, и код работает нормально.Но на записи 2 читатель вернется "".У меня вопрос, как я могу добавить String Empty без исключения, оба варианта оба ошибки.Немедленный выигрыш

?dataReader["Id"].GetType().FullName
"System.Guid"

Код

while (dataReader.Read())
{
d.id = new Guid(dataReader["Id"].ToString());
//Guid.TryParse(dataReader["Id"]?.ToString(), out d.Id)
}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я вижу это:

?dataReader["Id"].GetType().FullName
"System.Guid"

, а также это:

в записи 2, для чтения данных будет возвращено ""

Эти две вещинесовместимыЯ подозреваю, что у вас действительно есть столбец Guid, а запись 2 возвращает NULL, который, в свою очередь, отображается как DBNull.Value в считывателе, и вызов .ToString() для результата DBNull.Value приводит к пустой строке, которую вы наблюдаетездесь.

Если это правда, вы можете сделать это:

while (dataReader.Read())
{
    if (dataReader["Id"] != DBNull.Value)
    {
        d.id = (Guid)dataReader["Id"];
    }
    else
    {
        //get an empty string
    }
}

Теперь проблема в том, что else блок.Вопрос гласит:

Как добавить String Empty без исключения

Ответ: Вы не можете .C # является строго типизированным языком, и мы уже видели, что свойство d.id является System.Guid. Вы не можете поместить колышек в форме строки в отверстие в форме Guid. Вы должны оставить это поле пустым или определить какое-либо значение Guid по умолчанию, чтобы оно оставалось пустым, а затем изменить код в другом месте.чтобы отобразить пустую строку, а не Guid, значение соответствует выбранному по умолчанию.

0 голосов
/ 14 ноября 2018

Всегда полезно предвидеть все возможные случаи:

Guid guid;

if(dataReader.HasRows)
{
    while(dataReader.Read()) 
    {
        if(dataReader["Id"].Equals(DBNull.Value)==false)
        {
            var sid = dataReader["Id"].ToString();
            if(sid.Length > 0 && Guid.TryParse(sid, out guid))
            {
                d.id = guid;
            }
        }
    }
}

Если вам часто приходится это делать, напишите вспомогательную библиотечную функцию для задачи.

В зависимости от базового типа столбца базы данных, вы можете упростить. Для вероятного примера uniqueidentifier в MS SQL Server он будет уменьшен до:

if(dataReader["Id"].Equals(DBNull.Value) == false)
{
    d.id = Convert.ToGuid(dataReader["Id"]);
}

потому что в этом случае не может быть несоответствия типов, если есть ненулевое значение.

...