Форум программистов, компьютерный форум CyberForum.ru

C++ ODBC MS SQL SERVER - C++ COM

Войти
Регистрация
Восстановить пароль
 
Arguleon
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 1
13.10.2016, 23:17     C++ ODBC MS SQL SERVER #1
Всем доброго времени суток, пытаюсь разобраться как подключится к MS SQL через ODBC. Есть ли книги по данной теме или простой рабочий пример где подключаются к базе MyBase и выгружают от туда данные из таблицы test.Field("Name")?

Добавлено через 22 часа 41 минуту
C++
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
#include <sql.h>
#include <sqlext.h>
#include <sqlex>
 
SQLHENV henv;
SQLHDBC hdbc;
 
//------------------------------------------------------------------------------
// Подключение к базы данных
 
void dbConnect(const char* addr) {
  SQLRETURN  retcode;
 
  retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 
0);
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
      retcode = SQLAllocHandle(SQL_HANDLE_DBC, (void*)henv, &hdbc);
     if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
     SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)5, 0);
        char buf[1024];
        short buf_len;
        retcode = SQLDriverConnect(hdbc, GetDesktopWindow(), (SQLCHAR*)addr, 
SQL_NTS, (SQLCHAR*)buf, 1024, &buf_len, 
SQL_DRIVER_COMPLETE|SQL_DRIVER_NOPROMPT);
 
     if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
          return;
 
     SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
        hdbc=0;
      }
    }
   SQLFreeHandle(SQL_HANDLE_ENV, henv);
    henv=0;
  }
  exception e("Connect error");
  throw e;
}
 
//------------------------------------------------------------------------------
// Отключение от базы данных
 
void dbDisconnect() {
  if(hdbc==0) return;
  SQLDisconnect(hdbc);
  SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
  hdbc=0;
  SQLFreeHandle(SQL_HANDLE_ENV, henv);
  henv=0;
}
 
//------------------------------------------------------------------------------
 
// Выполнение запрсоов и возврат результатов
 
class Recordset {
public:
  SQLHSTMT hstmt;
  bool lastNull;
 
  Recordset();
 
  void execute(const char* str); // Выполнить запрос
  int getFieldsCount(); // Узнать кол-во колонок
 
  // Получить следующую строку таблицы
  inline bool fetch() {
    assert(hstmt!=0);
    int r=SQLFetch(hstmt);
    return r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO;
  }
 
  // Получить ячейку строки таблицы
  inline int getI(int x) {
    assert(hstmt!=0);
    int i;
    int t,r = SQLGetData(hstmt,x+1,SQL_C_LONG,&i,0,(long*)&t);
    if(r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO) raise("Can't get integer 
field");
    lastNull = t==SQL_NULL_DATA;
    return i;
  }
 
  // Получить ячейку строки таблицы
  inline bool getB(int x) {
    int i;
    assert(hstmt!=0);
    int t,r = SQLGetData(hstmt,x+1,SQL_C_LONG,&i,0,(long*)&t);
    lastNull = t==SQL_NULL_DATA;
    if(r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO) raise("Can't get boolean 
field");
    return i!=0;
  }
 
  // Получить ячейку строки таблицы
  inline string getS(int x) {
    //! Неоптимально
    assert(hstmt!=0);
    string str;
    int t = 1024;
    str.resize(t);
    int r = SQLGetData(hstmt,x+1,SQL_C_CHAR,(void*)str.c_str(),t,(long*)&t);
    lastNull = t==SQL_NULL_DATA;
    if((r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO) || t<0) return "";
    str.resize(t);
    if(t>=1024) {
      t-=1023;
      int r = 
SQLGetData(hstmt,x+1,SQL_C_CHAR,(void*)(str.c_str()+1023),t,(long*)&t);
      if((r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO) || t<0) return "";
    }
    return str;
  }
 
  ~Recordset();
};
 
//------------------------------------------------------------------------------
 
Recordset::Recordset() {
  int r=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
  if(r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO) {
    hstmt=0;
    raise("Recordset.Recordset Ошибка "+i2s(r)+" при создании датасета");
  }
}
 
//------------------------------------------------------------------------------
 
void Recordset::execute(const char* cmd) {
  if(!hstmt) raise("Датасет не инициализирован");
  int r=SQLExecDirect(hstmt, (SQLCHAR*)cmd, SQL_NTS);
  if(r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO && r!=SQL_NO_DATA) 
raise("Ошибка "+i2s(r)+" при выполнении 
запроса\n"+((string)cmd).substr(0,64));
}
 
//------------------------------------------------------------------------------
 
int Recordset::getFieldsCount() {
  if(!hstmt) raise("Датасет не инициализирован");
  short cnt;
  int r=SQLNumResultCols(hstmt, &cnt);
  if(r!=SQL_SUCCESS && r!=SQL_SUCCESS_WITH_INFO) raise("Ошибка "+i2s(r)+" 
при получении кол-ва полей датасета");
  return cnt;
}
 
//------------------------------------------------------------------------------
 
Recordset::~Recordset() {
  if(hstmt) SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
 
//------------------------------------------------------------------------------
 
void main() {
  dbConnect("большая и страшная строка подключения");
  Recordset r;
  r.execute("sp_tables");
  cout << r.getFieldsCount() << endl;
  while(r.fetch())
    cout << r.getS(0) << endl;
}
Нашел вот такой код на другом сайте, может кто либо разжевать его, готов заплатить если понадобится.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2016, 23:17     C++ ODBC MS SQL SERVER
Посмотрите здесь:

[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection C# ASP.NET
Тип ошибки: Microsoft OLE DB Provider for ODBC Drivers (0x80040E4D) [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'AL_AS C# ASP.NET
SQL Server [Microsoft][ODBC SQL Server Driver]Timeout expired
Проблемы с trusted_connection. Ошибка: Microsoft OLE DB Provider for ODBC Drivers (0x80040E4D) [Microsoft][ODBC SQL Server Driver][SQL Server]Login C# ASP.NET
Помогите отловить ошибку: Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect s C# ASP.NET
SQL Server 2000 и ODBC SQL Server
Visual Basic SQL Server и ODBC драйвера
C++ COM COM exe server
Запрос через oledb for odbc к MS SQL Server 2005 SQL Server
В чем разница между SQL Server/OLEDB/ODBC Connection? C#
ODBC SQL Server Driver. Истекло время ожидания запроса Delphi БД

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2730 / 1741 / 174
Регистрация: 13.01.2012
Сообщений: 6,538
14.10.2016, 13:19     C++ ODBC MS SQL SERVER #2
Arguleon, почему просто не достать данные через ADO?
Yandex
Объявления
14.10.2016, 13:19     C++ ODBC MS SQL SERVER
Ответ Создать тему
Опции темы

Текущее время: 19:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru