📄 bcp.cpp
字号:
/* * =========================================================================== * PRODUCTION $Log: bcp.cpp,v $ * PRODUCTION Revision 1000.1 2004/06/01 19:20:40 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * PRODUCTION * =========================================================================== *//* $Id: bcp.cpp,v 1000.1 2004/06/01 19:20:40 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Author: Vladimir Soussov * * File Description: TDS bcp-in command * */#include <ncbi_pch.hpp>#include <dbapi/driver/ftds/interfaces.hpp>#include <dbapi/driver/util/numeric_convert.hpp>#include <string.h>BEGIN_NCBI_SCOPE///////////////////////////////////////////////////////////////////////////////// CTDS_BCPInCmd:://CTDS_BCPInCmd::CTDS_BCPInCmd(CTDS_Connection* con, DBPROCESS* cmd, const string& table_name, unsigned int nof_columns) : m_Connect(con), m_Cmd(cmd), m_Params(nof_columns), m_WasSent(false), m_HasFailed(false), m_HasTextImage(false), m_WasBound(false){ if (bcp_init(cmd, (char*) table_name.c_str(), 0, 0, DB_IN) != SUCCEED) { throw CDB_ClientEx(eDB_Fatal, 223001, "CTDS_BCPInCmd::CTDS_BCPInCmd", "bcp_init failed"); }}bool CTDS_BCPInCmd::Bind(unsigned int column_num, CDB_Object* param_ptr){ return m_Params.BindParam(column_num, kEmptyStr, param_ptr);}bool CTDS_BCPInCmd::x_AssignParams(void* pb){ RETCODE r; if (!m_WasBound) { for (unsigned int i = 0; i < m_Params.NofParams(); i++) { if (m_Params.GetParamStatus(i) == 0) continue; CDB_Object& param = *m_Params.GetParam(i); switch ( param.GetType() ) { case eDB_Int: { CDB_Int& val = dynamic_cast<CDB_Int&> (param); // DBINT v = (DBINT) val.Value(); r = bcp_bind(m_Cmd, (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBINT4, i + 1); } break; case eDB_SmallInt: { CDB_SmallInt& val = dynamic_cast<CDB_SmallInt&> (param); // DBSMALLINT v = (DBSMALLINT) val.Value(); r = bcp_bind(m_Cmd, (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBINT2, i + 1); } break; case eDB_TinyInt: { CDB_TinyInt& val = dynamic_cast<CDB_TinyInt&> (param); // DBTINYINT v = (DBTINYINT) val.Value(); r = bcp_bind(m_Cmd, (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBINT1, i + 1); } break; case eDB_BigInt: { CDB_BigInt& val = dynamic_cast<CDB_BigInt&> (param); DBNUMERIC* v = reinterpret_cast<DBNUMERIC*> (pb); Int8 v8 = val.Value(); v->precision= 18; v->scale= 0; if (longlong_to_numeric(v8, 18, v->array) == 0) return false; r = bcp_bind(m_Cmd, (BYTE*) v, 0, val.IsNULL() ? 0 : -1, 0, 0, SYBNUMERIC, i + 1); pb = (void*) (v + 1); } break; case eDB_Char: { CDB_Char& val = dynamic_cast<CDB_Char&> (param); r = bcp_bind(m_Cmd, (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : -1, (BYTE*) "", 1, SYBCHAR, i + 1); } break; case eDB_VarChar: { CDB_VarChar& val = dynamic_cast<CDB_VarChar&> (param); r = bcp_bind(m_Cmd, (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : -1, (BYTE*) "", 1, SYBCHAR, i + 1); } break; case eDB_LongChar: { CDB_LongChar& val = dynamic_cast<CDB_LongChar&> (param); r = bcp_bind(m_Cmd, (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : -1, (BYTE*) "", 1, SYBCHAR, i + 1); } break; case eDB_Binary: { CDB_Binary& val = dynamic_cast<CDB_Binary&> (param); r = bcp_bind(m_Cmd, (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : val.Size(), 0, 0, SYBBINARY, i + 1); } break; case eDB_VarBinary: { CDB_VarBinary& val = dynamic_cast<CDB_VarBinary&> (param); r = bcp_bind(m_Cmd, (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : val.Size(), 0, 0, SYBBINARY, i + 1); } break; case eDB_LongBinary: { CDB_LongBinary& val = dynamic_cast<CDB_LongBinary&> (param); r = bcp_bind(m_Cmd, (BYTE*) val.Value(), 0, val.IsNULL() ? 0 : val.DataSize(), 0, 0, SYBBINARY, i + 1); } break; case eDB_Float: { CDB_Float& val = dynamic_cast<CDB_Float&> (param); // DBREAL v = (DBREAL) val.Value(); r = bcp_bind(m_Cmd, (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBREAL, i + 1); } break; case eDB_Double: { CDB_Double& val = dynamic_cast<CDB_Double&> (param); // DBFLT8 v = (DBFLT8) val.Value(); r = bcp_bind(m_Cmd, (BYTE*) val.BindVal(), 0, val.IsNULL() ? 0 : -1, 0, 0, SYBFLT8, i + 1); } break; case eDB_SmallDateTime: { CDB_SmallDateTime& val = dynamic_cast<CDB_SmallDateTime&> (param); DBDATETIME4* dt = (DBDATETIME4*) pb; dt->days = val.GetDays(); dt->minutes = val.GetMinutes(); r = bcp_bind(m_Cmd, (BYTE*) dt, 0, val.IsNULL() ? 0 : -1, 0, 0, SYBDATETIME4, i + 1); pb = (void*) (dt + 1); } break; case eDB_DateTime: { CDB_DateTime& val = dynamic_cast<CDB_DateTime&> (param); DBDATETIME* dt = (DBDATETIME*) pb; dt->dtdays = val.GetDays(); dt->dttime = val.Get300Secs(); r = bcp_bind(m_Cmd, (BYTE*) dt, 0, val.IsNULL() ? 0 : -1, 0, 0, SYBDATETIME, i + 1); pb = (void*) (dt + 1); } break; case eDB_Text: { CDB_Text& val = dynamic_cast<CDB_Text&> (param); r = bcp_bind(m_Cmd, 0, 0, val.IsNULL() ? 0 : val.Size(), 0, 0, SYBTEXT, i + 1); m_HasTextImage = true; } break; case eDB_Image: { CDB_Image& val = dynamic_cast<CDB_Image&> (param); r = bcp_bind(m_Cmd, 0, 0, val.IsNULL() ? 0 : val.Size(), 0, 0, SYBIMAGE, i + 1); m_HasTextImage = true; } break; default: return false; } if (r != CS_SUCCEED) return false; } m_WasBound = true; } else { for (unsigned int i = 0; i < m_Params.NofParams(); i++) { if (m_Params.GetParamStatus(i) == 0) continue; CDB_Object& param = *m_Params.GetParam(i); switch ( param.GetType() ) { case eDB_Int: { CDB_Int& val = dynamic_cast<CDB_Int&> (param); // DBINT v = (DBINT) val.Value(); r = bcp_colptr(m_Cmd, (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(m_Cmd, val.IsNULL() ? 0 : -1, i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_SmallInt: { CDB_SmallInt& val = dynamic_cast<CDB_SmallInt&> (param); // DBSMALLINT v = (DBSMALLINT) val.Value(); r = bcp_colptr(m_Cmd, (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(m_Cmd, val.IsNULL() ? 0 : -1, i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_TinyInt: { CDB_TinyInt& val = dynamic_cast<CDB_TinyInt&> (param); // DBTINYINT v = (DBTINYINT) val.Value(); r = bcp_colptr(m_Cmd, (BYTE*) val.BindVal(), i + 1) == SUCCEED && bcp_collen(m_Cmd, val.IsNULL() ? 0 : -1, i + 1) == SUCCEED ? SUCCEED : FAIL; } break; case eDB_BigInt: { CDB_BigInt& val = dynamic_cast<CDB_BigInt&> (param); DBNUMERIC* v = (DBNUMERIC*) pb; v->precision= 18; v->scale= 0; Int8 v8 = val.Value(); if (longlong_to_numeric(v8, 18, v->array) == 0) return false; r = bcp_colptr(m_Cmd, (BYTE*) v, i + 1) == SUCCEED && bcp_collen(m_Cmd, val.IsNULL() ? 0 : -1, i + 1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -