powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / bcp_init
7 сообщений из 7, страница 1 из 1
bcp_init
    #32102509
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

использовал ли кто ntwdblib.dll\bcp_init,bcp_exec и получилось ли с помощью них положить данные на сервер?

взять данные с сервера очень хорошо получается, а положить данные никак.
причём ошибка происходит уже на bcp_init, еще не доходя до bcp_exec:-(((

не работает такое bcp_init ( dbproc , '[test].[dbo].[q]' , 'q.bin' , 'q.txt' , DB_IN )
...
Рейтинг: 0 / 0
bcp_init
    #32102734
я использовал

Код: plaintext
1.
2.
3.
4.
5.
6.
		retc=bcp_init(m_hdbc[i],tables[i],NULL,NULL,DB_IN);
		if (retc==FAIL)
		{
			sprintf(mess, "bcp_init(hdbc[i],%s,...) failed..." ,tables[i]);
			printError (pSrvProc, mess);
			return  0 ;	
		}

Правда я из переменных заталкивал а не из файла.
...
Рейтинг: 0 / 0
bcp_init
    #32102759
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это здорово, что нашелся хотя бы один человек!!!

Вообще-то я пишу не на C++, а на дельфи, но решил спросить здесь, т.к. вряд ли кто использовать это не в C++. Это все заработало с первого раза или были какие-либо подводные камни? И какой коннект к базе использовался DB-Lib dbopen или ODBC SQLDriverConnect?
У меня с dbopen работало только выгрузка:

login := dblogin;
dbsetlname ( login, 'sa', DBSETUSER);
dbsetlname ( login, '', DBSETPWD);
dbsetlname ( login, 'qqqqqqqqq', DBSETAPP);
bcp_setl(login, TRUE);
dbproc := dbopen (login, 'ambush');
if bcp_init(dbproc, 'test.dbo.q', 'q.bin', 'q.txt', DB_OUT) <> SUCCEED then
begin
application.messagebox('error','error',0);
exit;
end ;
if bcp_exec(dbproc, @rowsread) <> SUCCEED then
begin
application.messagebox('error','error',0);
exit;
end ;
dbclose ( dbproc ) ;

загрузка не работала никак, а через SQLDriverConnect вообще не работало.

Не будет ли с моей стороны большой наглостью попросить исходники или хотя бы кусочек с загрузкой и логином к базе?
...
Рейтинг: 0 / 0
bcp_init
    #32104076
Делал я все по аналогии с примером находящимся в BOL.

How to bulk copy data from program variables (ODBC)
To use bulk copy functions directly on program variables

Allocate an environment handle and a connection handle.


Set SQL_COPT_SS_BCP and SQL_BCP_ON to enable bulk copy operations.


Connect to Microsoft® SQL Server™.


Call bcp_init to set the following information:
The name of the table or view to bulk copy from or to.


Specify NULL for the name of the data file.


The name of an data file to receive any bulk copy error messages (specify NULL if you do not want a message file).


The direction of the copy: DB_IN from the application to the view or table or DB_OUT to the application from the table or view.
Call bcp_bind for each column in the bulk copy to bind the column to a program variable.


Fill the program variables with data, and call bcp_sendrow to send a row of data.


After several rows have been sent, call bcp_batch to checkpoint the rows already sent. It is good practice to call bcp_batch at least once per 1000 rows.


After all rows have been sent, call bcp_done to complete the operation.
You can vary the location and length of program variables during a bulk copy operation by calling bcp_colptr and bcp_collen.

Use bcp_control to set various bulk copy options. Use bcp_moretext to send text, ntext, and image data in segments to the server.

Examples
The following example shows using bulk copy functions to bulk copy data from program variables to SQL Server using bcp_bind and bcp_sendrow. Error-checking code is removed to simplify this example.
Код: 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.
// Sample showing ODBC bulk copy from program variables
// bound with bcp_bind; data sent with bcp_sendrow.
//
// Assumes server has:
//
// CREATE TABLE BCPSource (cola int PRIMARY KEY,
//                   colb CHAR( 10 ) NULL)
// CREATE TABLE BCPTarget (cola int PRIMARY KEY,
//                     colb CHAR( 10 ) NULL)
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>

SQLHENV      henv = SQL_NULL_HENV;
HDBC         hdbc1 = SQL_NULL_HDBC, hdbc2 = SQL_NULL_HDBC;
SQLHSTMT      hstmt2 = SQL_NULL_HSTMT;

int main() {
   RETCODE      retcode;

   // BCP variables.
   char   *terminator =  "\0 ";
   // bcp_done takes a different format return code
   // because it returns number of rows bulk copied
   // after the last bcp_batch call.
   DBINT      cRowsDone;
   // Set up separate return code for bcp_sendrow so
   // it is not using the same retcode as SQLFetch.
   RETCODE      SendRet;

   // Column variables.
   // cbCola and cbColb must be defined right before
   // Cola and szColb because they are used as 
   // bulk copy indicator variables.
   struct ColaData{
      SQLINTEGER cbCola;
      SQLINTEGER Cola;
   } ColaInst;
   struct ColbData{
      SQLINTEGER cbColb;
      SQLCHAR   szColb[ 11 ];
   } ColbInst;
   
    // Allocate the ODBC environment and save handle.
   retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
   // Notify ODBC that this is an ODBC  3 . 0  app.
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
                     (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);

   // Allocate ODBC connection handle, set bulk copy mode, and connect.
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
   retcode = SQLSetConnectAttr(hdbc1, SQL_COPT_SS_BCP,
                        (void *)SQL_BCP_ON, SQL_IS_INTEGER);
   retcode = SQLConnect(hdbc1,  "MyDSN" , SQL_NTS,
                      "sa" , SQL_NTS,  "MyPassWord" , SQL_NTS);
   
   // Initialize the bulk copy.
   retcode = bcp_init(hdbc1,  "pubs..BCPTarget" , NULL,
                  NULL, DB_IN);
   // Bind the program variables for the bulk copy.
   retcode = bcp_bind(hdbc1, (BYTE *)&ColaInst.cbCola,  4 ,
               SQL_VARLEN_DATA, NULL, (INT)NULL,
               SQLINT4,  1 );
   // Could normally use strlen to calculate the bcp_bind
   // cbTerm parameter, but this terminator is a null byte
   // (\ 0 ), which gives strlen a value of  0 . Explicitly give
   // cbTerm a value of  1 .
   retcode = bcp_bind(hdbc1, (BYTE *)&ColbInst.cbColb,  4 ,  11 ,
               terminator,  1 , SQLCHARACTER,  2 );

   // Allocate second ODBC connection handle so that bulk copy
   // and cursor operations do not conflict.
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc2);
   retcode = SQLConnect(hdbc2,  "MyDSN" , SQL_NTS,
                      "sa" , SQL_NTS,  "MyPassWord" , SQL_NTS);
   // Allocate ODBC statement handle.
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc2, &hstmt2);

   // Bind the SELECT statement to the same program variables
   // bound to the bulk copy operation.
   retcode = SQLBindCol(hstmt2,  1 , SQL_C_SLONG, &ColaInst.Cola,  0 ,
                     &ColaInst.cbCola);
   retcode = SQLBindCol(hstmt2,  2 , SQL_C_CHAR, &ColbInst.szColb,  11 ,
                     &ColbInst.cbColb);
   // Execute a SELECT statement to build a cursor containing 
   // the data to be bulk copied to the new table.
   retcode = SQLExecDirect(hstmt2,
                      "SELECT * FROM BCPSource" ,
                     SQL_NTS);
   // Go into a loop fetching rows from the cursor until
   // each row is fetched. Because the bcp_bind calls
   // and SQLBindCol calls each reference the same
   // variables, each fetch fills the variables used by
   // bcp_sendrow, so all you have to do to send the data
   // to SQL Server is to call bcp_sendrow.

   while ( (retcode = SQLFetch(hstmt2) ) != SQL_NO_DATA) {
      if ( (retcode != SQL_SUCCESS) &&
         (retcode != SQL_SUCCESS_WITH_INFO) ) {
            // Process error.
            return( 9 );
      }
      if ( (SendRet = bcp_sendrow(hdbc1) ) != SUCCEED ) {
         // Process error.
         return( 9 );
      }
   }
   // Signal the end of the bulk copy operation.
   cRowsDone = bcp_done(hdbc1);
   printf( "Number of rows bulk copied after last bcp_batch 
               call = %d.\n" , cRowsDone);
    /* Clean up. */ 
   SQLFreeHandle(SQL_HANDLE_STMT, hstmt2);
   SQLDisconnect(hdbc1);
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
   SQLDisconnect(hdbc2);
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc2);
   SQLFreeHandle(SQL_HANDLE_ENV, henv);
   return( 0 );
}


Подводных камней не было. Была небольшая трудность с загрузкой типа данных Decimal может и были какие-то готовые функции которые клали в структуру dbnumeric значение,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#define MAXNUMERICLEN	 16 
typedef struct dbnumeric	
{	// Format for SRVNUMERIC,SRVNUMERICN,SRVDECIMAL,SRVDECIMALN
	BYTE precision;
	BYTE scale;
	BYTE sign;
	BYTE val[MAXNUMERICLEN];
} DBNUMERIC;
typedef DBNUMERIC DBDECIMAL;


но я так и не разобрался и решил сам ее заполнять, с горем пополам нашел описание в MSDN как хранится число в этой структуре и накатал свою функцию.

В структуру DBDECIMAL в поле val значение закладывается следующим образом
пусть тип Decimal(9,2) и передано значение "123.45"
мы его должны привести к целому помножив на 10^2 (т.к. scale=2)
получается 12345 и затолкать в этот val
в val[0] самый младший байт
в val следующий и т.д.
...
Рейтинг: 0 / 0
bcp_init
    #32105070
tunknown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
...
Рейтинг: 0 / 0
bcp_init
    #32161888
director
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эй, кто там на Дельфи пишет с DB-Lib....

Напишите как правильно подключить его к Борланду (у меня Билдер, да все равно!) У меня никак не получается. Делаю все как в примере BOL, а в ответ: Unresolved exrternal function
...
Рейтинг: 0 / 0
bcp_init
    #32161999
Фотография cyc10ne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
director: ответ в соседнем топике
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / bcp_init
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]