Понял о чём речь. У вас из Recordset возвращается объект Field. Т.е объект поля. А он не имеет методов substr и подобных ему, поэтому и происходит ошибка. Для того чтобы код правильно сработал вам подойдут варианты:
Stroka = RS.Fields("name").Value;
либо
Stroka = String(RS.Fields("name"));
Причина в различном способе обработки присвоения в VBScript и JavaScript.
В выражении:
B может быть любым типом данных (строкой / числом / объектом / датой и т.п.).
Когда в VBScript выполняется такое выражение, то если B это число или строка или дата, то присваивается само значение из переменной, а когда B это объект, то происходит попытка найти его Default свойство / метод. Т.е свойство / метод возвращаемое(ый) по умолчанию. А для того чтобы вернуть сам объект используется оператор Set. В случае с Recordset, цепочка такая:
Recordset -> Fields (коллекция полей) -> Field (конкретное поле) -> Value (значение в нём)
В JavaScript оператора Set нет, поэтому при присвоении происходит возврат того, что есть (при этом происходит конвертация в объект понятный яваскрипту String, Number и т.п). А если B это объект, то он и вернётся.
Когда же мы используем String(RS.Fields("name"));, то мы явно указываем, что хотим забрать Default значение у объекта и преобразовать его к типу строки, понимаемой в JavaScript. Практически аналогично произойдёт и в коде RS.Fields("name").Value, только при этом JavaScript сам решит в какой тип данных, знакомый ему, конвертировать возвращаемое значение.
В Вашем случае, вариант используемого кода зависит от ситуации. Если поле содержит именно текстовые данные, то конвертация через String не обязательна и достаточно использовать свойство Value. Если же в поле будут числовые данные, то в Вашем коде опять же произойдёт ошибка. Так как при преобразовании получится объект, который не имеет методов работы со строкой. И тогда будет логичнее использовать конвертацию через String, чтобы получить строковую интерпретацию данных из поля.
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !