2016-01-17 2 views
1
if (_dt.Rows.Count > 0) 
      { 
       foreach (DataRow row in _dt.Rows) 
       { 
        pUsername = row["tUsername"] == DBNull.Value ? " " : row["tUsername"].ToString(); 
        pDomain = row["tDomain"] == DBNull.Value ? " " : row["tDomain"].ToString(); 
        pStatus = row["tStatus"] == DBNull.Value ? 0 : Convert.ToInt32(row["tStatus"].ToString()); 
        // pAdmin = (bool)row["tInstallType"]; 
       } 
      } 

Как я могу читать разные типы из datatable? Нужно ли мне каждый раз переходить к строке? , Почему я не могу читать как целое число из базы данных? Я думаю, что главная проблема заключается в row["tStatus"].ToString()Чтение из данных различных типов

+0

О, и ** спасибо ** для допроса, что 'Convert.ToInt32 (строка [ "Минт"]. ToString())' безумием. Слишком много начинающих разработчиков просто копируют этот стиль из плохих интернет-уроков и книг, не понимая, что это просто * неправильно *. – Heinzi

ответ

2

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

int myInt = row.Field<int>("myInt"); 

int? myNullableInt = row.Field<int?>("myNullableInt"); // NULL (DB) -> null (C#) 

int myInt = row.Field<int?>("myNullableInt") ?? 0;  // NULL (DB) -> 0 (C#) 

Это использует новый метод DataRowExtensions.Field введенного с .net 3.5. Очевидно, что это не ограничивается int s, но работает для всех примитивных типов C# и их нулевых копий. Обратите внимание, что в отличие от индексатора Field возвращает null для значений NULL базы данных, а не DBNull.Value.

+1

Это по сравнению с этим - победа "http://stackoverflow.com/questions/425389/c-sharp-equivalent-of-sql-server-datatypes" – t3choo

0

Существует общий метод расширения DataRow.Field, поэтому в вашем примере для pUsername вы могли бы сделать:

string pUsername = row.Field<string>("tUsername"); 

и

int? pStatus = row.Field<int?>("tStatus") 

Какие имо, намного чище, а также.

0

Существует Field методы расширения языка DataRow.

Пример

foreach (DataRow row in dt.Rows) 
{ 
    Console.WriteLine("{0} - {1}",row.Field<string>("FirstName"), row.Field<int?>("SomeIntField")); 
}