Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.11.21;
Скачать: [xml.tar.bz2];

Вниз

Сюрприз при использовании ADO + MS SQL + пустой параметр ftString   Найти похожие ветки 

 
И. Павел ©   (2010-08-31 11:26) [0]

Здравствуйте.

Наткнулся на странный результат выполнения запроса, с использованием пустого строкового параметра в MS SQL SERVER 2005. Вот такой код:
ADODS.Active := false;
ADODS.CommandText := "SELECT … FROM USERLIST.dbo.UserInf WHERE login=:PLogin AND password= :PPassword";
ADODS.Parameters.ParseSQL(ADODS.CommandText, true);
ADODS.Parameters.ParamByName("PLogin").Value := login;
ADODS.Parameters.ParamByName("PPassword").Value := password;
ADODS.Open;

В случае если пароль пустой (т.е. password = ""), возникает ошибка (EOleException):
"The data types varchar and text are incompatible in the equal to operator".

То есть SQL SERVER почему-то считает, что пустой параметр типа ftString имеет тип Text.
Эта же ошибка возникает, если вручную задавать DataType и Direction параметра.

Поле “password” имеет тип “varchar(50)”.

А если закомментировать строчку:
ADODS.Parameters.ParseSQL(ADODS.CommandText, true)
т.е. предоставить SQL Server и ADO подготавливать параметры самостоятельно, то все работает нормально, в том числе и при пустом пароле.

Методом тыка выяснил, что ошибка возникает из-за того, что при пустом пароле операция
ADODS.Parameters.ParamByName("PPassword").Value := "";
не меняет свойство Size для параметра, оставляя его равным -1. Код:
ADODS.Active := false;
ADODS.CommandText := "SELECT … FROM USERLIST.dbo.UserInf WHERE login=:PLogin AND password= :PPassword";
ADODS.Parameters.ParseSQL(ADODS.CommandText, true);
ADODS.Parameters.ParamByName("PLogin").Value := login;
ADODS.Parameters.ParamByName("PPassword").Value := 1;
ADODS.Parameters.ParamByName("PPassword").Value := password;
ADODS.Open;

Работает. Но выглядит так себе, и, скорее всего, может вызвать еще какие-нибудь ошибки.

Подскажите, пожалуйста, как наиболее правильно работать с параметрами в ADODataSet и ADOCommand (ну и ADOQuery, т.к. в старых проектах я использовал его)? В частности: насколько правильно полагаться на автоматический “ParseSQL” и определение типа параметра? Если можно, то прямо пример, начиная от ADODS.Active := false.


PS: в access такой ошибки не возникает.
PPS: везет же мне на такие штуки… Максимальная отрицательная константа, проблема с параметрами в join в Access, время от времени не загружающийся реестр, теперь вот это… У всех так, или это у меня карма низкая?:)

Заранее спасибо.


 
И. Павел ©   (2010-08-31 11:27) [1]

Извиняюсь, я опечатался. Не

> ADODS.Parameters.ParamByName("PPassword").Value := 1;

а

> ADODS.Parameters.ParamByName("PPassword").Size := 1;


 
Palladin ©   (2010-08-31 11:31) [2]


> То есть SQL SERVER почему-то считает, что пустой параметр
> типа ftString имеет тип Text.

он не ftString, выведи после
ADODS.Parameters.ParseSQL(ADODS.CommandText, true);

ADODS.Parameters.ParamByName("PLogin").DataType

я после парсинга сам в ручную назначал DataType в ftString и потом присваивал значение... есть такой косяк...


 
Palladin ©   (2010-08-31 11:32) [3]

у тебя скорее всего NVarChar тип поля в таблице


 
И. Павел ©   (2010-08-31 11:49) [4]


> у тебя скорее всего NVarChar тип поля в таблице

Я перепроверил - тип именно varchar(50).


> я после парсинга сам в ручную назначал DataType в ftString
> и потом присваивал значение

