2014-10-27 20 views
0

我的SQL文件包含传递文件名用空格假脱机使用SQL Plus命令给SP2-0768 Illegral SPOOL命令错误

`SPOOL &1; 
//sql code to execute 
SPOOL OFF;` 

使用SQL Plus和SQL Plus被执行的SQL文件从C#代码调用使用的Process.Start ...代码剪断

`var m_StartInfo = new ProcessStartInfo(); 
m_StartInfo.FileName = "SQLPLUS.EXE"; 
m_StartInfo.CreateNoWindow = true; 
m_StartInfo.UseShellExecute = false; 
m_StartInfo.Arguments = String.Format("{0}\"{1}\" \"{2}\"", connectionString, sqlfile, sqlLogFileName); 
m_Process = Process.Start(m_StartInfo); 
Other code.....` 

它工作正常,sqlplus的日志在sqlLogFileName位置创建罚款。但是,如果sqlLogFileName之间存在空格(比如说“C:\ My Application \ log.txt”),则不会创建日志文件,而是在SQL Plus窗口上出现错误SP2-0768非法SPOOL命令

任何建议如何解决这个问题?我正在使用Oracle 11GR2

+0

我在互联网上发现的一切都表明您需要使用“>”来指定输出到您的日志文件。所以'm_StartInfo.Arguments'的格式字符串应该是'“{0} \”{1} \“> \”{2} \“”'。他们没有提到在SQL脚本本身中主动使用Spool命令。 – StarPilot 2014-10-27 22:16:01

+0

使用“>”不能解决问题。我从sql文件中删除了spool&1,并将m_StratInfo.Arguments作为“{0} \”{1} \“> \”{2} \“”传递,但它没有克隆日志文件 – Savy17 2014-10-29 17:18:59

回答

0

Oracle软件被设计用于不具有空格的目录(这是Linux/Unix中的公认标准,即使在技术上你可以做其他事情)。在Windows上,事情是不同的,但Oracle软件有相同的想法:它不喜欢空格。所以,解决方法很明确:将文件缓存到没有空格的目录。这是建议,任何人都可以自由采取或不采取。

0

你只需用双引号包围你的文件名。 喜欢的东西:

spool "Test with spaces.txt"

或者在你的情况有一个参数:

SPOOL "&1" 

我觉得最好不要使用,虽然空格,如@tvCa解释。

侧面说明:

什么星际飞行员是指的,我相信,是关于redirect a command output to a file,这就是为什么当你试图使用它没有工作。 例如,在命令提示符下你可以这样写:

dir > dir.txt

而且可以节省目录内DIR.TXT输出。