QT多线程查询数据库显示到tablewidget里面

QT多线程查询数据库显示到tablewidget里面,第1张

1、线程内注册与连接数据库的竞争问题

文档上对多线程下数据库应用的注意事项写的很简明,一个线程创建的 QSqlDatabase 对象和 查出来的 QSqlQuery 对象只能给本线程用(注意,是对象,不是数据库连接本身,连接本身用名字可以多线程使用),其他情况是“不支持的”。在一个需要有几个线程并发访问不同数据库的应用中,我首先试图在各个线程的起始分别以不同的名称调用 addDatabase / database 、open,但是程序偶然会崩溃,跟踪后发现,虽然Qt 声称很多方法是“线程安全”的,但是几个方法串起来,就出问题了。Qt 会动态的加载数据库的plugin, 加载 plug in 的部分,涉及到对本地库文件的管理,这一部分,出现了竞争。于是,很自然的想到在初始连接部分设置 Mutex 保护,从 addDatabase / database到 open 的部分,要保证其原子性,问题再也没有出现。

2、数据库连接意外断裂后,恢复连接的问题

在MFC 中,一旦中途TCP连接断裂,直接重新 Open 就可以了。在Qt 里,这一招不好使了。即便 调用了 close ,再次open 也是不行的。处理方法:

在检测到问题出现后,关闭连接,并 removeDatabase; 而后,不要立刻 addDatabase, 反而是要回到该连接所在的事件循环。没有详细跟源码,很可能在 removeDatabase 后的事件循环中,Qt 内部做了一些释放 *** 作。 怎么办呢, 可以设置一个恢复定时器,比如 1分钟,重新 addDatabase,就可以啦。如果心急的话,直接显式调用processEvent() 方法强制循环。

在多线程下,注意1中的问题,需要 Mutex保护。

3、数据库插件的依赖性问题

在 Windows 下,有时我们的机器上按了好几个 Qt 版本,PATH里索性神马也不设置,依赖开发环境的继承环境适应不同的版本。这有两个问题。一是发布程序的时候,数据库驱动依赖的dll 也要与可执行文件在同一路径下发布。比如 mysql 的 dll, PostgreSQL 的依赖等。二是在集成开发环境中,这些依赖也要位于执行档文件夹下。否则,会造成虽然可以枚举到可用驱动,但是死活连接不上。调试一下就知道,原来是在路径中找不到依赖项,导致dll加载失败哦!

1获取DataSet

2转成DataTable

3

public static string DataTableToJson(DataTable dt)

{

StringBuilder jsonBuilder = new StringBuilder();

//jsonBuilderAppend("'

//jsonBuilderAppend(dtTableName);

jsonBuilderAppend("[");

for (int i = 0; i < dtRowsCount; i++)

{

jsonBuilderAppend("{");

for (int j = 0; j < dtColumnsCount; j++)

{

jsonBuilderAppend("\"");

jsonBuilderAppend(dtColumns[j]ColumnName);

jsonBuilderAppend("\":\"");

jsonBuilderAppend(dtRows[i][j]ToString());

jsonBuilderAppend("\",");

}

jsonBuilderRemove(jsonBuilderLength - 1, 1);

jsonBuilderAppend("},");

}

jsonBuilderRemove(jsonBuilderLength - 1, 1);

jsonBuilderAppend("]");

//jsonBuilderAppend("}"); //输出的要求不要'}'

return jsonBuilderToString();

}

4把Json字串Response出来

5获取Json字串

function load() //页面加载

{

$ajax({

type:"post",

url:"/Handler/LinkManHandlerashx",//从哪获取Json

data:"action=getLinkMan&id="+comId,//Ajax传递的参数

beforeSend:function(){

//获取之前显示 loading 或 正在加载

},

success:function(mess)

{

$("#divImage")hide();

if(mess!="]")// 如果获取的数据不为空

{

var type=eval(mess);

var str="<a>首页</a>"

for(var i=0;i<typelength;i++)

{

// *** 作type 获取东西

str+="<a>"+type[i]数据库字段名+"</a>

}

$("#divLinkMan")html(str);//把str嵌入div divLinkMan 中

}

else

{

var notfind="<h2>未找到数据<a href='/Mainhtm' target='_parent'>返回</a></h2>"

$("#divLinkMan")html(notfind);

}

},

complete:function()

{

//所有的都执行完后的方法

}

});

}

在使用Qt编写应用程序时,如果您想获取最后一个插入的记录的ID,可以使用以下方法:

1 在插入新记录之前,请确保您的表中有一个主键列,并将其设置为自增长(即自动增加)类型。

2 在执行INSERT语句时,使用数据库驱动程序提供的lastInsertId()函数来获取刚刚插入的记录的ID。例如,在SQLite中,您可以使用“SELECT last_insert_rowid()”查询最后插入行的ID。

3 如果您使用的是模型/视图框架(例如QSqlTableModel或QSqlQueryModel),则可以使用model->query()lastInsertId()或者model->record(row)value("id")toInt()来获取插入记录的ID。其中,“id”是您的表中的主键列名称。

需要注意的是,不同的数据库驱动程序和 *** 作系统可能会有所不同,因此具体的实现可能会因平台而异。同时,在处理敏感信息时,请务必遵循安全的编程实践,例如使用参数化查询等技术来防止SQL注入攻击。

setInterval(函数名,1000); t: Timer = new Timer(1000, 5); taddEventListener(TimerEventTIMER,函数名); taddEventListener(TimerEventTIMER_COMPLETE, 函数名); tstart();

以上就是关于QT多线程查询数据库显示到tablewidget里面全部的内容,包括:QT多线程查询数据库显示到tablewidget里面、jquery怎么把读取数据库的数据加载到table中、qt怎么获取当前添加到数据库的id等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9437030.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存