Код:
 ADODS.Active := false;
 ADODS.CommandText := "SELECT login, password, cabinet, log_del, ReportType, type FROM USERLIST.dbo.UserInf WHERE login=:PLogin AND password= :PPassword";
 ADODS.Parameters.ParseSQL(ADODS.CommandText, true);
 ADODS.Parameters.ParamByName("PLogin").DataType := ftString;
 ADODS.Parameters.ParamByName("PLogin").Value := login;
 ADODS.Parameters.ParamByName("PPassword").DataType := ftString;
 ADODS.Parameters.ParamByName("PPassword").Value := password;
 ADODS.Open;

У меня возвращает ту же ошибку.

Я попробовал сменить тип поля "password" на text, ошибка приняла вид:
"The data types text and varchar are incompatible in the equal to operator".
тоесть теперь параметр воспринимается как varchar :)


 
Anatoly Podgoretsky ©   (2010-08-31 12:04) [5]


> Поле “password” имеет тип “varchar(50)”.

Этого нам не достаточно

> т.е. предоставить SQL Server и ADO подготавливать параметры
> самостоятельно, то все работает нормально, в том числе и
> при пустом пароле.

Так чего же ты мучишься?


 
И. Павел ©   (2010-08-31 12:44) [6]

> Так чего же ты мучишься?

Просто часто встречаю ParseSQL в разных статьях и на форумах, вот и подумал, что лучше использовать его. А оказалось - что это привело к тому, что тип параметра не совпадает с DataType.

Подскажите, пожалуйста, создание запроса с параметрами таким образом правильно:
ADODS.Active := false;
ADODS.CommandText := "SELECT … FROM USERLIST.dbo.UserInf WHERE login=:PLogin AND password= :PPassword";
ADODS.Parameters.ParamByName("PLogin").Value := login;
ADODS.Parameters.ParamByName("PPassword").Value := password;
ADODS.Open;
Если да, то буду теперь писать так.


> Этого нам не достаточно

Вот все, что я нашел по полю "password", если нужно что-то еще - напишите:

Name - password
Data Type - varchar
System Type - varchar
Primary key - False
Allow nulls - False
Is Computed - False
Computed Text -
Identity - False
Identity seed - 0
Identity increment - 0
Default Binding
Default Schema
Rule
Rule Schema
Length - 50
Collation - Cyrillic_General_CI_AS
Numeric precision - 0
Numeric scale - 0
XML Schema Namespace -
XML Schema Namespace schema
Not for replication - False
Full text - False
ANSI Padding Status - True


 
Palladin ©   (2010-08-31 12:52) [7]


> Если да, то буду теперь писать так.

Если ошибки про несуществование параметра не возникает, то ессно писать именно так. На кой хрен еще раз парсить.


 
Anatoly Podgoretsky ©   (2010-08-31 12:52) [8]

> И. Павел  (31.08.2010 12:44:06)  [6]

ParseSQL имел смысл в БДЕ


 
И. Павел ©   (2010-08-31 12:53) [9]

> Если ошибки про несуществование параметра не возникает,
> то ессно писать именно так. На кой хрен еще раз парсить.

Спасибо. Тогда буду писать так.


 
И. Павел ©   (2010-08-31 12:54) [10]

> ParseSQL имел смысл в БДЕ

Спасибо. Запомню на всякий случай. Хотя последний раз с БДЕ работал еще в институте.


 
Anatoly Podgoretsky ©   (2010-08-31 12:57) [11]

> И. Павел  (31.08.2010 12:54:10)  [10]

Но и в БДЕ он рекомендовался к применению только в редких случаях.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.11.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
15-1281415535
AlexDn
2010-08-10 08:45
2010.11.21
Ещё один тест музыки


2-1283339980
M@g
2010-09-01 15:19
2010.11.21
Импорт Excel в Delphi. Не получается


2-1282672625
PinDOS
2010-08-24 21:57
2010.11.21
Целочисленный тип для операций с указателями


15-1281454327
pasha_golub
2010-08-10 19:32
2010.11.21
Курсы валют центробанка Украины


2-1283085939
guest
2010-08-29 16:45
2010.11.21
listbox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский