![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наступил на очередные грабли
paul_k © (2006-05-30 13:47:00)Есть БД MSSQL 2000, SP 4
есть запрос
TmpSql:=TADOQuery.Create(nil);
TmpSql.Connection:=dm.ac_main;
dm.ac_main.Open;
текст запроса формируется в процесе исполнения.
TmpSql.SQL.Clear;
TmpSql.SQL.Add('INSERT INTO tal_log_data(ip, log_date, log_time, metod, url, srv_resp, traf, referer, srv_name, br_full_str, br_type, br_version, site_name, file_ext)');
TmpSql.SQL.Add('values(');
TmpSql.SQL.Add(''''+StringGrid1.Cells[0,i]+''',');
TmpSql.SQL.Add('convert(datetime,'''+StringGrid1.Cells[1,i]+''',106),');
TmpSql.SQL.Add('convert(datetime,'''+StringGrid1.Cells[2,i]+''',108),');
TmpSql.SQL.Add(''''+StringGrid1.Cells[3,i]+''',');
TmpSql.SQL.Add(''''+StringGrid1.Cells[4,i]+''',');
TmpSql.SQL.Add(StringGrid1.Cells[6,i]+',');
TmpSql.SQL.Add(StringGrid1.Cells[7,i]+',');
TmpSql.SQL.Add(''''+StringGrid1.Cells[8,i]+''',');
TmpSql.SQL.Add(''''+StringGrid1.Cells[9,i]+''',');
TmpSql.SQL.Add(''''+StringGrid1.Cells[10,i]+''',');
TmpSql.SQL.Add(''''+StringGrid1.Cells[11,i]+''',');
TmpSql.SQL.Add(''''+StringGrid1.Cells[12,i]+''',');
TmpSql.SQL.Add(''''+StringGrid1.Cells[19,i]+''',');
TmpSql.SQL.Add(''''+StringGrid1.Cells[20,i]+'''');
TmpSql.SQL.Add(')');
с завидной регулярностью получаю
Parameter object is improperly defined. Inconsistent or incomplete information was provided
При этом из Аналайзера запрос выполняется на ура.
Текст запроса
INSERT INTO tal_log_data(ip, log_date, log_time, metod, url, srv_resp, traf, referer, srv_name, br_full_str, br_type, br_version, site_name, file_ext)
values(
'72.36.182.34',
convert(datetime,'30 Apr 2006',106),
convert(datetime,'14:29:57',108),
'GET',
'/link/\" http://vymp.ru\"',
404,
12957,
'-',
'',
'Goku/1.16 (Goku; http://goku.ru/bot.htm;bot@goku.ru)',
'Goku',
'1.16',
'flat-design.ru',
''
)
Собственно вопрос - в чем грабли себе закопал?
paul_k (2006-05-31 14:47:00) [21]С двоеточием понял, спасибо.
Вот только не понял как в строке
select * from XXX where YYY='Z:D'
это двоеточие внутри кавычек вылезет как параметр.
Ибо не наступал пока на эти грабли.
Остался вопрос о "любви и нелюбви" параметров.
В результате весь этот инсерт завернут в процедуру.
слеедовательно вопрос как и почему грамотнее писать
1. AdoStoredProc и параметры?
2. TAdoQuery прописывать строкуexec proc_name @field1 = :param1...и заполнять параметры при необходимости?
3. TAdoQuery и перед вызовом ExecSql формировать строкуexec proc_name @field1 = value1...?
ЮЮ (2006-05-31 05:04:00) [22]Если пользоваться параметрами принципиально не желаешь, то отключи ParamCheck у TmpSql, ибо когда в тексте запроса встречается символ : он интерпретируется как параметр
paul_k (2006-05-30 14:24:00) [23]> [4] Johnmen © (30.05.06 14:15)
двоеточия остались... Ошибка не вылазит.
а что таки изменится? скорость работы вырастет?
Запрос все равно выносится в ХП. вместо insert ставится exec sp_add
> [5] evvcom © (30.05.06 14:17)
ещё раз повторю ты не мудри.. толком поясни да?
Запрос, кстати, меняется.
evvcom (2006-05-30 14:17:00) [24]
> ты пальцем покажи
ну а через параметры не пробовал? И без постоянной перезаписи SQL. Он же, наверное, не меняется?
Johnmen (2006-05-30 14:15:00) [25]
> paul_k © (30.05.06 14:12) [3]
> > [1] Johnmen © (30.05.06 14:01)
> А что это изменит?
Всё и радикально!
Кстати, ошибка у тебя была из-за наличия : в склеиваемых строках. Да ещё и кавычки, как содержимое...
paul_k (2006-05-30 14:12:00) [26]> [1] Johnmen © (30.05.06 14:01)
А что это изменит?
ну кину на форму запрос передам ей эту радость в качестве параметров а что изменится то?
кстати убрал кавычки в
'/link/\" http://vymp.ru\"',
эта абшибка исчезла.
Но все равно не понятно Аналайзер запрос кушает а дельвя - нет
> [2] evvcom © (30.05.06 14:04)
> Блин, любители динамических граблей!
ты это, не мудри ты пальцем покажи
evvcom (2006-05-30 14:04:00) [27]Блин, любители динамических граблей!
Johnmen (2006-05-30 14:01:00) [28]Вот и надо использовать упомянутые параметры. В запросе....