易截截图软件、单文件、免安装、纯绿色、仅160KB

pymssql访问sqlserver的一个bug


  对数据库进行多表操作,如果表与表之间存在依赖,那么显式的使用事务,可以保持对数据库操作的原子性。用Python访问SqlServer数据库,我使用pymssql库。今天在使用这个库的时候,发现一个问题。
问题大概是这样的:
  我有两张表,一张主表(ClassInfo),一张从表(Student),Student表通过外键ClassID与ClassInfo表进行关联。这两张表的主键都是自增型的int型字段。
  创建表的SQL语句如下:
CREATE TABLE ClassInfo(
ClassID INT IDENTITY(1, 1) PRIMARY KEY,
ClassName VARCHAR(20) NOT NULL
)
GO
CREATE TABLE Student(
StudentID INT IDENTITY(1, 1) PRIMARY KEY,
ClassID INT NOT NULL,
StudentName VARCHAR(20) NOT NULL,
FOREIGN KEY (ClassID) REFERENCES ClassInfo(ClassID)
)
GO
  在代码中,先创建一个班级,然后在班级中插入学生数据。如果这两个操作在一个事务中完成,一般情况下,按照pymssql提供的文档,我们会写这样的语句来实现:
import pymssql
conn = pymssql.connect(host = 'JGood\\SQLEXPRESS', database = "Study",
user = "sa", password = "sa")
cur = conn.cursor()
#往主表中添加一条记录
cur.execute("INSERT INTO [ClassInfo] ([ClassName]) VALUES (%s)", 'jk0403')
#获取ID。
cur.execute("SELECT @@identity as ID")
classID = cur.fetchone()[0]
#往从表中添加记录
cur.execute("INSERT INTO [Student] (ClassID, StudentName) VALUES (%d, %s)",
(classID, 'JGood'))
conn.commit()
cur.close()
conn.close()

  但是很遗憾,在运行代码的时候,出错了:
  如果我把上面的操作分成两个独立的事务来实现,发现是没有问题的。
  经过一下午地摸索,终算找到一个解决办法,就是把自增的ID以拼字符串的形式添加到SQL语句里,而不是以SQL参数的形式。
#往从表中添加记录
cur.execute("INSERT INTO [Student] (ClassID, StudentName) VALUES (" + str(classID) + ", %s)", ('JGood', ))

  我不知道这算不算是pymssql的一个bug:在一个事务中,对于自动生成的外键值,不能以SQL参数的形式插入数据库。


相关文档:

SQLServer数据库

 Sybase SQL Server体系结构介绍
摘要:本文主要对Sybase SQL Server体系结构进行介绍,便于读者对Sybase SQL Server有个整体大概的了解。
标签:Sybase SQL Server  Sybase  SQL Server  体系结构
 
Sybase SQL Server是一个多库结构的RDBMS,体系结构大致如下:
1.数据库 ......

SQLServer和Oracle常用函数对比


数学函数
在oracle 中distinct关键字可以显示相同记录只显示一条
  1.绝对值
  S:select abs(-1) value
  O:select abs(-1) value from dual
  2.取整(大)
  S:select ceiling(-1.001) value
  O:select ceil(-1.001) value from dual
  3.取整(小)
  S:select floor(-1.001) value ......

SQLServer的CONVERT函数介绍

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yf520gn/archive/2008/09/26/2982363.aspx
SELECT * from TB_MILES_CB_ORDER
WHERE convert(varchar(100),ORDER_DATE,102)= ?
ORDER BY ORDER_NO
SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
SELECT CONVERT(varchar(100), GETDATE ......

sqlserver 性能优化--Join说明

由于工作需求,要对负责的产 品做点性能优化,在网上找到了相关的东西,拿 出来与大家分享:
看到很多朋友对数据库的理解、认识还是没有突破一个瓶颈,而这个瓶颈往往只是一层窗纸,越过了你将看到一个新世界。
04、05年做项目的时候,用SQL Server 2000,核心表(大部分使用频繁的关键功能每次都要用到)达到了800万数据 ......

sqlserver:openrowset / oracle:table/view@dblink名

只是sqlserver 提供的远程数据访问函数;  在本地sqlserver 中取外部数据源数据时候可用;
对连接本地 oracle 操作远程 oracle 不能使用; 测试: pl/sql 中使用:
select * from openrowset(................); 无效!!!!!!!!!!!!!!
在oracle 中需要访问远程数据,需要建立一连接远程oracle 的 dblink ;
再用如下方 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号