2016-06-29 14 views
0

Advantage Data Architectを使用して変更できるADTがあります。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フィールドにデータを挿入できます。

ただし、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はエラーコードをGoogleに提供していますが、解決策はほとんど見つかりませんでした。 SQL文字列(実際ANSI-SQLで)ADSで

答えて

0

(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') 

正しい方法は、パラメータを使用されるだろう「人は」ひどいテーブル名がある(人の複数は、人々は、あなたが「人」としてオーデル「人」を使用する必要がありますのいずれかでありますテーブル名)。

+0

Jensさんに嬉しい回答ありがとうございます。ヒントをお寄せいただきありがとうございます.Personsテーブルはテストのためのものです:) – apmacniven