2010-04-08 1 views
2

Я использую pyodbc, чтобы поговорить с устаревшим файлом Access 2000 .mdb.Использование pyodbc для вставки строк в MS Access MDB, как мне избежать параметров?

У меня есть курсор, и я пытаюсь выполнить это:

 
c.execute("INSERT INTO [Accounts] ([Name], [TypeID], [StatusID], [AccountCat], [id]) VALUES (?, ?, ?, ?, ?)", [u'test', 20, 10, 4, 2]) 

Однако это приводит к

 
pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented (106) (SQLBindParameter)') 

Я понимаю, что я могу просто изменить знаки вопроса на буквальное значения, но по моему опыту правильное экранирование строк по базам данных ... не очень.

PHP и mysql объединяются, чтобы привести mysql_real_escape_string и друзей, но я не могу найти функцию pyobbc для экранирования значений.

Если вы могли бы сообщить мне, что рекомендуемый способ вставки этих данных (из python), это было бы очень полезно. В качестве альтернативы, если у вас есть функция python для выхода из строк odbc, это также будет здорово.

ответ

2

Ну, очевидно, это просто доступ, кричащий на меня снова.

Раньше я вставлял целые числа python. Теперь я попытался вставить python longs.

При установке длинной в качестве параметра, я получаю

 
pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented (106) (SQLBindParameter)') 

Добавление этого кода в моей функции как раз перед вызовом Execute исправляет это:

 
    for k, v in new.items(): 
     new[k] = int(v) if isinstance(v, long) else v 

IOW, заменив лонги с Интс работает отлично , Go Access, какая описательная ошибка.

Строго говоря, я не думаю, что это ошибка в pyobbc, а скорее вопрос, связанный с этим конкретным драйвером. Все равно, спасибо за помощь.

+0

Каково определение длинного типа данных Python? Если он превышает емкость длинного целого числа Jet, то именно поэтому вы не можете его использовать. Если это причина проблемы, это выглядит как ошибка пилота для меня, т. Е. Вы пытались сделать что-то, не понимая полностью типы данных целевого db. –

+0

В Python, longs имеют произвольную емкость. Python будет прозрачно продвигать ints в longs, когда это необходимо, но он не будет автоматически уменьшаться (поэтому int (24) является целым числом, а long (24) является длинным, но оба int (2400000000) и long (2400000000) являются longs). Поэтому совершенно очевидно, что программист Python не знает, использует ли их программа longs, ints или сочетание двух под обложками. И небезосновательно ожидать, что pyobbc примет оба, если они находятся в радиусе действия. –

Смежные вопросы