MSSQL Stored Procedure NVARCHAR OUTPUT is empty.



  • Hallo Qtler,

    ich habe eine Stored Procedure die mir NVARCHAR als Output liefern soll.
    Mein Problem ist, dass ich auf Qt - Seite eine leeres QString bekomme.
    Habe das Problem mit Qt - Version 5.3 und 5.5.1.
    Ein resize von QString bringt zwar Resultat zurück,
    aber es ist mir nicht bekannt wie groß das Rückgabewert letztendlich sein kann.

    In mehreren Blogs gefunden, dass das Problem seit Version 5 nicht mehr vorhanden ist.
    Bei mir tritt es aber trotzdem auf.

    Google Tranlate:
    Hello Qtler,

    I have a stored procedure which should give me NVARCHAR as output.
    My problem is that I get an empty QString on Qt - page a.
    Have the problem with Qt version 5.3 and 5.5.1.
    Resizing QString returns result
    but I do not know how big the return value can be.

    In several blogs, the problem is no longer available since version 5.
    But it happens to me anyway.

    FG

    Beispielcode:

    QSqlDatabase database = QSqlDatabase::database(dbConnectionName);
      if (database.isValid())
        if (!database.isOpen())
          database.open();
    
      QString declareVars;
      // initialize query
      QSqlQuery qrySql(database);
      // prepare query
      // QString qry = QString("EXEC [dbo].[getValueFromDB] :p1, :p2, :p3 OUTPUT, :p4 OUTPUT");
      // :p3 = NVARCHAR(max), :p4 = INTEGER
      qrySql.prepare(qry);
      // for MSSqlServer only forward
      qrySql.setForwardOnly(true);
      // bind values, replace placeholder from input map values
      QMapIterator<QString, QVariant> itInput(inputVars);
    
      while(itInput.hasNext())
      {
        itInput.next();
        //qrySql.addBindValue(itInput.value(), QSql::In);
        qrySql.bindValue(itInput.key(), itInput.value(), QSql::In);
      }
      // bind output values, replace place holder from output map values
      QMapIterator<QString, QVariant> itOut(outputVars);
      while(itOut.hasNext())
      {
        itOut.next();
        if (itOut.value().type() == QVariant::String)
        {
          QString outPar = itOut.value().toString();
          outPar.resize(100);
          qrySql.bindValue(itOut.key(), outPar, QSql::Out);
        }
        else
          qrySql.bindValue(itOut.key(), itOut.value(), QSql::Out);
      }
      
      // set cursor to begin
      outputVars.begin();
      // execute stored procedure
      if(qrySql.exec())
      {
        
        QMapIterator<QString, QVariant> it(qrySql.boundValues());
        while(it.hasNext())
        {// test values 
          it.next();
          qDebug() << it.key() << " : " << it.value().toByteArray();
        }
     
        // get output values from stored procedure
        QMapIterator<QString, QVariant> itRepOut(outputVars);
        while(itRepOut.hasNext())
        {
          // replace values in to output map
          outputVars.insert(itRepOut.key(), qrySql.boundValue(itRepOut.key()) );
        }
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.