![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с соханением сторки в MS SQL
ДмирийК © (2003-03-21 14:41:00)Добрый день!
Я заполняю в Memo строку для сохранения в поле типа varchar, все работает нормально пока я не ставлю в конце какой-нибуд строки символ "\". В этом случае он при сохранении исчезает вместе с символами перевода строки. Например, если попытаться сохранить строку "111\"#$D#$A"222\" , то сохраниться "111222\".
Как это побороть?
ДмирийК (2003-03-24 13:50:00) [1]Спасибо!
Димон1 (2003-03-24 13:33:00) [2]Уважаемый ДмирийК!
Я не считаю описываемое Вами явление проблемой!
Просто интерпритатор SQL запроса так понимает, то что вы ему говорите. А говорите Вы ему примерно следующее:
UPDATE Projects
SET Nazvanie = "проверка
такой
формы\
выполнения запроса"
WHERE (Obj_id = 310)
Был бы Я на месте вашего sql сервера, я бы вообще не принял такую форму записи запроса.
Предлагаю 2 варианта решения проблемы:
1. (Наиболее простой и естественный) Пользоваться параметрами! (см.выше)
2. Писать всякие управлющие символы, в том числе и CR LF, так как этого требут MSSQL, то есть:
SET Field1="First line." + CHAR(13) + CHAR(10) + "Second line."
см.: mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\acdata.chm::/ac_8_con_03_7mch.htm
The CHAR function can be used to convert an integer code to an ASCII character. This is useful when trying to specify control characters, such as a carriage return or line feed. Use CHAR(13) and CHAR(10) to put a carriage return and new line in a character string:
PRINT "First line." + CHAR(13) + CHAR(10) + "Second line."
ДмирийК (2003-03-24 13:21:00) [3]Ответивших кроме вас было всего двое, и у проверившего (Димон1) проблема на стороне SQL сервера есть.
Fiend (2003-03-24 13:12:00) [4]Шо тут сказать, проблема не типичная, т.е. я такого никогда не втречал, да и большинство ответивших я смотрю просто недоумевают в чем дело.
Крутить в сервере ничё не надо. подобных настроек у него нету.
Правда наводит на мысль что может вы при установке выбрали какой то нехороший Collate?
Посмотрите шо у вас дефолтом стоит для базы и сервера
ДмирийК (2003-03-24 12:57:00) [5]Какой тригерок? У меня в базе одна таблица и все, может сам MS SQL где подстроить надо?
Fiend (2003-03-24 12:51:00) [6]а может где триггерок стоит?
ДмирийК (2003-03-24 12:41:00) [7]Люди, мне параметры не с руки использовать, кто-нибудь знает в чем дело и как это побороть в корне?
ДмирийК (2003-03-24 11:41:00) [8]Удваивание слэша не помогает, так как второй слэш убирается вместе с переводом строки.
Димон1 (2003-03-24 11:31:00) [9]Получилось так:
Проверка
такой
формывыполнения запроса
Димон1 (2003-03-24 11:27:00) [10]я попробовал в Enterprize Manager"e выполнил такой запрос:
UPDATE Projects
SET Nazvanie = "проверка
такой
формы\
выполнения запроса"
WHERE (Obj_id = 310)
слеш потерялся!
Димон1 (2003-03-24 11:19:00) [11]Отличается.
Попробуй с параметрами, как у меня. Должно получиться!!!
мой MS SQL Product Version: 8.00.534 (SP2)
Romkin (2003-03-24 11:03:00) [12]попробуй удвояивать "\" Хотя и странно
ДмирийК (2003-03-24 10:37:00) [13]А у вас сервиспаки для SQL какие-нибудь стоят?
ДмирийК (2003-03-24 10:25:00) [14]У меня есть процедура
procedure ExecSQL(text: string);
var
Command: TADOCommand;
begin
Command := TADOCommand.Create(nil);
Command.Connection := SQL.Connection;
Command.CommandTimeout := 30;
Command.CommandText := text;
Command.Execute;
Command.Free;
end;
При выполнении следующего кода проявляется моя проблема.
Value := mValue.Lines[0];
for i:=1 to mValue.Lines.Count-1 do
Value := Value + #13#10 + mValue.Lines[i];
ExecSQL("UPDATE Configuration SET Name="""+edName.Text+""", Val="""+Value+""" WHERE Code="+IntToStr(Code));
Если вместо Value использовать mValue.Lines.Text, то тоже самое.
В мой пример отличается от вашего?
Димон1 (2003-03-24 09:34:00) [15]у меня тоже простой мемо (не дбмемо). Сохнаняю так:
with dm.ADOQuery1 do
begin
Close;
SQL.Text := "UPDATE PROJECTS SET "+
"Nazvanie=:p01 " +
"WHERE OBJ_ID=:p99 ";
with Parameters do
begin
ParamByName("p01").Value := Nazvanie ;
ParamByName("p99").Value := Obj_ID ;
end;
if ExecSQL<>1 then raise Exception.Create(
"Ошибка в TProjPassport.Save RowsAffected<>1");
Close;
end;
описанной тобой проблемы нет
ДмирийК (2003-03-24 09:28:00) [16]У меня тоже база MSSQL2000, но я имею ввиду обычный memo (не dbmemo). Я в общем то согласен вручную обработать строку перед сохранением, скажите только как.
Димон1 (2003-03-24 09:09:00) [17]у меня тоже база MSSQL2000 с мемо полями, такой проблемы нет
ДмирийК (2003-03-24 08:41:00) [18]Народ, помогите. Очень надо сохранить слэш перед переводом строки.