2013-11-17 7 views
0

я называю процедуру магазина в C# результатов:получить двойное значение из результата запроса

0.033333 
0.550000 
0.133333 
24.133333 

В моем C# коде мне нужно проверить, какой из них является высоким, чем 24. Как я могу получить двойной преобразовать запрос результат для этого?

Вот мой код:

sqlConnection con2 = conec.ObtenerCon(); 
SqlCommand com2 = new SqlCommand("ind_meta", con2); 
com2.CommandType = System.Data.CommandType.StoredProcedure; 
com2.Parameters.Add("@finicial", SqlDbType.DateTime); 
com2.Parameters["@finicial"].Value = Convert.ToDateTime(fini + " " + hini); 
com2.Parameters.Add("@ffinal", SqlDbType.DateTime); 
com2.Parameters["@ffinal"].Value = Convert.ToDateTime(ffin + " " + hfin); 

DataTable ds1 = new DataTable(); 

using (SqlDataAdapter a1 = new SqlDataAdapter(com2)) 
{ 
    a1.Fill(ds1); 
}        

foreach (DataRow dsRow1 in ds1.Rows) 
{ 
    if (double.Parse(dsRow1[0].ToString(), NumberStyles.Currency) < 24) 
      a++; 
    if (double.Parse(dsRow1[0].ToString(), NumberStyles.Currency) > 24 && 
double.Parse(dsRow1.ToString(), NumberStyles.Currency) < 48) 
      b++; 
if (double.Parse(dsRow1[0].ToString(), NumberStyles.Currency) > 48) 
    c++; 
} 
+0

Почему вы разбора строк, если вы могли бы бросить его прямо на 'double'? Например: 'double value = dsRow1.Field (0)' –

+0

Я предполагаю, что ваш код не делает то, что вы хотите его сделать? Что * это * он делает? Сообщалось о любых ошибках? Результат отличается от того, что вы ожидаете? В чем проблема? –

+0

Не работает ошибка об конвертации, результатом запроса является получение: dateiff (date1, date2)/60. – user2901626

ответ

1

Я предполагаю, что вы не преобразовать двойное значение в строку в базе данных, так что вам не нужно, чтобы преобразовать его в строку в C# ни. Вам просто нужно бросить его соответствующим образом.

double value = dsRow1.Field<double>(0); 

Так полный цикл:

foreach (DataRow dsRow1 in ds1.Rows) 
{ 
    double value = dsRow1.Field<double>(0); 
    if (value < 24) 
     a++; 
    else if (value >= 24 && value < 48) 
     b++; 
    else 
     c++; 
} 

Edit: "Это не работает ошибка составляет около преобразования, запрос: DateDiff (date1, date2)/60"

DATEDIFF имеет три аргумента, поэтому ваш код может вызвать синтаксическую ошибку. Но я предполагаю, что вы используете его с datepart аргументом, например, часы:

DATEDIFF(hh, date1,date2)/60 

Это целое подразделение, поскольку DATEDIFF возвращает целое число. Целочисленные деления всегда приводят к целому числу, десятичная часть усекается. Вы должны бросить одну сторону до числа с плавающей точкой:

SELECT DATEDIFF(mi, GetDate(),DATEADD(dd,1,GetDate()))/CAST(60 AS DECIMAL(9,2)) 

Теперь вы можете бросить его decimal:

foreach (DataRow dsRow1 in ds1.Rows) 
{ 
    decimal value = dsRow1.Field<decimal>(0); 
    if (value < 24) 
     a++; 
    else if (value >= 24 && value < 48) 
     b++; 
    else 
     c++; 
} 

Однако, зачем вам это нужно разделить на 60 на всех? Это звучит так, как будто вы хотите получить часы от минут. Тогда вы могли бы использовать правильный datepart в первую очередь:

DATEDIFF(hh, GetDate(),DATEADD(dd,1,GetDate())) 
+0

Не работает ошибка об конвертации, результат запроса: getiff (date1, date2)/60 – user2901626

+0

@ user2901626: Я отредактировал свой ответ. –

+0

Я делю через 60, потому что мне нужно знать часы и минутусы, но все вместе, пример 8:30 = 8.50 – user2901626

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