Member 13944807 Ответов: 1

Нужно выполнить команду spool через C #?


Предоставление исключения как недопустимого оператора sql!!!

Что я уже пробовал:

катушка myfile.txt ;
мой результирующий набор запросов;
очереди;

Jochen Arndt

"мой результирующий набор запросов;"
не является допустимым оператором SQL. Если это просто заполнитель, проверьте фактически используемую команду или покажите ее здесь.

Обратите также внимание, что команда SPOOL не заканчивается точкой с запятой.

Member 13944807

Спасибо за ваши предложения!!!

Использование mOracleConnection в качестве нового OracleConnection(mConnectionString)
mOracleConnection.Открыть()
Тусклый mOracleCommand как OracleCommand
Тусклый mOracleDataReader как OracleDataReader
mOracleCommand = mOracleConnection.CreateCommand()
мораклкоманд.Свойство Commandtype = Значение Commandtype.Текст
мораклкоманд.Свойства Commandtext = GetStrSQL()
мораклкоманд.Метод executenonquery()
Конец Использования

Private Sub GetStrSQL() AS String

Dim mStrSQL как новый StringBuilder
С помощью mStrSQl
.AppendLine(" катушка D:\30Aug\Testing.txt ")

.AppendLine(" SELECT * FROM [Payroll.Платежная ведомость].Платежный листок, где PayslipID > 1500; ")
.AppendLine(" катушка выключена ")

Конец С


Частные

1 Ответов

Рейтинг:
2

Jochen Arndt

Код из вашего комментария-VB.Net, а не C#.

"[Платежная ведомость.Платежная ведомость].Payslip" не выглядит как допустимое имя таблицы.

Вы пытаетесь выполнить сценарий, содержащий несколько команд. Это не будет работать таким образом. Вы должны либо отправить каждую команду самостоятельно, либо поместить эти команды в BEGIN - END блок.

Я не уверен но это может сработать:

.AppendLine("BEGIN")
.AppendLine("spool D:\30Aug\Testing.txt")
.AppendLine("SELECT * FROM [Payroll.Payslip].Payslip WHERE PayslipID > 1500")
.AppendLine("spool off")
.AppendLine("END;")
Обратите внимание, что после последней команды нет никаких точек с запятой.

Вы также должны перехватывать исключения, чтобы получить сообщение об ошибке компонента database engine:
Try
    ' Code goes here
Catch e As OracleException
    Dim errorMessage As String = "Code: " & e.Code & vbCrLf & "Message: " & e.Message
    ' Report error here
End Try
Они помогают выявить синтаксические ошибки SQL.

[РЕДАКТИРОВАТЬ]
SPOOL это Оракул SQL*Plus команда. Это утилита командной строки базы данных Oracle. Таким образом, эта команда не может быть использована с общими интерфейсами языка программирования.

Нет даже необходимости в таком выводе, потому что интерфейс предоставляет все данные, которые будут записаны в файл. Просто выполните запрос как обычно и повторите итерацию по результирующему набору. Если требуется вывод файла, сделайте это в цикле итерации.
[/РЕДАКТИРОВАТЬ]


Member 13944807

Спасибо за ваше предложение!!!
Код: 6550
Сообщение: ORA-06550: строка 2, колонка 9:
PLS-00103: столкнулся с символом "D", ожидая одного из следующих действий:
:= . ( @ % ;
Это исключение, с которым я столкнулся!!!

Member 13944807

Спасибо за улучшение моего кода!!!
Тот же запрос, если он выполняется, как и @ SQLDeveloper; файл создается и записи вставляются во вновь созданный файл!!

Jochen Arndt

Смотрите мой обновленный ответ.
Ошибка возникает из-за того, что команда SPOOL не поддерживается интерфейсом OracleConnection.

Member 13944807

Спасибо, что поделились со мной своими знаниями!!!
Мое требование состоит в том, чтобы сохранить миллион записей из результирующего набора sql в один txt-файл
Есть ли какая-то другая альтернатива???

Jochen Arndt

Вы можете выполнить утилиту командной строки, передающую входные данные из файла, например
sqlplus -s user/pass @script.sql
Вы также можете поместить все вышесказанное в пакетный файл. Параметры входа также могут быть сохранены поверх файла скрипта. Поскольку по крайней мере один файл будет показывать ваше имя пользователя и пароль, он должен иметь ограниченный доступ.

Если вы хотите использовать .Объем, можно выполнить, используя функцию shellexecute.