请教xp_cmdshell扩展存储过程

quakekkk 2004-06-15 12:18:56
我用delphi写了个程序(比如叫program.exe),用了ole创建了excel对象,生成一个excel文件。但在写存储过程时,用xp_cmdshell调用长时间不返回(超过30分钟)!
我再用delphi写了一个程序,只用到文本文件f: TextFile,功能也是生成一个文本文件。用xp_cmdshell调用却能成功!为什么?是不是xp_cmdshell太烂了?我还把program.exe写成了console类型的应用程序,还是不行,它3分钟左右能返回,但不会生成我的excel文件。我程序中有输出提示信息,但xp_cmdshell不能返回这些标准输出。
...全文
152 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
quakekkk 2004-06-16
  • 打赏
  • 举报
回复
2个源程序如下:
----------------------------------------------------------------------------------

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils, Variants, DateUtils, ComObj, ActiveX;
// Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
// Dialogs, DateUtils, ComObj;
var
fn: String ;
s: String ;
dtFs : TFormatSettings;
eclApp, WorkBook : Variant; //ÉùÃ÷ΪOLE Automation ¶ÔÏó
i : Integer;

begin
{ TODO -oUser -cConsole Main : Insert code here }
GetLocaleFormatSettings(0, dtFs);
dtFs.ShortDateFormat := 'yyyy-MM-dd';
s := DateToStr(IncDay(Date, -1), dtFs);
fn := 'st_report_' + Trim(Copy(s,1,4))+ '_' + Trim(Copy(s,6,2))+ '_' + Trim(Copy(s,9,2))+ '.xls';

oleInitialize(NIL); //³õʼ»¯OLE¶ÔÏ󡪡ªÖØÒª
try
begin
//´´½¨OLE¶ÔÏóExcel ApplicationÓë WorkBook
eclApp := CreateOleObject('Excel.Application');
WorkBook := CreateOleobject('Excel.Sheet');
end;
except
begin
//ShowMessage('ÄúµÄ»úÆ÷Àïδ°²×°Microsoft Excel¡£');
Exit;
end;
end;

//н¨Ò»¸öXLSÎļþ,²¢Ð´ÈëÊý¾Ý,×îºó¹Ø±ÕËü
WorkBook := eclApp.WorkBooks.Add;
eclApp.Visible := False;
for i:=1 to 4 do
begin
WorkBook.WorkSheets.Add ;
eclApp.Cells(1, 1) := 'Öм̷½Ïò';
eclApp.Cells(1, 2):= '×Ü»°ÎñÁ¿';
eclApp.Cells(1, 3):= '¿ÉÓõç·Êý';
eclApp.Cells(1, 4):= 'ÿÏß»°ÎñÁ¿';
eclApp.Cells(1, 5):= 'Ó¦Õ¼±È';
eclApp.Cells(1, 6):= 'ÍøÂç½ÓͨÂÊ';
end;
//WorkBook.SaveAs('C:\MSSQL7\TSReport\'+fn);
WorkBook.SaveAs('C:\'+fn);

WorkBook.WorkSheets[7].Delete ;
WorkBook.WorkSheets[6].Delete ;
WorkBook.WorkSheets[5].Delete ;

WorkBook.WorkSheets[1].Name := 'Ò¦°¯»°ÎñÁ¿Èë';
WorkBook.WorkSheets[2].Name := 'Ò¦°¯»°ÎñÁ¿³ö';
WorkBook.WorkSheets[3].Name := 'ÄÏÕ¾»°ÎñÁ¿³ö';
WorkBook.WorkSheets[4].Name := 'ÄÏÕ¾»°ÎñÁ¿Èë';
WorkBook.Save;
WorkBook.Close;
eclApp.Quit;
oleUninitialize; //ÊÍ·ÅOLE¶ÔÏó
Writeln('Export Successfully!');
end.

----------------------------------------------------------------------------------

program console;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
f:TextFile;
s:String;
begin
{ TODO -oUser -cConsole Main : Insert code here }
AssignFile(f,'c:\Test.txt');
Rewrite(f);
s := 'Console App for SQL SERVER!';
Writeln(f,s);
Writeln(s);
Writeln('Thank u!');
CloseFile(f);
end.
quakekkk 2004-06-15
  • 打赏
  • 举报
回复
1、我执行第二个程序,能在c:\生成test.txt文件,而不是在服务器输出。
2、我2个程序都不用输入,程序1生成一个excel文件就退出了,程序2生成一个文本文件就退出。除了用到了ole创建excel对象,进行了一些简单的处理外,没有任何区别!
望大侠再指点一二。
zjcxc 2004-06-15
  • 打赏
  • 举报
回复
1.xp_cmdshell返回的结果是在SQL服务器上
2.xp_cmdshell调用的不能是有交互性质的程序,即需要用户输入的程序,否则就会死在那里.
不信你用xp_cmdshell调用记事本(notepad)试试
检查一下你的程序中是否有需要用户输入的处理部分.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