|
|
|
SQLBulkOperations with Long Data
|
|||
|---|---|---|---|
|
#18+
Тема SQLBulkOperations вопрос есть табличка Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. с обычными типами проблем не возникает. А вот с этими беда. strData text, binData image Я уже задолбался. Читал в msdm Providing Long Data for Bulk Inserts and Updates, если честно я там не могу понять идеологию и последовательность вызовов. Как - то странно там это описывается. Или я тупой. Помогите плиз примерчиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 20:46 |
|
||
|
SQLBulkOperations with Long Data
|
|||
|---|---|---|---|
|
#18+
Делаю примерно следующее: Код: plaintext 1. 2. 3. 4. 5. 6. Код: 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. Если второй столбец убрать из таблички и из запроса. и убрать из кода SQLBindCol для второй колонки то все работает замечательно. И очень быстро. Может кто-то делал что-то подобное и найдет здесь концептуальную ошибку? И вообще буду признателен за любую информацию, связанную с использованием SQLBulkOperations с длинными типами данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2004, 13:22 |
|
||
|
SQLBulkOperations with Long Data
|
|||
|---|---|---|---|
|
#18+
Концептуальных ошибок нет. вот работающий, правда на информиксе пример всем спасибо за участие, может кому нибудь пригодиться этот опыт Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2004, 09:10 |
|
||
|
SQLBulkOperations with Long Data
|
|||
|---|---|---|---|
|
#18+
Огромное Спасиба за предоставленный код. Разобравшись, я наконец то написал рабочие функции, которые сохраняют большой объем двоичной информации в поле image таблицы на SqlServer'ной базе. typedef std::vector<float> tDataType; BOOL _sql_UpdateRecords(int ID, tDataType &Target, SQLINTEGER strLen_or_indPtr) { //распределяем описатель запроса sqlRet = SQLAllocHandle(SQL_HANDLE_STMT,hDBConn, &hSTMT); if(isSUCCESS(hSTMT, SQL_HANDLE_STMT) != TRUE) return FALSE; char sqlRequest[333]; sprintf(sqlRequest,"UPDATE RecordsData SET Data = ? WHERE ID = %d",ID); #define MAX_DATA_LEN Target.size() #define MAX_BUFFER_LEN MAX_DATA_LEN sqlRet = SQLPrepare(hSTMT,(SQLCHAR*)sqlRequest,SQL_NTS); if(isSUCCESS(hSTMT, SQL_HANDLE_STMT) != TRUE) return FALSE; strLen_or_indPtr = SQL_DATA_AT_EXEC; sqlRet = SQLBindParameter(hSTMT,1,SQL_PARAM_INPUT,SQL_C_BINARY,SQL_LONGVARBINARY, SQL_DESC_LENGTH,0,(SQLPOINTER)1,sizeof(float),&strLen_or_indPtr); // ColumnSize = SQL_DESC_LENGTH sqlRet = SQLExecute(hSTMT); SQLPOINTER pToken; SQLINTEGER bBatch = MAX_BUFFER_LEN; SQLINTEGER bLeftData;//задать if(sqlRet == SQL_NEED_DATA){ sqlRet = SQLParamData(hSTMT,&pToken); while(sqlRet == SQL_NEED_DATA) { PFLOAT pData = (FLOAT*)&Target[0];//*/Data; bLeftData = MAX_DATA_LEN; while(bLeftData > bBatch){ //здесь SQLPutData(hSTMT,pData,bBatch); pData += bLeftData; bLeftData -= bBatch; } SQLPutData(hSTMT,pData,bLeftData); sqlRet = SQLParamData(hSTMT,&pToken); } } //отвязываем параметры sqlRet = SQLFreeStmt(hSTMT,SQL_RESET_PARAMS); if(!isSUCCESS(hSTMT, SQL_HANDLE_STMT))return FALSE; //освобождаем наш описатель запроса sqlRet = SQLFreeHandle(SQL_HANDLE_STMT,hSTMT); return isSUCCESS(hSTMT, SQL_HANDLE_STMT); } BOOL isSUCCESS(SQLHANDLE sqlHandle, SQLSMALLINT sqlHandleType) { strcpy(sqlRetMessage,""); if(sqlRet != SQL_SUCCESS) { SQLCHAR SqlState[6]; SQLINTEGER NativeError; SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH]; int i = 1; char ErrSmall[555]; SQLRETURN diagRet = 0; if(sqlRet >= -1) while(SQLGetDiagRec(sqlHandleType, sqlHandle, i,SqlState,&NativeError,ErrMsg,sizeof(ErrMsg),NULL) != SQL_NO_DATA) { sprintf(ErrSmall,"\nDIAG: %d,\n SQLSTATE: %s,\n NativeError: %d,\n ErrMsg: %s\n\n",i,SqlState,NativeError,ErrMsg); i++; //Далее происходит следующее //строчка из ErrSmall добавляется в sqlRetMessage strcpy(sqlRetMessage,ErrSmall); } if(sqlRet != SQL_SUCCESS_WITH_INFO) return FALSE; } return TRUE; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2005, 15:50 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=406&tid=2033322]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 332ms |

| 0 / 0 |
