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

Windows编程

开发平台:

Visual C++

  1. /* example7.c */
  2. /*
  3. ** This example illustrates the use of browse mode functions to
  4. ** determine the source of result columns from ad hoc queries.
  5. */
  6. #if defined(DBNTWIN32)
  7. #include <windows.h>
  8. #endif
  9. #include <stdio.h>
  10. #include <sqlfront.h>
  11. #include <sqldb.h>
  12. void examine_results();
  13. BOOL send_command();
  14. /* Forward declarations of the error-handling and message-handling
  15. functions. */
  16. int err_handler(DBPROCESS*, int, int, int, char*, char*);
  17. int msg_handler(DBPROCESS*, DBINT, int, int, char*);
  18. main()
  19. {
  20. LOGINREC *login;
  21. DBPROCESS *dbproc;
  22. int command_count = 0;
  23. RETCODE retcode;
  24.         dbinit(); /* initialize dblib */
  25. /* Install the user-supplied error-handling and message-handling
  26. * functions. They are defined at the bottom of this source file.
  27. */
  28. dbmsghandle((DBMSGHANDLE_PROC)msg_handler);
  29. dberrhandle((DBERRHANDLE_PROC)err_handler);
  30. /* Allocate and initialize the LOGINREC structure to be used
  31. * to open a connection to SQL Server.
  32. */
  33. login = dblogin();
  34. DBSETLUSER(login, "user");
  35. DBSETLPWD(login, "my_passwd");
  36. DBSETLAPP(login, "example7");
  37. DBSETLVERSION(login, DBVER60);
  38. dbproc = dbopen(login, "my_server");
  39. /* Allow the user to type in a series of queries. This program
  40. * is terminated by the word "quit" appearing at the
  41. * beginning of the line.
  42. */
  43. while (1)
  44. {
  45. // Send a user-generated query to SQL Server.
  46. // Exit if user typed in quit.
  47. if (!send_command(dbproc))
  48. break;
  49. /* Now, examine the results of any queries the user has
  50. * typed in.
  51. */
  52. command_count = 1;
  53. while ((retcode = dbresults(dbproc)) != NO_MORE_RESULTS)
  54. {
  55. command_count++ ;
  56. if (retcode == FAIL)
  57. printf("Command %d failed.n", command_count);
  58. else
  59. {
  60. if (!(DBCMDROW(dbproc)))
  61. printf
  62. ("Command %d returned no rows.n",
  63. command_count);
  64. else
  65. {
  66. /* This is a command that can return
  67. * rows. Let's take a closer look at it.
  68. */
  69. printf("Command %d:n", command_count);
  70. examine_results(dbproc);
  71. /* Throw away all data rows. */
  72. dbcanquery(dbproc);
  73. }
  74. }
  75. }
  76. }
  77. return(STDEXIT);
  78. }
  79. void examine_results(dbproc)
  80. DBPROCESS *dbproc;
  81. {
  82. int colcount;
  83. int colnum;
  84. char fullsource[128];
  85. const char *sourcecolname;
  86. int tabcount;
  87. const char *tabname;
  88. int tabnum;
  89. /* Determine which tables were used to generate the query results.*/
  90. tabcount = dbtabcount(dbproc);
  91. printf
  92. ("The following tables were used to generate these query results:n");
  93. for (tabnum = 1; tabnum <= tabcount; tabnum++)
  94. {
  95. if ((tabname = dbtabname(dbproc, tabnum)) != NULL)
  96. printf
  97. ("t%s (%s)n", tabname,
  98. (dbtabbrowse(dbproc, tabnum)
  99. ? "browsable" : "not browsable"));
  100. }
  101. /* Determine which tables were used to generate each result column.*/
  102. colcount = dbnumcols(dbproc);
  103. printf("Here are the columns of the target list and their sources:n");
  104. printf
  105. ("t%-20s %-30s %snn",
  106. "Result column:", "Source:", "Browsable?");
  107. for (colnum = 1; colnum <= colcount; colnum++)
  108. {
  109. tabname = dbtabsource(dbproc, colnum, NULL);
  110. sourcecolname = dbcolsource(dbproc, colnum);
  111. if (tabname == NULL)
  112. strcpy(fullsource, "(result of expression)");
  113. else
  114. sprintf(fullsource, "%s.%s", tabname, sourcecolname);
  115. printf
  116. ("t%-20s %-30s %sn",
  117. dbcolname(dbproc, colnum),
  118. fullsource,
  119. (dbcolbrowse(dbproc, colnum) ? "yes" : "no"));
  120. }
  121. }
  122. BOOL send_command(dbproc)
  123. DBPROCESS *dbproc;
  124. {
  125. static char cmdbuf[2048];
  126. /* Allow the user to type in an ad hoc query. This query
  127. * is terminated by the word "go" appearing at the
  128. * beginning of the line.
  129. *
  130. * If the user types the word "quit" at the beginning of a line,
  131. * we'll quit the program.
  132. */
  133. printf("Enter SQL query (or 'quit'):n");
  134. while (1)
  135. {
  136. printf("> ");
  137. gets(cmdbuf);
  138. if (strcmp(cmdbuf, "go") == 0)
  139. {
  140. dbsqlexec(dbproc);
  141. break;
  142. }
  143. else if (strcmp(cmdbuf, "quit") == 0)
  144. {
  145. return FALSE;
  146. }
  147. else
  148. {
  149. /* Keep reading SQL commands. */
  150. dbcmd(dbproc, cmdbuf);
  151. }
  152. }
  153. return TRUE;
  154. }
  155. int err_handler(dbproc, severity, dberr, oserr, dberrstr, oserrstr)
  156. DBPROCESS *dbproc;
  157. int severity;
  158. int dberr;
  159. int oserr;
  160. char *dberrstr;
  161. char *oserrstr;
  162. {
  163.     printf("DB-LIBRARY error:nt%sn", dberrstr);
  164. if (oserr != DBNOERR)
  165. printf("Operating-system error:nt%sn", oserrstr);
  166. if ((dbproc == NULL) || (DBDEAD(dbproc)))
  167. return(INT_EXIT);
  168. return(INT_CANCEL);
  169. }
  170. int msg_handler(dbproc, msgno, msgstate, severity, msgtext)
  171. DBPROCESS *dbproc;
  172. DBINT msgno;
  173. int msgstate;
  174. int severity;
  175. char *msgtext;
  176. {
  177. printf
  178. ("SQL Server message %ld, state %d, severity %d:nt%sn",
  179. msgno, msgstate, severity, msgtext);
  180. return(0);
  181. }