问题描述
具体情况是这样的。数据库sqlserver2000sp4开发软件vs2008我用winform+rdlc(本地打印)写了一套模板打印的东东,然后通过数据库触发器启动调用,(当有新数据写入时自动执行)c#具体处理过程大致为被调用-查询需要打印数据-按照rdlc排版模式打印。为了让xp_cmdshell能够调用我已经把我能理解地方的需要用户交互的都关闭了。现在的情况是:调试模式下程序可以正常运行,打印功能正常。可以打印出单。但当通过sqlserver执行xp_cmdshell调用时程序能正常运行,打印功能也过了,但是无法打出单子来。请问:1.通过xp_cmdshell调用包含rdlc的程序时有什么需要注意的,或更改的。2.我这种思路是否行的通,是否有别的更好的思路。我就是不想弄个定时器不停的轮询数据库是否有新的符合条件的数据出现。附上部分代码:privatevoidprintSaleDtl(){try{StringSaleFormNo;StringID;DataTabledtTableInfo;DataTabledtSaleDetail;this.pdaReceiveTableAdapter.Fill(this.GSDCYPOSDataSet.PDAReceive);if(0<this.GSDCYPOSDataSet.PDAReceive.Rows.Count){SaleFormNo=this.GSDCYPOSDataSet.PDAReceive.Rows[0]["SaleFormNo"].ToString();ID=this.GSDCYPOSDataSet.PDAReceive.Rows[0]["ID"].ToString();//MessageBox.Show(SaleFormNo);//TODO:这行代码将数据加载到表“GSDCYPOSDataSet.dtTableInfo”中。您可以根据需要移动或移除它。this.dtTableInfoTableAdapter.Fill(this.GSDCYPOSDataSet.dtTableInfo,SaleFormNo);//TODO:这行代码将数据加载到表“GSDCYPOSDataSet.dtSaleDetail”中。您可以根据需要移动或移除它。this.dtSaleDetailTableAdapter.Fill(this.GSDCYPOSDataSet.dtSaleDetail,SaleFormNo);dtTableInfo=this.GSDCYPOSDataSet.Tables["dtTableInfo"];dtSaleDetail=this.GSDCYPOSDataSet.Tables["dtSaleDetail"];PrintRDLCprintRDLC=newPrintRDLC();printRDLC.Run(dtTableInfo,dtSaleDetail);_Conn=_DB.getCon();_Conn.Open();_Command.Connection=_Conn;_Command.CommandText="UPDATEPDAReceiveWXSETProcessFlag=1WHEREID="+ID;_Command.ExecuteNonQuery();_Command.CommandText="UPDATESaleformtempSETPrePrintTimes=PrePrintTimes+1WHEREsaleformno='"+SaleFormNo+"'";_Command.ExecuteNonQuery();_Conn.Close();}}catch(Exceptionex){}finally{}}privatevoidFormMain_Load(objectsender,EventArgse){File.AppendAllText(@"D:testR1.txt","2");this.printSaleDtl();File.AppendAllText(@"D:testR1.txt","3");Application.Exit();File.AppendAllText(@"D:testR1.txt","4");}
解决方案
解决方案二:
1.服务器运行在特定的Session0区域,而桌面在session1,不能通讯。2.SQLServer本身就支持c#、vb.net写存储过程,不需要通过t-sql来调用xp_cmdshell。3.大部分按照教科书而配置SQLServer安全行规则的人,都把xp_cmdshell从系统中去掉了。因为这可以让远程客户端随便调用服务器上任意exe,这个存储过程是服务器安全的大敌。
解决方案三:
引用1楼sp1234的回复:
1.服务器运行在特定的Session0区域,而桌面在session1,不能通讯。2.SQLServer本身就支持c#、vb.net写存储过程,不需要通过t-sql来调用xp_cmdshell。3.大部分按照教科书而配置SQLServer安全行规则的人,都把xp_cmdshell从系统中去掉了。因为这可以让远程客户端随便调用服务器上任意exe,这个存储过程是服务器安全的大敌。
关键点在于我现在是用rdlc本地报表格式化的打印布局,请问sqlserver2000版本支持通过数据库的外部存储过程实现这样的功能么。