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

C++: COM, OLE, ActiveX

Войти
Регистрация
Восстановить пароль
 
Arguleon
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 1
#1

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

13.10.2016, 23:17. Просмотров 873. Ответов 3
Метки нет (Все метки)

Всем доброго времени суток, пытаюсь разобраться как подключится к 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;
}
Нашел вот такой код на другом сайте, может кто либо разжевать его, готов заплатить если понадобится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2016, 23:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос C++ ODBC MS SQL SERVER (C++ COM):

Написание приложений для доступа к базе данных MS SQL Server 2008 r2 - C++
Доброе времени суток! Понимаю что задача возможно простая, но подобного рода задания я еще не выполнял. Вопрос в следующим в локальной сети...

Тип ошибки: Microsoft OLE DB Provider for ODBC Drivers (0x80040E4D) [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'AL_AS - 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
Раньше токого не возникало, пытаюсь вставить в таблицу: otvet = trim(request.form('R1')) last = rs0('IDUser') cn2.Execute('insert...

Проблемы с trusted_connection. Ошибка: Microsoft OLE DB Provider for ODBC Drivers (0x80040E4D) [Microsoft][ODBC SQL Server Driver][SQL Server]Login - C# ASP.NET
Пытаюсь подключиться к БД. Строка соединения следующая: Provider=Microsoft OLE DB Provider for 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
Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection Вот такую ошибку выдает. В DSN...

SQL Server и ODBC драйвера - Visual Basic
Добрый день уважаемые пользователи и гости форума. В данном посте хотел бы рассказать любителям программировать на старом добром &quot;Барсике&quot;,...

3
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,578
14.10.2016, 13:19 #2
Arguleon, почему просто не достать данные через ADO?
0
tisha_
57 / 57 / 30
Регистрация: 16.09.2015
Сообщений: 295
Завершенные тесты: 3
28.08.2017, 16:49 #3
Цитата Сообщение от vxg Посмотреть сообщение
Arguleon, почему просто не достать данные через ADO?
а пример можно?
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,578
28.08.2017, 19:33 #4
tisha_, если у вас VC++ то можно так Не коннектится к БД
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2017, 19:33
Привет! Вот еще темы с ответами:

SQL Server 2000 и ODBC - SQL Server
почему выкидывает ODBC Failed TimeOut expired? лазил по настройкам ODBC на на компе-клиенте DATA Source Administrator, там...

Запрос через oledb for odbc к MS SQL Server 2005 - SQL Server
Здравствуйте, есть удаленная база данных на Sql Server 2005. Соединение через OLE DB for ODBC с сервером и базой(база одна по дефолту на...

[Microsoft][ODBC SQL Server Driver]Timeout expired - SQL Server
Установил SQL Server 2000, пытаюсь выполнить запрос, через 30 сек. выдаёт такое вот сообщение Timeout expired. Что за беда?

В чем разница между SQL Server/OLEDB/ODBC Connection? - C#
кто может сказать в чем разница между этими подключениями 1) C# SQL Server Connection 2) C# OLEDB Connection 3) C#...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
28.08.2017, 19:33
Ответ Создать тему
Опции темы

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