SQLCURS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*************************************************************************
  2. PROGRAM: SQLCURS - SQL DB-Library cursors sample program
  3.  Copyright (c), 1995 by Microsoft Corp.
  4. *************************************************************************/
  5. #if defined(DBNTWIN32)
  6. #include <windows.h>
  7. #endif
  8. #include <sqlfront.h>
  9. #include <sqldb.h> /* DBLIB header files (should always be included    */
  10. #include <stdio.h>
  11. #include <conio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #ifndef NULL
  15. #define     NULL    0
  16. #endif
  17. #define INVALID_VALUE (short)-100
  18. /* Forward declarations of the error handler and message handler. */
  19. int err_handler(DBPROCESS*, int, int, int, char*, char*);
  20. int msg_handler(DBPROCESS*, DBINT, int, int, char*);
  21. void ProcessResults(void);
  22. #define NROWS     5 /* Number of rows to be scrolled at a time   */
  23. /* Select statement to be used in the cursor case */
  24. char stmt[] = " select au_lname, au_fname, city, state from authors where contract = 1 ";
  25. /* Status array, and results set */
  26. DBINT     pstat[NROWS];
  27. char     au_lname[NROWS][41];
  28. char     au_fname[NROWS][21];
  29. char     au_city[NROWS][21];
  30. char     au_state[NROWS][3];
  31. DBINT     au_citlen[NROWS];
  32. DBINT     au_statlen[NROWS];
  33. DBINT     au_fnamlen[NROWS];
  34. char     *stats[NROWS];
  35. char     values[250];
  36. short     ScrollOpt;
  37. short     ConcurOpt;
  38. int       ch;
  39. main ()
  40. {
  41. DBPROCESS *dbproc; /* allocate a DB-LIB process structure */
  42. LOGINREC  *login; /* allocate a DB-LIB login structure */
  43. DBCURSOR  *hcursor; /* allocate a DB-LIB cursor structure */
  44. char       Servername[21] = "";
  45. RETCODE    result_code;
  46. int     fetch, optype;
  47. int     nrow;
  48. char    sfetch[3], soptype[3];
  49. char    srow[3], stab[31];
  50. /* Install the user-supplied error-handling and message-handling
  51.  * routines. They are defined at the bottom of this source file.
  52.  */
  53. dberrhandle((DBERRHANDLE_PROC)err_handler);
  54. dbmsghandle((DBMSGHANDLE_PROC)msg_handler);
  55. /* Get server's computer name */
  56. printf ("nEnter Name of SQL Server: ");
  57. gets (Servername);
  58. ScrollOpt = INVALID_VALUE;
  59. do 
  60. {
  61. printf ("nEnter Scroll Option: F)orward  K)eyset  D)ynamic  I)nsensitive: ");
  62. ch = tolower(_getch());
  63. switch (ch)
  64. {
  65. case 'f': ScrollOpt = CUR_FORWARD; break;
  66. case 'k': ScrollOpt = CUR_KEYSET;  break;
  67. case 'd': ScrollOpt = CUR_DYNAMIC; break;
  68. case 'i': ScrollOpt = CUR_INSENSITIVE; break;
  69. default:  printf("Invalid character entered."); break;
  70. }
  71. } while (ScrollOpt == INVALID_VALUE);
  72. ConcurOpt = INVALID_VALUE;
  73. do 
  74. {
  75. printf ("nEnter Concurrency Option: R)ead Only   L)ock CC   O)opt CC   V)al Opt CC: ");
  76. ch = tolower(_getch());
  77. switch (ch)
  78. {
  79. case 'r': ConcurOpt = CUR_READONLY; break;
  80. case 'l': ConcurOpt = CUR_LOCKCC;   break;
  81. case 'o': ConcurOpt = CUR_OPTCC;    break;
  82. case 'v': ConcurOpt = CUR_OPTCCVAL; break;
  83. default:  printf("Invalid character entered."); break;
  84. }
  85. } while (ConcurOpt == INVALID_VALUE);
  86. printf("n");
  87. login = dblogin();     /* get login record from DB-LIB */
  88. DBSETLUSER (login, (char far *)"sa");     /* set the username */
  89. DBSETLAPP (login, (char far *)"curtest"); /* set the application name */
  90. DBSETLPWD (login, (char far *)"");       /* set the SQL Server password */
  91. DBSETLVERSION(login, DBVER60);
  92. /* Now attempt to create and initialize a DBPROCESS structure */
  93. if((dbproc = dbopen (login, Servername)) == NULL)
  94. {
  95. printf ("dbopen failedn");
  96. return (1); /* exit program */
  97. }
  98. dbuse (dbproc, "pubs");  /* use the "pubs" database */
  99. /* Open the cursor */
  100. hcursor = dbcursoropen(dbproc, stmt, ScrollOpt, ConcurOpt, NROWS, pstat);
  101. if (hcursor == (DBCURSOR *)NULL)
  102. {
  103. printf("ndbcursoropen failedn");
  104. return(1);
  105. }
  106. /* Bind variables */
  107. result_code = dbcursorbind(hcursor, 1, NTBSTRINGBIND, 41, NULL, (char *)au_lname);
  108. if (result_code == FAIL)
  109. {
  110. printf("ndbcursorbind failed, column 1n");
  111. return(1);
  112. }
  113. result_code = dbcursorbind(hcursor, 2, NTBSTRINGBIND, 21, au_fnamlen, (char *)au_fname);
  114. if (result_code == FAIL)
  115. {
  116. printf("ndbcursorbind failed, column 2n");
  117. return(1);
  118. }
  119. result_code = dbcursorbind(hcursor, 3, NTBSTRINGBIND, 21, au_citlen, (char *)au_city);
  120. if (result_code == FAIL)
  121. {
  122. printf("ndbcursorbind failed, column 3n");
  123. return(1);
  124. }
  125. result_code = dbcursorbind(hcursor, 4, NOBIND, 0, au_statlen, (char *)stats);
  126. if (result_code == FAIL)
  127. {
  128. printf("ndbcursorbind failed, column 4n");
  129. return(1);
  130. }
  131. /* Begin transaction. Will exit without committing the transaction so that
  132. ** none of the data modifications will actually be committed */
  133. if ((dbcmd(dbproc, "begin transaction") == FAIL) ||
  134. (dbsqlexec(dbproc) == FAIL) || (dbresults(dbproc) == FAIL))
  135. {
  136. printf("n BEGIN TRAN failed");
  137. return(1);
  138. }
  139. /* Now fetch and print the rows */
  140. while (TRUE)
  141. {
  142. printf("n0)Leave  1)First  2)Next  3)Previous  4)Random  5)Relative  6)Last  7)By Value");
  143. printf("nEnter fetch value: ");
  144. fetch = atoi(gets(sfetch));
  145. if (fetch != 0)
  146. {
  147. if ((fetch == FETCH_RANDOM) || (fetch == FETCH_RELATIVE))
  148. {
  149. printf("n Enter row number: ");
  150. nrow = atoi(gets(srow));
  151. }
  152. else
  153. nrow = 0;
  154. if (dbcursorfetchex(hcursor, fetch, nrow, NROWS, 0) == FAIL)
  155. printf("ndbcursorfetchex() failedn");
  156. ProcessResults();
  157. continue; /* Fetch again */
  158. }
  159. /* Do updates */
  160. while (TRUE)
  161. {
  162. printf("n0)Leave  1)Update  2)Delete  3)Insert  4)Refresh  5)Lock  6)Cursor Fetch");
  163. printf("nEnter operation: ");
  164. optype = atoi(gets(soptype));
  165. if ((optype == 0) || (optype == 6)) /* Exit condition */
  166. break;
  167. if (optype > 6)
  168. continue;
  169. printf("nEnter buffer number: ");
  170. nrow = atoi(gets(srow));
  171. printf("nEnter table: ");
  172. gets(stab);
  173. printf("nEnter values: ");
  174. gets(values);
  175. if (values == (char *)NULL)
  176. values[0] = '';
  177. if ((result_code=dbcursor(hcursor, optype, nrow, stab, values)) == FAIL)
  178. printf("n dbcursor failed");
  179. else
  180. if (optype == CRS_REFRESH)
  181. ProcessResults();
  182. else
  183. printf("ndbcursor() succeeded");
  184. } /* Exit dbcursor() loop */
  185. if (optype == 0)
  186. break;    /* Close cursor */
  187. }
  188. dbcursorclose(hcursor);
  189. dbexit();
  190. }
  191. void ProcessResults()
  192. {
  193. int i, len;
  194. printf(" Row       First Name                 Last Name                City       Staten");
  195. printf("----- -------------------- ------------------------------ --------------- -----n");
  196. for (i = 0 ; i < NROWS ; i++)
  197. { /* Process results */
  198. if(pstat[i] & FTC_SUCCEED)
  199. {
  200. len = 0;
  201. if (au_statlen[i] != 0) /* This is a NOBIND type */
  202. {
  203. len = min(2, (SHORT)au_statlen[i]);
  204. memcpy(au_state[i], stats[i], len);
  205. }
  206. au_state[i][len] = '';
  207.    printf("%5d %-20s %-30s %-15s %-2sn",i+1,au_fname[i],au_lname[i],au_city[i],au_state[i]);
  208. }
  209. else
  210. if (pstat[i] &  FTC_MISSING)
  211. printf("n Row no. %d is missing", i+1);
  212. /*
  213. The following code could be used if dbcursorfetch()
  214. was used instead of dbcursorfetchex().
  215. if (pstat[i] & FTC_ENDOFRESULTS)
  216. {
  217. printf("n End of results");
  218. break;
  219. }
  220. if (pstat[i] & FTC_ENDOFKEYSET)
  221. {
  222. printf("nEnd of keyset");
  223. break;
  224. }
  225. */
  226. }
  227. return;
  228. }
  229. int err_handler(dbproc, severity, dberr, oserr, dberrstr, oserrstr)
  230. DBPROCESS *dbproc;
  231. int  severity;
  232. int  dberr;
  233. int  oserr;
  234. char     *dberrstr;
  235. char     *oserrstr;
  236. {
  237. printf("DB-LIBRARY error:nt%sn", dberrstr);
  238. if (oserr != DBNOERR)
  239. printf("Operating-system error:nt%sn", oserrstr);
  240. if ((dbproc == NULL) || (DBDEAD(dbproc)))
  241. return(INT_EXIT);
  242. else
  243. {
  244. return(INT_CANCEL);
  245. }
  246. }
  247. int msg_handler(dbproc, msgno, msgstate, severity, msgtext)
  248. DBPROCESS *dbproc;
  249. DBINT  msgno;
  250. int  msgstate;
  251. int  severity;
  252. char     *msgtext;
  253. {
  254. printf("SQL Server message %ld, state %d, severity %d:nt%sn",
  255. msgno, msgstate, severity, msgtext);
  256. return(0);
  257. }