Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с соханением сторки в 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]

Народ, помогите. Очень надо сохранить слэш перед переводом строки.


Наверх

Титульная страница Поиск, карта сайта Написать письмо