2016-06-29 47 views
0

我有一个ADT,可以使用Advantage Data Architect进行修改。adsdb INSERT INTO

但我希望能够使用adsdb修改表。我已经创建了使用;

cnxn = adsdb.connect(DataSource='c:/Python27/', ServerType='1') 
cursor = cnxn.cursor() 
cursor.execute('CREATE TABLE Persons (PersonID INTEGER, LastName CHAR(100), FirstName CHAR(100))' 

我能够插入数据到PersonsID字段使用;

cursor.execute('INSERT INTO Persons (PersonID) VALUES (01)') 

但试图将数据插入char类型的列使用;

cursor.execute('INSERT INTO Persons (LastName) VALUES ("Smith")') 

我得到错误;

adsdb.OperationalError: Error 7200: AQE Error: State = S0000; NativeError = 2121; [iAnywhere Solutions][Advantage SQL Engine]Column not found: Smith -- Location of error in the SQL statement is: 40 

我试过在VALUE字段中使用单引号和没有引号,但我仍然出现错误。我已经提供了Google提供的错误代码,但是我找不到解决方案。

回答

0

在ADS SQL(实际上在ANSI-SQL)字符串(CHAR类型)值have to be enclosed in single quotes

INSERT INTO Persons (LastName) VALUES ('Smith') 

In Python a string literal既可以写在单或双引号:

print("Hello") 
print('Hello') 

由于正确的SQL语句不包含双引号,因此使用双引号字符串会更容易:

cursor.execute("INSERT INTO Persons (LastName) VALUES ('Smith')") 

如果你想使用一个单引号字符文字,你有逃脱的文字里面的单引号:

cursor.execute('INSERT INTO Persons (LastName) VALUES (\'Smith\')') 

但使用字符串插值或字符串连接来获得我不会那样做,因为值转换为SQL语句is very dangerous,并可导致SQL注入。

正确的方法是使用一个参数:

cursor.execute('INSERT INTO Persons (LastName) VALUES (?)', 'Smith') 

BTW:“人”是一个可怕的表名(的人多的是人,您应该使用“人”奥德“人”为表名)。

+0

明智的答案谢谢你。谢谢你的提示,Persons表只是为了测试:) – apmacniven