• 13348阅读
  • 17回复

[讨论]这个问题真心要纠结死了 [复制链接]

上一主题 下一主题
离线sjyzhxw
 
只看楼主 倒序阅读 楼主  发表于: 2012-05-22
  1. void Welcome::connectDB()
  2. {
  3.     int currentIndex=mainWelcome->currentIndex();
  4.     QString studentPattern="1010[0-9]{6,6}",teacherPattern="200[0-9]{7,7}";
  5.     QRegExp studentReg(studentPattern),teacherReg(teacherPattern);
  6.     bool notMatch=false;
  7.     //正则表达式 来确认当前输入的账号是否符合当前所选身份
  8.     if((currentIndex==0 && !studentReg.exactMatch(student->getStudentUID()))
  9.             ||(currentIndex==1 && !teacherReg.exactMatch(teacher->getTeacherUID()))
  10.             ||(currentIndex==2 && admin->getAdminUID()!="admin") )
  11.     {
  12.         notMatch=true;
  13.     }
  14.     if(notMatch)
  15.     {
  16.         QMessageBox *errorMsg=new QMessageBox(QMessageBox::Warning,tr("账号错误!"),tr("输入账号与当前选择身份不符!"),
  17.                                               QMessageBox::Ok,this);
  18.         errorMsg->show();
  19.         return;
  20.     }
  21.     db = QSqlDatabase::addDatabase("QODBC3");
  22.     if(detailWidget->isHidden()){
  23.         QString dsn=QString("Driver={sql server};server=127.0.0.1;database=SchoolManagement;uid=errorUID;psw=errorPsw");
  24.         db.setDatabaseName(dsn);
  25.         db.setHostName(QString("127.0.0.1"));
  26.         db.setPort(1433);
  27.     }else{
  28.         db.setHostName(hostNameLine->text());
  29.         db.setPort(portLine->text().toInt());
  30.         db.setDatabaseName(dbNameLine->text());
  31.     }
  32.     //根据身份初始化不同窗口
  33.     switch(currentIndex)
  34.     {
  35.     case 0:
  36.         db.setUserName(student->getStudentUID());
  37.         db.setPassword(student->getStudentPsw());
  38.         break;
  39.     case 1:
  40.         db.setUserName(teacher->getTeacherUID());
  41.         db.setPassword(teacher->getTeacherPsw());
  42.         break;
  43.     case 2:
  44.         db.setUserName(admin->getAdminUID());
  45.         db.setPassword(admin->getAdminPsw());
  46.         break;
  47.     }
  48.     //是否成功连接
  49.     bool connectOK=db.open();
  50.     if(connectOK){
  51.         //成功登陆后隐藏登陆窗口
  52.         qDebug()<<"Connected!";
  53.         setVisible(false);
  54.         switch(currentIndex)
  55.         {
  56.         //分登陆角色构建窗口
  57.         case 0:
  58.             //选择学生,初始化一个学生窗口
  59.             student->createStudentMainWindow(db);
  60.             break;
  61.         case 1:
  62.             teacher->createTeacherMainWindow(db);
  63.             break;
  64.         case 2:
  65.             admin->createAdminMainWindow(db);
  66.             break;
  67.         }
  68.     }else{
  69.         //弹出对话框提示错误,重新登录
  70.         QMessageBox *errorMsg=new QMessageBox(QMessageBox::Critical,tr("连接错误!"),tr("请检查相关信息是否正确!"),
  71.                                               QMessageBox::Ok,this);
  72.         errorMsg->show();
  73.     }
  74. }
在自己电脑上运行正常,但是在其他电脑上就无法登陆。
是代码的问题还是数据源设置的问题呢。。
求教啊

离线dbzhang800

只看该作者 1楼 发表于: 2012-05-22
程序发布时,相应的数据库插件发布没?
离线uidab

只看该作者 2楼 发表于: 2012-05-22
楼上说的对,一般在自己电脑上能运行都不是代码问题了!
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线sjyzhxw
只看该作者 3楼 发表于: 2012-05-22
回 1楼(dbzhang800) 的帖子
有QtSql4.dll的
离线roywillow

只看该作者 4楼 发表于: 2012-05-22
回 3楼(sjyzhxw) 的帖子
那么插件的位置如何?你放在什么位置了?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 5楼 发表于: 2012-05-23
Re:回 1楼(dbzhang800) 的帖子
引用第3楼sjyzhxw于2012-05-22 19:13发表的 回 1楼(dbzhang800) 的帖子 :
有QtSql4.dll的

也就是除此之外,你没有意识到还需要发布插件喽

http://hi.baidu.com/cyclone/blog/item/d77a86182fb915b84bedbc57.html
离线sjyzhxw
只看该作者 6楼 发表于: 2012-05-23
回 5楼(dbzhang800) 的帖子
把我的源码拿到同学的电脑上编译release以后,放回我的电脑,可以正常访问数据库。
但是
把我的数据库分离以后附加到他的电脑上(都是SQL Server2008)
然后建立相同的登录名(admin)却无法用这个程序访问数据库。

