int main(int argc, char* argv[]) { SAConnection con; // connection object SACommand cmd; // command object try { // connect to database (Oracle in our example) con.Connect("test", "tester", "tester", SA_Oracle_Client); // associate a command with connection cmd.setConnection(&con); // Insert 2 rows cmd.setCommandText( "Insert into test_tbl(fid, fvarchar20) values(:1, :2)"); // use first method of binding - param assignment cmd.Param(1).setAsLong() = 2; cmd.Param(2).setAsString() = "Some string (2)"; // Insert first row cmd.Execute(); // use second method of binding - stream binding cmd << (long)3 << "Some string (3)"; // Insert second row cmd.Execute(); // commit changes on success con.Commit(); printf("Input parameters bound, rows inserted!\n"); } catch(SAException &x) { // SAConnection::Rollback() // can also throw an exception // (if a network error for example), // we will be ready try { // on error rollback changes con.Rollback(); } catch(SAException &) { } // print error message printf("%s\n", (const char*)x.ErrText()); } return 0; }
void InterBaseEvents() { SAConnection con; SACommand cmd; event_data_t event_data; try { con.Connect( "transfer:d:/temp/siemens/controller.gdb", // database name "sysdba", // user name "masterkey", // password SA_InterBase_Client); event_data.pibAPI = (ibAPI *)con.NativeAPI(); event_data.pibConnectionHandles = (ibConnectionHandles *)con.NativeHandles(); con.setAutoCommit(SA_AutoCommitOn); // register interest for "TestEvent" event event_data.length = event_data.pibAPI->isc_event_block( &event_data.event_buffer, &event_data.result_buffer, 1, "TestEvent"); event_data.que_events(); // this should fire event cmd.setConnection(&con); cmd.setCommandText("a"); cmd.Param("sEvent").setAsString() = "TestEvent"; cmd.Execute(); // wait for event to be fired getchar(); } catch(SAException &x) { // SAConnection::Rollback() // can also throw an exception // (if a network error for example), // we will be ready try { // on error rollback changes con.Rollback(); } catch(SAException &) { } // print error message printf("Err = %s\nCode = %d\n", (const char*)x.ErrText(), x.ErrNativeCode()); } }
int OnExecProc(QUEUE_LIST *pDataNode) { //报文(MSG) unsigned char *p = pDataNode->Buffer; p++; char ProcName[255]; memset(ProcName, 0, sizeof(ProcName)); int iProcNameLen, iInputParaNums, iOutputParaNums; P2W(iProcNameLen, p); p += 2; memcpy(ProcName, p, iProcNameLen); p += iProcNameLen; // 输入参数个数 P2W(iInputParaNums, p); p += 2; SACommand Cmd; Cmd.setConnection(pDataNode->psaConn); Cmd.setCommandText(ProcName); char ParaName[255], ParaVaule[255]; int iLen; for (int i = 0; i < iInputParaNums; i++) { BYTE ParaType = *p; p++; memset(ParaName, 0, sizeof(ParaName)); memset(ParaVaule, 0, sizeof(ParaVaule)); P2W(iLen, p); p += 2; memcpy(ParaName, p, iLen); p += iLen; P2W(iLen, p); p += 2; memcpy(ParaVaule, p, iLen); p += iLen; if (ParaType == 0x00) Cmd.Param(ParaName).setAsLong() = atoi(ParaVaule); else if (ParaType == 0x01) Cmd.Param(ParaName).setAsString() = ParaVaule; } Cmd.Execute(); // 输出缓存 BYTE OutBuf[1024]; memset(OutBuf, 0, sizeof(OutBuf)); int iOffset = 0; // 输出参数个数 memcpy(&OutBuf[iOffset], p, 2); P2W(iOutputParaNums, p); p += 2; iOffset += 2; for (int i = 0; i < iOutputParaNums; i++) { memset(ParaName, 0, sizeof(ParaName)); memset(ParaVaule, 0, sizeof(ParaVaule)); // 参数类型 BYTE ParaType = *p; memcpy(&OutBuf[iOffset], p, 1); p++; iOffset ++; // 参数名称 P2W(iLen, p); memcpy(&OutBuf[iOffset], p, 2); p += 2; iOffset += 2; memcpy(ParaName, p, iLen); memcpy(&OutBuf[iOffset], p, iLen); p += iLen; iOffset += iLen; // 参数值 if (ParaType == 0x00) sprintf(ParaVaule, "%ld", Cmd.Param(ParaName).asLong()); else if (ParaType == 0x01) strcpy(ParaVaule, Cmd.Param(ParaName).asString()); int iTempLen = strlen(ParaVaule); BYTE *pLen = &OutBuf[iOffset]; W2P(pLen, iTempLen); iOffset += 2; memcpy(&OutBuf[iOffset], ParaVaule, iTempLen); iOffset += iTempLen; } p = &pDataNode->Buffer[1]; int iOutLen = 1; *p++ = CMD_OK; //执行SQL成功 iOutLen++; memcpy(p, OutBuf, iOffset); iOutLen += iOffset; iOutLen += 2; pDataNode->Length = iOutLen; return 1; }
void Oracle_OCI_ATTR_CHARSET_FORM_OCI_ATTR_CHARSET_ID() { SAConnection con; SACommand cmd; cmd.setConnection(&con); try { con.Connect("cit", "dwadm", "dwadm", SA_Oracle_Client); bool bDropTable = !false; bool bCreateTable = !false; if(bDropTable) { cmd.setCommandText( "drop table test_charset"); cmd.Execute(); } if(bCreateTable) { cmd.setCommandText( "Create table test_charset (f1 nchar(254), f2 char(254))"); cmd.Execute(); } cmd.setCommandText("delete from test_charset"); cmd.Execute(); cmd.setCommandText("insert into test_charset values (:1, :2)"); cmd.Param(1).setOption("OCI_ATTR_CHARSET_FORM") = "SQLCS_NCHAR"; cmd.Param(1).setOption("OCI_ATTR_CHARSET_ID") = "171"; cmd.Param(2).setOption("OCI_ATTR_CHARSET_ID") = "CL8MSWIN1251"; cmd.Param(1).setAsString() = "string f1 - 1"; cmd.Param(2).setAsValueRead() = cmd.Param(1); cmd.Execute(); cmd.Param(1).setAsString() = "������ f1 - 2"; cmd.Param(2).setAsValueRead() = cmd.Param(1); cmd.Execute(); cmd.setCommandText("select * from test_charset"); cmd.Execute(); cmd.Field(1).setOption("OCI_ATTR_CHARSET_ID") = "171"; cmd.Field(2).setOption("OCI_ATTR_CHARSET_ID") = "CL8MSWIN1251"; while(cmd.FetchNext()) { cout << (const char*)cmd[1].asString() << "" << (const char*)cmd[2].asString() << endl; } } catch(SAException &x) { try { con.Rollback(); } catch(SAException &) { } printf("%s\n", (const char*)x.ErrText()); } }