我在Android应用程序中有收据和日志模型.收据有很多日志.
我按sortID和等级查询了group_by日志.
//recieve RecepitID and query to group logs
final long forwardedId = (long) getIntent().getExtras().get(String.valueOf("recepitID"));
List<Logs> logsList = new Select().from(Logs.class).where("Receipt = " + forwardedId).groupBy("SortID, Grade").execute();
Run Code Online (Sandbox Code Playgroud)
这种分组工作正常.问题是下一个.我需要有这样的输出(红圈中的部分):
但我得到这样的:
这是代码的一部分,我是如何做到这一点的.
public class LogsRecapitulation extends AppCompatActivity {
private ListView mainListView;
private BaseAdapter listAdapter;
private TextView logsCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recapitulation_listview);
mainListView = (ListView) findViewById(R.id.ListViewItem);
//recieve RecepitID and query to group logs
final long forwardedId = (long) getIntent().getExtras().get(String.valueOf("recepitID"));
List<Logs> logsList = new Select().from(Logs.class).where("Receipt = " + forwardedId).groupBy("SortID, Grade").execute();
TextView result …Run Code Online (Sandbox Code Playgroud) 我正在使用SQLite,插入表中.Folowwing
QSqlQuery testQuery(QString("INSERT INTO test(testcol) VALUES(?)"));
testQuery.bindValue(0, someQStringObg);
testQuery.exec();
Run Code Online (Sandbox Code Playgroud)
有效,但是
QSqlQuery testQuery(QString("INSERT INTO test(testcol) VALUES(:val)"));
testQuery.bindValue(":val", someQStringObg);
testQuery.exec();
Run Code Online (Sandbox Code Playgroud)
别.testQuery.lastError().text()返回No query无法获取行
不知道为什么会这样,但真的想知道.
我正在使用Qt的MySQL驱动程序和32位MinGW Qt.这是有效的:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("MyDatabase");
//SETUP
if (db.open) {
QSqlQuery q;
if (q.prepare("SELECT id FROM Things WHERE parent_id = :pid")) {
q.bindValue(":pid", 1);
qDebug() << boundValues();
if (q.exec) {
//DO STUFF
} } }
Run Code Online (Sandbox Code Playgroud)
但是现在我正在使用64位MSVS Qt,我需要使用MySQL ODBC Connector.我已经设置并更改了代码以反映:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("Driver={MySQL ODBC 8.0 Unicode Driver};DATABASE=MyDatabase;");
Run Code Online (Sandbox Code Playgroud)
这就是我所做的一切.没有WHERE子句的SELECT语句按预期工作,我可以像以前一样通过QSqlTableModel操作数据库.
这只是绑定停止工作......我的意思是绑定值在那里,qDebug返回:
QMap((":pid",QVariant(int,1)))
但是现在查询在exec之后没有返回任何行; 但也没有错误...这也有效:
q.prepare(QString("SELECT id FROM Things WHERE parent_id = '%1'").arg(1))
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
void updateDB(const int id, const QString& column, const QVariant& value) const
//*****
//all stuff on open DB etc.
QSqlQuery query;
query.prepare("UPDATE table SET :column = :value WHERE id = :id ");
query.bindValue(":column", QVariant(column));
query.bindValue(":value", value);
query.bindValue(":id", id);
query.exec();
Run Code Online (Sandbox Code Playgroud)
不行.同时如果我重写查询
query.exec("UPDATE table SET " + column + " = " + value.toString() + " WHERE id = " + QString::number(id));
Run Code Online (Sandbox Code Playgroud)
有用.它也适用于我删除:列占位符并写入查询列名称,我正在测试它.所以我似乎不能将bindValue和占位符用于列名,至少使用Sqlite.但我没有在任何文件中找到这一点.
所以没有办法将bindValue和占位符用于列名,或者我错过了什么?
QSqlQuery query;
QString queryText("SELECT * FROM section");
query.exec(queryText);
qDebug() << query.size(); //always -1
while (query.next()) qDebug() << query.value(0).toString(); //got 16 records
Run Code Online (Sandbox Code Playgroud)
方法size()始终返回-1.请帮忙.谢谢.
我有一个SQL查询(调用存储过程到MSSQL),它采用任意长度的BINARY类型作为参数.我正在使用QT对存储过程的支持.但根据这个,对于VARBINARY为ODBC没有相应的QT类型.QT需要一种在将参数传递给sql查询时可以转换为QVariant的类型.
对于长度以字节为单位的二进制类型<= 8,我使用了quint64,它没有抱怨.
但是,对于任意长度的varbinary,如果我使用QString,我会收到此错误:
QODBCResult :: exec:无法执行语句:"[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]不允许从数据类型nvarchar到二进制的隐式转换.使用CONVERT函数运行此查询.
如果我使用QByteArray,我会收到此错误:
QODBCResult :: exec:无法执行语句:"[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效参数79(''):数据类型0x22是不推荐使用的大对象或LOB,但标记为输出参数.不支持不推荐使用的类型作为输出参数.请改用当前的大对象类型."
如果有人有任何建议会很好.
@a binary(2) = NULL,
@b binary(5) = NULL,
@c binary(3) = NULL,
@d binary(3) = NULL,
@e binary(8) = NULL,
@f binary(32) = NULL,
QSqlQuery query(QSqlDatabase::database(dbname));
setQueryStatement(queryString);
prepareQuery(query);
query.bindValue(":f",/* what datatype variable should i put here */);
query.exec();
Run Code Online (Sandbox Code Playgroud) 不时讨论以下问题。然而,问题本身从来没有解决方案。正如我发现的那样,向前和向后迭代行是有区别的。与向前迭代QSqlQuery::next() 可能导致只有一行,但是落后的迭代QSqlQuery::previous()将永远找不到的所有行。无论是否显式设置前向迭代,都没有影响。
编辑: 参考文献已删除
关于 Qt 文档,正确的方法如下:
QSqlQuery q = db.exec("SELECT * FROM Table");
while (q.next()) {
// Do something with row...
}
Run Code Online (Sandbox Code Playgroud)
但是,这将导致只有一行。向后迭代将找到所有行。
QSqlQuery q = db.exec("SELECT * FROM Table");
if (q.last()) {
do {
// Do something with row...
} while (q.previous());
}
Run Code Online (Sandbox Code Playgroud)
向后迭代可能非常缓慢,应该避免。有谁知道为什么这在前向迭代中不起作用?
编辑:这种行为对我来说并不总是可以重现,有时会发生,有时不会。该数据库包含多个在这种情况下,多行。问题恰好出现在此代码片段中。有没有人有同样的问题?
编辑 2:似乎该错误已在 Qt 4.8.5 中修复。
我当前的环境:Windows 7 (SP1)、Qt 4.8.5。
我正在使用SQLite驱动程序在Windows 7上使用Qt 5.3.1(64位)进行简单的参数化查询。当我bindValue()用来设置查询的单个参数的值时,我系统地得到了可怕的“参数计数不匹配”错误。我使用时一切正常addBindValue()。请注意,带有的代码bindValue()可以在Qt 4.8.5(64位)上正常工作。
以下是完整的代码(main.cpp):
#include <QtSql>
int main(int, char* [])
{
auto db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("db.sqlite");
db.open();
{
QSqlQuery query("CREATE TABLE IF NOT EXISTS hashes (filepath TEXT, modified INTEGER, hash TEXT)", db);
query.exec();
}
QSqlQuery query("SELECT modified FROM hashes WHERE filepath = :fp", db);
query.bindValue(":fp", "test.jpg");
if (!query.exec())
qDebug() << query.lastError();
db.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
QtCreator项目文件(qtsqltest.pro):
QT += core sql
TARGET = qtsqltest
TEMPLATE = app
SOURCES += main.cpp …Run Code Online (Sandbox Code Playgroud) 我在 Microsoft Azure 中有一个 SQL 数据库服务器。我想使用 Azure Rest-API 从表中选择一些记录。当我提到Azure SQL 数据库 REST API 时,我找不到任何用于此目的的部分,只能获取数据库信息、服务器信息或类似内容。这里没有合适的 API 来选择或更新表。请你帮助我好吗?
我想使用值绑定在 qt 中执行参数化。
这是代码:
QString name = "Foo";
query->prepare("SELECT Name, Surname FROM employee WHERE Surname LIKE %:surname%");
query->bindValue(":surname", name);
Run Code Online (Sandbox Code Playgroud)
问题在于%字符:它在执行查询时生成错误,但我不知道如何将它与 qt 一起使用。