Avatar billede macpain Nybegynder
14. februar 2007 - 09:57 Der er 1 løsning

SQLBindParameter i C++

Jeg tester op imod Northwind(inden jeg vil bruge min query i produktion!!) databasen der ligger i MS SQL, her kan jeg ikke få min SQLBindParameter til at fungere.

Hvis jeg gør følgende "EXEC CustOrdersDetail 10248" fungere det uden problemer og jeg kan hente mine rækker

Min SQLExecute returnere altid 99... hvad gør jeg forkert?

Reelt ville jeg gerne bruge en query der ser ud som følgenede:
"EXEC ?= CustOrdersDetail ?", men vil gerne have "EXEC CustOrdersDetail ?" til at fungere først!!

  BOOL valueToReturn(FALSE);

  struct {
      SQLINTEGER retVal;
      SQLINTEGER orderId;
      SQLINTEGER retValLength;
      SQLINTEGER orderIdLength;

      //Return values
      SQLCHAR    name[128];
      SQLDOUBLE  unitPrice;
      SQLINTEGER quantity;
      SQLINTEGER discount;
      SQLDOUBLE  extPrice;

      SQLINTEGER nameLength;
      SQLINTEGER unitPriceLength;
      SQLINTEGER quantityLength;
      SQLINTEGER discountLength;
      SQLINTEGER extPriceLength;
  } row;
 
  string str = "EXEC CustOrdersDetail ?";
  row.orderId = 10248;
 
  m_sr = SQLPrepare(m_stmtHandle, (UCHAR*)str.c_str() , SQL_NTS);
 
  if (m_sr == SQL_SUCCESS || m_sr == SQL_SUCCESS_WITH_INFO)
  {
    //m_sr = SQLBindParameter(m_stmtHandle, 1, SQL_PARAM_OUTPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &row.retVal,  0, &row.retValLength);
    m_sr = SQLBindParameter(m_stmtHandle, 1, SQL_PARAM_INPUT_OUTPUT, SQL_C_LONG, SQL_INTEGER, sizeof(row.orderId), 0, &row.orderId, sizeof(row.orderId), &row.orderIdLength);
  }

  m_sr = SQLBindCol(m_stmtHandle, 1, SQL_C_CHAR, row.name, sizeof(row.name),            &row.nameLength);
  if(m_sr != SQL_SUCCESS && m_sr != SQL_SUCCESS_WITH_INFO)
      return valueToReturn;
...
...
m_sr = SQLExecute(m_stmtHandle);
  if(m_sr != SQL_SUCCESS && m_sr != SQL_SUCCESS_WITH_INFO)
    return valueToReturn;
 
  // Start fetching records
  while (SQLFetch(m_stmtHandle) == SQL_SUCCESS) {
    valueToReturn = TRUE;
  }
Avatar billede macpain Nybegynder
14. februar 2007 - 12:42 #1
Fandt løsningen til problemet!
Løsning:

m_sr = SQLPrepare(m_stmtHandle, (UCHAR*)str.c_str() , SQL_NTS);
 
  if (m_sr == SQL_SUCCESS || m_sr == SQL_SUCCESS_WITH_INFO)
  {
      m_sr = SQLBindParameter(m_stmtHandle, 1, SQL_PARAM_INPUT, SQL_C_SSHORT,  SQL_INTEGER, 0, 0, &l_orderId, 0, &l_orderIdLength);

  }

  m_sr = SQLExecute(m_stmtHandle);
  if(m_sr != SQL_SUCCESS && m_sr != SQL_SUCCESS_WITH_INFO)
    return valueToReturn;
 
  m_sr = SQLBindCol(m_stmtHandle, 1, SQL_C_CHAR, row.name, sizeof(row.name),            &row.nameLength);
  if(m_sr != SQL_SUCCESS && m_sr != SQL_SUCCESS_WITH_INFO)
      return valueToReturn;

Altså lav en Prepare, bind parameter, execute, bind columns og dernæst fetch
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester