Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
28.05.2004, 16:02
|
|||
|---|---|---|---|
|
|||
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
В базе на MSSQL2000 есть табличка с одним из полей с типом DateTime. Табличка уже заполнена, и все значения приведены к виду 12:30:00, то есть только время, дата отброшена, и сервер позволяет такое. А вот для С# это посто немыслимо!! Ему обязательно надо засунуть в это поле еще и дату! Причем какую-нить левую типа 30.12.1899. То есть если я создаю датаадаптер к этой табличке (визардом), генерирую им датасет, то в датасете появится поле с типом System.DateTime. Соответствующие параметры в командах датаадаптера тоже требуют этот тип. Из всего этого вытекают следующие проблемы: 1. При отображении в гриде мы увидим: 30.12.1899, а время - фиг. Эту проблему тут уже вроде как решили в теме "В Ацессе одно, в Гриде другое! Где вилы?" (/topic/82233&hl=datetime), с помощью DataGridTableStyle. 2. Даже если мы и будем в гриде отображать только время, в датасете всеравно будет лежать полная версия вместе с днем, месяцем и годом. И как только мы сделаем Update или Insert - датаадаптер вставит в базу полную версию, то есть получим чтото типа: 28.05.2004 12:30:00! А мне этого в базе совсем не хочется. Как с этим бороться?? (с пунктом 2) В той теме автор вроде как юзал OleDbType.DBTimeStamp для oleDbUpdateCommand1.Parameters. Но у меня sqlDataAdapter и MSSQL2000, и при генерации датасета адаптер автоматически выставляет тип DateTime! То есть SelectCommand заполняет датасет типом Datetime. А если у UpdateCommand поменять тип параметра на любой отличный от DateTime то сразу будет ошибка преобразования типа, ведь мы его заставляем из датасета взять тип DateTime, а в базу записать его как другой. Я просто в тупике, как быть то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.05.2004, 16:05
|
|||
|---|---|---|---|
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
я бы необращал внимание на C# и обработал сохранение Даты сохраненкой в которой T-SQLем дата была приведена в нужный мне формат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.05.2004, 17:36
|
|||
|---|---|---|---|
|
|||
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
Честно говоря не хотелось бы лезть в базу и вносить там какие-то изменения, а хотелось бы все решить на уровне приложения, не затрагивая базу. Неужели нет решения? Если так, то можно поподробнее насчет хранимых процедур - мне нужно будет полностью весь датаадаптер создавать на основе процедур? И вообще как это будет выглядеть. Ведь когда создаешь адаптер визардом, то там три варианта: - на основе SQL запроса - на основе новой процедуры - на основе уже существующей процедуры какой выбирать? Понятно что если третий то в базе нужно самому создать процедуры для всех 4 команд -select, delete, insert и update. А где именно указывать обработчик для даты? Я так понимаю нужна процедура которая бы преобразовывала DateTime в что-то типа 12:30:00, и которую можно было бы использовать в качестве UpdateCommand для sqlDataAdaptera. Можно показать примерно как это все будет выглядеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.05.2004, 18:05
|
|||
|---|---|---|---|
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
Ой. Значится так. Если Вы пишите более менее мощное приложение, то переходите на insert ... Update.... Delete таблиц через сохраненку. Потому как работая через сохраненку можно максимальное количество логики при insert update delete перенести на сервер. Это позволит при необходимости менять логику не трогая клиена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.05.2004, 18:23
|
|||
|---|---|---|---|
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
Вот например сохраненка на insert update b delete (на select совсем необязательно делать сохраненку) 90% логики в сохраненке. сразу после слова AS можно написать код который обработает дату к нужному Вам формату. Во вторых и от клинта независеть будете. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.05.2004, 11:28
|
|||
|---|---|---|---|
|
|||
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
Ок. Взял для примера малюсенькую табличку где 2 поля - ROW_ID и ROW_TIME. В этом ROW_TIME пусть лежат значения вида 12:30:00, типа DateTime. Задача - показать юзеру табличку и дать изменить поле ROW_TIME. Естесственно в датасете они превратятся в 30.12.1899 12:30:00. Ладно, с выводом без года месяца и дна разберемся. Но надо не дать сохранить в базе эту бяку. Только 12:30:00. Если создать датаадаптер визардом, и указать чтоб он сам сгенерировал процедуры на основе данной таблички получим вот что: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. Если правильно - можно примерчик на SQL, иначе я опять проковыряюсь весь день :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.05.2004, 22:00
|
|||
|---|---|---|---|
|
|||
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
Как же жестоко я ошибался! Особенно когда говорил что вот типа С# такой нехороший, вставляет в поле со временем еще и левую дату. А MSSQL то ничем не лучше!! Разница лишь в том что C# вставляет 30.12.1899 а MSSQL - может 30.12.1899 или 1900-01-01. Бред какой-то. Они че все сговорились? А ошибался я потому как забивал базу ручками в SQL Server Manager, и если там ввести в поле с датой 0:00 - то он сделает вид что все схавал, и покажет только 0:00, а сам в базу засунет: 1899-12-30 00:00:00.000! То есть это у него "побочный эффект" типа такой, если дата равна 1899-12-30, то можно ее и не показывать. :( И какие бы селекты не делали он будет в упор врать что в строчках чистые 0:00, без дат. Если же сделать select в Query Analyzer, тут то все и всплывает - он все по честному показывает - 1899-12-30 00:00:00.000. Кстати если забивать табличку прямо в Query Analyzer, то он вставляет уже 1900-01-01, а не 30.12.1899 как SQL Server Manager. И при выводе этих строк сразу же высвечиваются даты. Взял я тут с местного фака способ Отрезать время от даты и дату от даты-времени. Округлить дату и вставил его для пробы в свою InsertProcedure, вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ROW_ID = 20, ROW_TIME = 0:00 Далее происходит следущее: - грид передает 0:00 датасету - у датасета это поле типа DateTime => он его конвертит в свои любимые 30.12.1899 0:00:00 - датаадаптер передает параметр @ROW_TIME хранимой процедуре - хп получает параметр и конвертит его в внутреннюю переменную @time тоже типа DateTime, но, по обещаниям автора, с отрезанной датой, то есть 0:00 - и тут строчка: Код: plaintext Она берет эти 0:00 и вновь "наращивает" их уже до 1900-01-01 0:00:00 :( Таким образозом получается что не существует способа хранить в поле типа DateTime "чисто" время, без дат :( И если вы видите где-либо 0:00 - знайте, вас жестоко обманывают. Причем это касается как дотнета так и sql server. Если я ошибаюсь - срочно докажите мне обратное, или я облажаюсь на защте проекта :) Я во всем этом бы не ковырялся, если бы у меня в ТЗ не было строчки Код: plaintext Код: plaintext Где ваши комментарии, знатоки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.05.2004, 22:24
|
|||
|---|---|---|---|
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
>Если я предложу хранить дату в виде char, меня не поймут :) >Таким образозом получается что не существует способа хранить в поле типа DateTime "чисто" время, без дат :( Имено, в таких случаях хранить время, в char. Ведь в MS SQL нет типа time, а DateTime вам не подходит. Причем в MS SQL два типа datetime: BOL datetime Date and time data from January 1, 1753 through December 31, 9999, to an accuracy of one three-hundredth of a second (equivalent to 3.33 milliseconds or 0.00333 seconds). Values are rounded to increments of .000, .003, or .007 seconds, as shown in the table. smalldatetime Date and time data from January 1, 1900, through June 6, 2079, with accuracy to the minute. smalldatetime values with 29.998 seconds or lower are rounded down to the nearest minute; values with 29.999 seconds or higher are rounded up to the nearest minute. Хотя может стоит пересмотреть свою инфо-логическую модель, пока не понятно для чего вам чистое время без даты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.05.2004, 22:55
|
|||
|---|---|---|---|
|
|||
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
Проблема в том что мое приложение лишь для редактирования данных, формат базы определяется не им, а главным приложением, которе эти данные использует для своей работы. И я не могу менять формат бд, хотя начинаю подозревать что без этого никак. То главное приложение возможно тоже еще на стадии разработки, иначе там всплыла бы такая же проблема как и у меня. Остается 2 варианта: 1. Оставить тип поля datetime, но на всех стадиях обеспечить одинаковый "прирост даты" - либо везде 30.12.1899, либо 01.01.1900. Для приложения важно лишь абсолютное (не имеющее отношение к текущему)время в часах в интервале от 0:00 до примерно 12:00. И в принципе если сравнивать 30.12.1899 12:00 и например 30.12.1899 6:00, то это будет так же как если бы сравнивали просто 12:00 и 6:00. Но если же сравнивать 01.01.1900 12:00 и 30.12.1899 6:00 то результат совершенно другой. 2. Настаивать на хранении в виде char. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.05.2004, 07:49
|
|||
|---|---|---|---|
Как отучить C# вставлять 30.12.1899? |
|||
|
#18+
>Оставить тип поля datetime, но на всех стадиях обеспечить одинаковый "прирост даты" - либо везде 30.12.1899, либо 01.01.1900. Для приложения важно лишь абсолютное (не имеющее отношение к текущему)время в часах в интервале от 0:00 до примерно 12:00. И в принципе если сравнивать 30.12.1899 12:00 и например 30.12.1899 6:00, то это будет так же как если бы сравнивали просто 12:00 и 6:00. Но если же сравнивать 01.01.1900 12:00 и 30.12.1899 6:00 то результат совершенно другой ИМХО Если интересует только время, то использование типа поля DateTime избыточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=20&tablet=1&tid=1439092]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
16ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 408ms |

| 0 / 0 |