我还搞了一个详细设置选项,可以在里面填ODBC数据源的名字,但是还是不行。
离线sjyzhxw
只看该作者 7楼 发表于: 2012-05-23


如图所示。我的ODBC数据源名是Server,设置默认数据库就是SchoolManagement

如果在程序ODBC数据源那一项填入其他名字是无法连接的,说明是起作用的。
同学的电脑上附加和我一样的数据库,ODBC数据源那里输入他的数据源名称,却无法连接。请问是怎么回事?
数据库连接部分的代码就是一开始发的了。
离线dbzhang800

只看该作者 8楼 发表于: 2012-05-23
我对数据库方面不了解,不过你始终没回答大家的问题 :odbc的数据库插件你到底发布了没?

离线sjyzhxw
只看该作者 9楼 发表于: 2012-05-23
回 8楼(dbzhang800) 的帖子
不是很了解这个插件指什么。。
是指Qt\4.8.1\mingw\plugins\sqldrivers下的dll文件吗?

今天我发现,同学和我都装Qt,各自编译一个exe文件,在我的电脑上配套我的dll文件,包括libgcc_s_dw2-1,mingwm10,QtCore4,QtGui4,QtSql4
可以正常运行,用他电脑copy过来的dll则不行。

我编译release的exe,配套他的dll可以运行,配套我的则不行。
离线roywillow

只看该作者 10楼 发表于: 2012-05-23
回 9楼(sjyzhxw) 的帖子
编译器是不是一样?
我觉得不是Qt\4.8.1\mingw\plugins\sqldrivers下的dll
而是sqldrivers这个文件夹……
你直接把里面的dll复制到程序目录下没有意义的,要放在这个名字的文件夹中才行
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线sjyzhxw
只看该作者 11楼 发表于: 2012-05-23
我又逐个排除,问题出在QtCore4.dll上。

其他的dll用哪个都无所谓,在我的电脑上只有用我的dll才可以正常连接数据库。什么原因??
离线sjyzhxw
只看该作者 12楼 发表于: 2012-05-23
回 10楼(roywillow) 的帖子
qsqlodbc4.dll有没有的无所谓(应该是因为我们都装Qt了)

不同的QtCore4.dll导致不同的结果。。
离线jdwx

只看该作者 13楼 发表于: 2012-05-24
看看程序的依赖关系吧,还有dll的版本是否对应。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线dbzhang800

只看该作者 14楼 发表于: 2012-05-24
Re:回 10楼(roywillow) 的帖子
引用第12楼sjyzhxw于2012-05-23 23:28发表的 回 10楼(roywillow) 的帖子 :
qsqlodbc4.dll有没有的无所谓(应该是因为我们都装Qt了)
不同的QtCore4.dll导致不同的结果。。

从开始直到你得出的这个结论,都说明一个问题:你没有发布插件,或者插件位置放置的不对。


建议:仔细看一下我前面贴的链接


------------------
题外:QtCore4.dll 确实包含一些路径,取决于Qt编译时所在的路径 或安装路径(如果你使用的是官方的安装包)。换言之,它能找到你安装Qt时安装的plugin 位置。如果你对此感兴趣,可以看看这个 http://blog.csdn.net/dbzhang800/article/details/6543489






离线benbenmajia

只看该作者 15楼 发表于: 2012-05-24
回 14楼(dbzhang800) 的帖子
你啥时候这么多汗了,...哈哈
安然.....
离线sjyzhxw
只看该作者 16楼 发表于: 2012-05-24
回 14楼(dbzhang800) 的帖子
而后将 可执行文件 与 需要的动态库放到同一个文件夹下,一般需要

myprogram.exe
mingwm10.dll
libgcc_s_dw2-1.dll
qtcore4.dll
qtgui4.dll
有同学抱怨,动态库拷过去以后,程序报错 无法定位程序输入点于动态链接库QtCore4.dll上 ,这一般是由于系统中装了多套Qt的运行库,而你拷贝的不是Qt安装目录下的库所导致的。比如,当安装的是Qt SDK时,很容易导致这个问题,因为里面的Qt是mingw编译的,但里面的QtCreator是msvc编译的,所以不少人不小心就吧QtCreator带的Qt运行库拷过来了。
------------------
这几个dll肯定没搞错,那就应该是插件的问题了吧。
插件就是E:\QtSDK\Desktop\Qt\4.8.1\mingw\plugins\sqldrivers这里面的dll吧
也就是应该在exe的目录下有一个子目录sqldrivers里面放有qsqlodbc4.dll即可。

对不?
离线sjyzhxw
只看该作者 17楼 发表于: 2012-05-24
确实是上面那样的。。
我一直以为只要有bin目录下的QtSql4.dll就可以了。。

多谢大家了
快速回复
限100 字节
 
上一个 下一个