Я в согласии с OP здесь - никакая капча - это не очень woot способ сделать вещи.
Во-первых поставил несколько капканов бота. Я упоминал бы BOC чаще на домашней странице, для захвата ботов во взгляд, поскольку боты не интеллектуальны, поэтому снова формулируя отличающийся каждый раз, например, "жалобы BOC!" - таким образом, боты, просто сканируя для ключевых слов будут захвачены.
Однако я думаю, что реальная проблема здесь является двукратной, во-первых проблемы производительности, что у Вас есть потребность, которая будет обращена, сегодня это - боты, вызывающие проблему, но она указывает мне, что существует проблема производительности, которая будет обращена.
, Во-вторых, это - бизнес-возможность сместить немного реального дерьма с прибылью. Таким образом, я оставался бы с полным стилем woot и состоянием, "мы проверяем на ботов. Если мы будем думать, что Вы - бот, то Вы получите поле botcrap".
проверка бота была бы сделана офлайн когда-то после того, как продажа была сделана, с помощью прерываний бота, IP-адресов, cookie, сессий, строки браузера и т.д. Делают некоторый серьезный анализ с данными, которые Вы имеете покупателей для решения, кто получает botcrap. Если Вы решаете поставить botcrap - затем можно освободить немного нормального дерьма, чтобы продать кому-то еще.
Чтобы эта работа работала, вы должны использовать каждый параметр только один раз в предложении SQL. Чтобы использовать один и тот же параметр более одного раза, просто объявите его с новым именем. Не знаю, почему это так, но знаю, что это может сильно раздражать.
У меня была возможность попробовать это с компилятором :) Я должен когда-нибудь установить его дома.
Хотя я все еще нахожу ваше использование WITH необычным, похоже, он работает В ПОРЯДКЕ.
Я видел ошибку, которую вы получаете в нескольких случаях:
В результате лучше всего либо назначить свойство SQL.Text (как вы), либо, если вы используете .Add ('SELECT ...'), использовать пару SQL.BeginUpdate / SQL.EndUpdate.
Исходный ответ:
with AQ_Query do
begin
try
AQ_Query := TADOQuery.Create(nil);
ConnectionString := strConnectionString;
Хотя это, кажется, работает, кажется немного странным ссылаться на объект до его создания.
AQ_Query должен быть создан перед оператором with:
AQ_Query := TADOQuery.Create(nil);
with AQ_Query do
begin
try
ConnectionString := strConnectionString;
Еще лучше не использовать WITH - это вызывает проблемы.
Также обратите внимание, что создание объекта должно быть ДО попытки .. наконец. Как написано, у вас будет предупреждение компилятора. Не игнорируйте их - они помогут вам писать лучший код.
Хотя эта ошибка сложна, вы можете достаточно ее диагностировать, чтобы убедиться, что ваш запрос действителен. Проблема в ваших параметрах. Лучший способ найти истинную проблему - это заставить SQL Server Profiler отслеживать вашу базу данных при поступлении запроса. Он покажет вам, как интерпретировались параметры. Скопируйте этот запрос в текстовый редактор, чтобы узнать, в чем заключается ваша проблема.
Если вы не можете использовать SQL Server Profiler, вы должны просто вывести значения «BenuNr» и «strToken» на экран или консоль, чтобы вы могли действительно посмотрите, что вы передаете в качестве параметров.
Вам не нужно указывать DataType
. После успешного вызова Prepare;
параметры должны быть настроены правильно на основе определения таблицы сервера.
Я предполагаю, что, назначив DataType
, параметр, вероятно, будет сброшен и некоторая информация отсутствует, например, ParamType
должен быть ptInput
, но сброшен на ptUnknown
или что-то в этом роде.
Попробуйте удалить те строки, где вы установили DataType и посмотрите, поможет ли это.
Ой. Вы просто попадаете в то, что наш системный архитектор на работе называет «худшей ошибкой в истории». Это довольно общая ошибка, которая может означать разные вещи. Но я когда-либо видел это только в операторах INSERT, поэтому попробуйте поискать там. Это вызвано определением, что ADO каким-то образом не соответствует схеме базы данных.
Попробуйте сократить свой запрос, чтобы выполнить только вставку, и используйте профилировщик SQL, включенный в SQL Management Studio, чтобы посмотреть, что ADO делает, когда запускает его. . Скорее всего, он запросит структуру вашей таблицы, сравнит ее со структурой вашего оператора и, в конечном итоге, ему не понравится то, что он найдет, и никогда не отправит команду INSERT в базу данных.
Убедитесь, что вы сделали это. получили правильные типы данных в полях, и что вы можете успешно запустить INSERT в эту таблицу, используя только эти два значения. Это может не сработать - это , в конце концов, худшая ошибка, но она должна дать вам отправную точку.
Until now, I did not fix the problem.
But I guess the issue lies somewhere inside the Parameters and how they are accessed. The compiler picks them by index, not by name as I was assuming.
Having a closer look at the TADOQuery Component in the OI (especially at the TParameters section) you can see that indexes.
In the end it it probaply neccecary to first, add a parameter, assign a name to it and then insert a value, or something like this.