Има ли все пак просто GUID да бъде част от самата SQL заявка, без да се използва параметър?
Нека обясня какво точно се опитвам да направя и защо. Работя със съществуващо приложение, което използва ADO.Net за създаване и свързване към SQLite база данни. Текущата структура на базата данни и методът за запитване към нея са ужасяващи. Аз съм в процес на редизайн на това как работи фундаментално. Това обаче не е нещо, което може да се постигне бързо. Докато този редизайн се завършва, имам ситуация, която се нуждае от решение за лейкопласт. Като предупреждение, мотивите зад първоначалното внедряване на кода са неясни и изглежда, че са създадени от някой, който е имал малко познания за базата данни. Рефакторингът на цялата база данни, за да не се нуждае от тази ситуация, е най-доброто решение, но засега просто гледам да работя в рамките на съществуващата структура.
Дизайнът на базата данни разчита на GUID за уникално идентифициране на редове. За да извърши филтрирано извличане на данните, системата динамично изгражда команда, която има IN клауза, изброяваща GUID, които трябва да бъдат извлечени. В момента GUID се вмъкват в заявката чрез използване на параметър с тип GUID, така че заявката ще изглежда така
SELECT * FROM data_table WHERE guid_col IN( ?, ?, ?, ?)
Проблемът идва, когато трябва да извлека относително голямо количество информация. SQLite има ограничение от 1000 параметъра в една заявка. Ако трябва да предам повече от 1000 GUID за извличане, заявката просто ще се прекъсне. При изграждането на горния низ той преминава през списък с GUID, за да вмъкне въпросителни знаци и да създаде параметрите. Моето помощно решение на проблема щеше да бъде стойността на GUID директно да бъде вмъкната там, където в момента са въпросителните знаци, и да се откажа от параметрите в заявката. В края на краищата, той използва параметри за цел, за която не е необходимо да се използват.
Проблемът с това „решение“ е, че изглежда не мога да накарам GUID да съответства на данните в колоната, т.е. заявката винаги връща нула. Разбирам, че GUID не са роден тип за SQLite и отдолу всъщност се представя като BLOB (да, сигурен съм, че използваме BLOB, а не представянето на низ). И все пак не успях да накарам заявката да се изпълни правилно.
Опитах всичко следното досега:
Опитах се да извикам ToString() на GUID, така че заявката изглежда така
SELECT * FROM data_table WHERE guid_col IN
( 'b5080d4e-37c3-4286-9c3a-413e8c367f36', 'aa0ff789-3ce9-4552-9840-5ed4d73c1e2c')
Опитах се да извикам ToString("N") на GUID, така че заявката изглежда така
SELECT * FROM data_table WHERE guid_col IN
( 'b5080d4e37c342869c3a413e8c367f36', 'aa0ff7893ce9455298405ed4d73c1e2c')
Опитах се да извикам ToString("B") на GUID, така че заявката изглежда така
SELECT * FROM data_table WHERE guid_col IN
( '{b5080d4e-37c3-4286-9c3a-413e8c367f36}',
'{aa0ff789-3ce9-4552-9840-5ed4d73c1e2c}')
Опитах да извикам ToByteArray() на GUID и да поставя резултата в заявката чрез добавяне на всеки байт към низа, извикващ ToString("X") на всеки байт, така че заявката да изглежда така
SELECT * FROM data_table WHERE guid_col IN ( '4ED8B5C33786429C3A413E8C367F36', '89F7FAAE93C524598405ED4D73C1E2C')
При четене на документацията на SQLite прочетох следното „BLOB литералите са низови литерали, съдържащи шестнадесетични данни и предшествани от един знак „x“ или „X“. Ако се опитам да приложа това към моята заявка, така че да изглежда така
SELECT * FROM data_table WHERE guid_col IN
( x'4ED8B5C33786429C3A413E8C367F36', x'89F7FAAE93C524598405ED4D73C1E2C')
Получавам грешка, че "x" не е разпознат символ.
Възможно ли е да получите GUID в низа на заявката без използването на параметъра?