2

複製と解決の両方に問題があるという奇妙な問題があります。

Python で pyodbc ライブラリを使用して、MS Access 2007 データベースにアクセスしています。スクリプトは基本的に、csv ファイルを Access にインポートするだけで、その他のいくつかのトリックもあります。

最初に「ギフトヘッダー」を保存しようとしています-次に、保存されている自動インクリメントID(GiftRef)を取得し、この値を使用して1つ以上の関連する「ギフトの詳細」を保存します。

90% の確率で、すべてが正確に機能します。残りの 10% の時間は、Access がスタックしているように見え、cur.execute("select last(GiftRef) from tblGiftHeader") に対して同じ値を繰り返し返します。

スタックすると、スクリプトの実行中にこの値が返されます。特定のエントリの処理中または実行中の特定の時点で発生するのではなく、完全にランダムに発生するようです。

また、間違った値を返していることも知っています。つまり、ギフトヘッダー保存されており、新しい一意の ID が与えられていますが、何らかの理由で、呼び出されたときにその値が正しく返されません。

SQL = "insert into tblGiftHeader (PersonID, GiftDate, Initials, Total) VALUES "+ str(header_vals) + ""
cur.execute(SQL)

gift_ref = [s[0] for s in cur.execute("select last(GiftRef) from tblGiftHeader")][0]

cur.commit()

任意の考えや洞察をいただければ幸いです。

4

2 に答える 2

0

うん!これは、最後の ID を取得するより信頼性の高い方法のようです。私の最初のコードは、ここの例に基づいていたと思いますhttp://www.w3schools.com/sql/sql_func_last.aspは、文脈から外したと思います。

アシストありがとう!元のコードの更新版 (接続文字列付き) は次のとおりです。

MDB = 'C:\\Users\\Public\\database.mdb'
DRV = '{Microsoft Access Driver (*.mdb)}'
conn = pyodbc.connect('DRIVER={};DBQ={}'.format(DRV,MDB))
curs = conn.cursor()

SQL = "insert into tblGiftHeader (PersonID, GiftDate, Initials, Total) VALUES "+ str(header_vals) + ""
curs.execute(SQL)
curs.commit()
curs.execute("SELECT @@IDENTITY AS ID")
row = curs.fetchone()
gift_ref = row.ID
于 2013-10-17T19:19:31.773 に答える