2010-10-06 6 views
1

Я пытаюсь вернуть содержимое файла AS/400 обратно в DataGridView .NET WinForms, привязанный к данным (VS 2010). Сам запрос не представляет проблемы, и я могу связать все, используя свойство DataSource сетки. Данные возвращаются без проблем.Связывание столбцов DATE/TIME/TIMESTAMP с таблицами DATE/TIME/TIMESTAMP в DataGridView WinForms

Проблема в том, что все поля даты/времени возвращаются как строковые литералы, что делает невозможным сортировку. Более того, он возвращается с использованием стандартных форматов AS/400 по умолчанию (yyyy-dd-mm и hh.mm.ss). Я бы хотел, чтобы они вернулись в качестве фактических полей Date/Time, чтобы их можно было отсортировать, и я могу управлять выходным форматом (я бы предпочел MM/dd/yyyy и hh: mm: ss AMPM). Я попытался объединить два поля в один, используя формат TIMESTAMP, но это просто дало мне комбинированную строку.

Я бы хотел, чтобы это было возможно, если бы это было возможно, и я хотел бы сохранить таблицу данных для удобства кодирования, хотя, если мне нужно отключить автогенерацию столбцов, я сделаю это. Я также хотел бы избежать выполнения каких-либо промежуточных запросов LINQ, поскольку я теряю возможность сортировать по столбцам из коробки (и примеры, которые я видел в Интернете для добавления этого обратно, являются длительными и болезненными).

Может ли кто-нибудь предложить что-нибудь? Благодаря!

EDIT: Пример кода. SQL для запроса значения (с имена изменены, чтобы защитить невинного) является:

SELECT MYDATE, MYTIME, TIMESTAMP(MYDATE, MYTIME) 
FROM LIBNAME.FILENAME 
WHERE <blah blah blah> 

SQL запрос получает записывается в DataTable с помощью команды OleDbDataAdapter.Fill.

Dim myTable as New DataTable 
Using adapter As New OleDbDataAdapter 
    adapter.SelectCommand = New OleDbCommand(<sql statement>, <AS/400 Connection>) 
    adapter.Fill(myTable) 
    Return myTable 
End Using 

DataTable забивается в DataGridView:

grid.DataSource = FunctionCallToGrabTheDataAbove 

Довольно простой (и пытается сохранить его таким образом, если это возможно)

+0

Можете ли вы предоставить некоторый код, как вы это делаете? Это поможет ответить на вопрос. –

+0

Хорошая точка. Отредактировано, чтобы включить некоторый базовый код. –

ответ

1

Дело в том, что поля AS/400 datetime в основном являются Строковые литералы. По крайней мере, это то, на что они похожи, когда вы проверяете физические файлы на AS/400. Пока они находятся в обычном порядке метки времени, то есть YYYY.MM.DD.hh.mm.ss, они являются сортируемыми и сопоставимыми (друг с другом).

Если это не удовлетворяет вашим потребностям, вам придется массировать поля или выполнять другие промежуточные шаги самостоятельно.

+0

И это в значительной степени то, что я закончил делать. Я обрезал миллисекунды с конца и назвал это хорошим. Это не поле, которое будет использоваться так много, поэтому все ручные работы, чтобы сделать его сортируемым и форматируемым, как дата .NET, просто не стоили того. Благодаря! –

1

Я думаю, что вы будете иметь, чтобы ввести столбец DataGridView может интерпретироваться как дату вместо строк. Если вы не можете сделать это с помощью DB2 SQL, вы можете добавить новый столбец даты в datatable.

+0

Да, ты, наверное, прав. Элементы управления DataBound великолепны и облегчают жизнь, но они как бы разбиваются, когда вы идете в тайный мир AS/400. Благодаря! –

2

Попробуйте следующее:

SELECT MYDATE, 
     MYTIME, 
     TIMESTAMP(CHAR(MYDATE,ISO)||'-'||CHAR(MYTIME,ISO)) 
FROM LIBNAME.FILENAME 
WHERE <blah blah blah> 
Смежные вопросы