QT当中有关数据库,比如ODBC的功能都是以插件的形式来实现的
比如QT安装包里面都有很多plugin文件夹,里面就包括了很多相关的dirver
像要使用ODBC,都是需要调用QSqlODBCDriver.dll和对应的lib文件的
因此,如果写程序的时候使用动态编译,就需要在每次跑exe的时候,都到QT的安装目录下面去找对应的driver或者dll文件或者lib文件
这会导致程序在发布移植的时候出现很多问题,比如标题乱码之类的问题,同时还需要把所有相关的dll文件都随exe文件一起发布,十分不方便
因此,在实际的使用当中,一般都是需要使用提前在本机上编译好的静态链接库来代替原来的文件
这样编程的时候,就可以解决相关的问题了
不过还有一个问题,就是由于QT都是用plugin来实现很多附加的功能,而这些功能虽然安装了上去,但是默认是不开,我们需要在静态编译的使用命令行来确保这个plugin被添加了上去,同时还需要保证我们需要使用的那些功能plugin的driver都已经添加进去了
如果,当时没有将这些东西添进去,就必须重新静态编译一次,比较麻烦
这个需要我们注意
而像我们这次遇到的“driver not loaded”问题,就是这个问题的典型表现
通过将qsqldriver文件夹当中的文件移到exe所在文件夹中,是可以保证QT的程序在编译器中运行成功,但是,exe文件照样会出相同的“driver not loaded”错误
要保证不出现类似的错误,就要保证原有的程序在静态编译的QT程序包中通过编译,同时这个静态编译还要包括了ODBC,这个比较麻烦,可能只有等到最后才能解决这个问题了
不过总算还能用,很让人郁闷的ODBC和QT
注意一下,下面将转载一下网上很流行的一个静态库编译的方法:
http://blog.csdn.net/tonylk/archive/2009/02/06/3866926.aspx
注意上面这个网址也是转载的,真正写文章的人是夏威夷雪人,可惜qt中文论坛被我们代理屏蔽了,进不去,于是用个可用的网址,遗憾,不过这哥们是牛人,ym之
Thursday, March 12, 2009
Monday, March 9, 2009
无敌的[Microsoft][SQL Native Client]Encryption not supported on the client错误
对微软的东西已经有些无语了
在服务器上面的虚拟机上安装SQL Server 2005 Developer版,结果出现了诡异的错误
[Microsoft][SQL Native Client]Encryption not supported on the client
无论试验多少次,这个错误总是会按期出现
让我实在是有点郁闷,总共弄了两三天
这个错误还没有任何被解决的趋势
于是忍无可忍,决定google之,其实我老早应该google的
可惜对英文的帮助有点头大,然后,对中文的帮助十分无语(在不同的地方发现了同样的东西)
所以拖到现在,实在是失策
于是找了这个解决办法,竟然是用注册表,错误的原因也语焉不详
实在是有点郁闷了
于是贴一下网址:
http://social.msdn.microsoft.com/Forums/en-US/sqlsetupandupgrade/thread/f8b029ea-2296-4c62-835c-0fa023b3295c/
再次意识到MSDN真的是一个好东西
虽然很多时候里面的解释让人不知所云
顺便留下错误和注册表的信息,放置下次出错吧,汗死
首先是错误的说法:
SQL Server Setup could not connect to the database service for server configuration.
The error was:[Microsoft][SQL Native Client]Encryption not supported on the client.
Refer to server error logs and steup logs for more information.
For detials on how to view setup logs, see "How to View Setup Log Files" in SQL Server Books Onlines.
然后是注册表的信息:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\DB-Lib]
"AutoAnsiToOem"="ON"
"UseIntlSettings"="ON"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0]
"ProtocolsSupported"=hex(7):73,00,6d,00,00,00,74,00,63,00,70,00,00,00,6e,00,70,
00,00,00,76,00,69,00,61,00,00,00,00,00
"ProtocolOrder"=hex(7):73,00,6d,00,00,00,74,00,63,00,70,00,00,00,6e,00,70,00,
00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags]
"NumberOfFlags"=dword:00000002
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags\Flag1]
"Label"="Force protocol encryption"
"Value"=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags\Flag2]
"Label"="Trust Server Certificate"
"Value"=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\LastConnect]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\np]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000001
"ProtocolName"="Named Pipes"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\np\Property1]
"Name"="Default Pipe"
"Value"="sql\\query"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\sm]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000000
"ProtocolName"="Shared Memory"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000003
"ProtocolName"="TCP/IP"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property1]
"Name"="Default Port"
"Value"=dword:00000599
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property2]
"Name"="KEEPALIVE (in milliseconds)"
"Value"=dword:00007530
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property3]
"Name"="KEEPALIVEINTERVAL (in milliseconds)"
"Value"=dword:000003e8
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000002
"ProtocolName"="VIA"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA\Property1]
"Name"="Default Server Port"
"Value"="0:1433"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA\Property2]
"Name"="Default Client NIC"
"Value"="0"
在服务器上面的虚拟机上安装SQL Server 2005 Developer版,结果出现了诡异的错误
[Microsoft][SQL Native Client]Encryption not supported on the client
无论试验多少次,这个错误总是会按期出现
让我实在是有点郁闷,总共弄了两三天
这个错误还没有任何被解决的趋势
于是忍无可忍,决定google之,其实我老早应该google的
可惜对英文的帮助有点头大,然后,对中文的帮助十分无语(在不同的地方发现了同样的东西)
所以拖到现在,实在是失策
于是找了这个解决办法,竟然是用注册表,错误的原因也语焉不详
实在是有点郁闷了
于是贴一下网址:
http://social.msdn.microsoft.com/Forums/en-US/sqlsetupandupgrade/thread/f8b029ea-2296-4c62-835c-0fa023b3295c/
再次意识到MSDN真的是一个好东西
虽然很多时候里面的解释让人不知所云
顺便留下错误和注册表的信息,放置下次出错吧,汗死
首先是错误的说法:
SQL Server Setup could not connect to the database service for server configuration.
The error was:[Microsoft][SQL Native Client]Encryption not supported on the client.
Refer to server error logs and steup logs for more information.
For detials on how to view setup logs, see "How to View Setup Log Files" in SQL Server Books Onlines.
然后是注册表的信息:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\DB-Lib]
"AutoAnsiToOem"="ON"
"UseIntlSettings"="ON"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0]
"ProtocolsSupported"=hex(7):73,00,6d,00,00,00,74,00,63,00,70,00,00,00,6e,00,70,
00,00,00,76,00,69,00,61,00,00,00,00,00
"ProtocolOrder"=hex(7):73,00,6d,00,00,00,74,00,63,00,70,00,00,00,6e,00,70,00,
00,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags]
"NumberOfFlags"=dword:00000002
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags\Flag1]
"Label"="Force protocol encryption"
"Value"=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags\Flag2]
"Label"="Trust Server Certificate"
"Value"=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\LastConnect]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\np]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000001
"ProtocolName"="Named Pipes"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\np\Property1]
"Name"="Default Pipe"
"Value"="sql\\query"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\sm]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000000
"ProtocolName"="Shared Memory"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000003
"ProtocolName"="TCP/IP"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property1]
"Name"="Default Port"
"Value"=dword:00000599
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property2]
"Name"="KEEPALIVE (in milliseconds)"
"Value"=dword:00007530
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property3]
"Name"="KEEPALIVEINTERVAL (in milliseconds)"
"Value"=dword:000003e8
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000002
"ProtocolName"="VIA"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA\Property1]
"Name"="Default Server Port"
"Value"="0:1433"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA\Property2]
"Name"="Default Client NIC"
"Value"="0"
Saturday, March 7, 2009
关于数据库表设计的几点想法
好的设计依赖于标准化三范式
对数据库表的设计好坏的评价,应该只以标准化的三个范式来评价,即看一个表是否完成符合三大范式的要求
而不能看表当中列的多少,即使有很多属性也不能代表这个设计不好,更不能因为属性很多就考虑将一个本来可能设计的还好的表进行拆分,如果原来的表符合三范式的话,这种拆分就一定会产生不良设计的表(主要是依赖传递)
如何区分外键和依赖传递
关于外键和依赖传递的关系
给定一个表其中的一个属性,要确定它是外键,或者是依赖传递,可以看这么几点,注意这个属性本身必须满足一定条件,即需要是另一个表的主键
1. 如果属性是外键的话,这个属性不可能完全依赖于表的主键,即不可能对应一个不同的表的主键而有特定的值,可能出现不同的主键有同样值的这个属性。
事实上,可以这么理解,外键的字面意思就是说这个属性不是这个表中主键完全决定的,而是作为这个表和其他表之间通信的一个接口,连接到另外一个表当中。只是告诉我们这个主键对应的这一行值原来是连接到另一个表的那个主键的那一行值上面去的。
2. 如果属性是依赖传递的话,就和外键完全不一样,即这个属性完全依赖于主键,主键一旦发生变化,这个属性的值也一定会有一个变化,可以算的上是独立的一一对应的。
当属性决定于主键时,如果这个属性还是另外一个表的主键,那么另外一个表的属性可以看成是依赖这个属性,同时传递依赖于本表的主键,这个明显违反第三范式
因此,不管是检查表之间关系,还是需要对表进行拆分的时候,都需要认真找到外键,认真思考一下他们之间的关系,看到底是外键还是传递依赖。如果是传递依赖的话,建议一定要把这两个表合并才行。
3. 简单的说,就是看属性是否完全决定于主键,如果一个属性完全决定于主键的话(一个主键决定一个属性值),那么就是传递依赖,如果一个属性不决定于主键的话(几个主键可能有同一属性值),那么就是外键
注意确定外键很有作用,可以提前发现不标准的表设计,因此,在决定一个表关系设计之前,需要在确定一下外键,或者说明确好每个表之前的关系
同时,不要随意做出一个变化的决定,需要在变化之前想好这个变化的影响,比如将表拆分的时候,需要考虑拆分之后的表是否有传递依赖
对数据库表的设计好坏的评价,应该只以标准化的三个范式来评价,即看一个表是否完成符合三大范式的要求
而不能看表当中列的多少,即使有很多属性也不能代表这个设计不好,更不能因为属性很多就考虑将一个本来可能设计的还好的表进行拆分,如果原来的表符合三范式的话,这种拆分就一定会产生不良设计的表(主要是依赖传递)
如何区分外键和依赖传递
关于外键和依赖传递的关系
给定一个表其中的一个属性,要确定它是外键,或者是依赖传递,可以看这么几点,注意这个属性本身必须满足一定条件,即需要是另一个表的主键
1. 如果属性是外键的话,这个属性不可能完全依赖于表的主键,即不可能对应一个不同的表的主键而有特定的值,可能出现不同的主键有同样值的这个属性。
事实上,可以这么理解,外键的字面意思就是说这个属性不是这个表中主键完全决定的,而是作为这个表和其他表之间通信的一个接口,连接到另外一个表当中。只是告诉我们这个主键对应的这一行值原来是连接到另一个表的那个主键的那一行值上面去的。
2. 如果属性是依赖传递的话,就和外键完全不一样,即这个属性完全依赖于主键,主键一旦发生变化,这个属性的值也一定会有一个变化,可以算的上是独立的一一对应的。
当属性决定于主键时,如果这个属性还是另外一个表的主键,那么另外一个表的属性可以看成是依赖这个属性,同时传递依赖于本表的主键,这个明显违反第三范式
因此,不管是检查表之间关系,还是需要对表进行拆分的时候,都需要认真找到外键,认真思考一下他们之间的关系,看到底是外键还是传递依赖。如果是传递依赖的话,建议一定要把这两个表合并才行。
3. 简单的说,就是看属性是否完全决定于主键,如果一个属性完全决定于主键的话(一个主键决定一个属性值),那么就是传递依赖,如果一个属性不决定于主键的话(几个主键可能有同一属性值),那么就是外键
注意确定外键很有作用,可以提前发现不标准的表设计,因此,在决定一个表关系设计之前,需要在确定一下外键,或者说明确好每个表之前的关系
同时,不要随意做出一个变化的决定,需要在变化之前想好这个变化的影响,比如将表拆分的时候,需要考虑拆分之后的表是否有传递依赖
Subscribe to:
Comments (Atom)
