sql-server - 使用 SQL Server 存储过程访问打印机?
问题描述
如何使用 SQL Server 存储过程访问我的打印机?
解决方案
存储过程非常适合处理数据,但在与数据库外部的系统资源交互时它们非常有限。即使写入文件也可能很尴尬,更不用说打印了。
如果您仍然想从存储过程打印文档,您可以按照本文中的步骤操作
第 1 步: 首先,让我们构建一个简单的 VB DLL(ActiveX 组件)来处理使用 Microsoft Word 进行的实际打印。在 ActiveX 组件中,添加一个使用 Microsoft Word 打印文档的方法:
Public Sub PrintDocumentFromWord(ByVal DocumentFileName As String)
On Error GoTo Err_Error
Dim MethodName As String
MethodName = ".PrintWebDocumentFromWord()"
Dim strMessage As String
Dim blnResult As Boolean
Dim objWord As New Word.Application
'Dim objWord As Object
'Set objWord = CreateObject("Word.Application")
Const wdAlertsNone = 0
objWord.DisplayAlerts = wdAlertsNone
'objWord.Activate
'objWord.PrintOut FileName:=DocumentFileName
Dim objDocument As Word.Document
Set objDocument = objWord.Documents.Open(DocumentFileName)
objDocument.Activate
objDocument.PrintOut
objDocument.Close
objWord.Quit
Exit_Procedure:
Set objDocument = Nothing
Set objWord = Nothing
Exit Sub
Err_Error:
'handle error here
Call HandleError("PrintWebDocument", ApplicationName, MethodName, VBA.Error)
If Not objWord Is Nothing Then
objWord.Quit
End If
Resume Exit_Procedure
End Sub
编译和构建 ActiveX 组件。ActiveX 组件将驻留在运行 SQL Server 实例的同一台机器上。
第 2 步:接下来,创建一个存储过程,调用 ActiveX 组件并传递要打印的文档的文件名:
CREATE procedure sp_Print_Letter_File
(
@file_name varchar(333)
,@debug_mode char(1)=''
)
as
set nocount on
declare @return int
declare @print_document int
declare @hr int
declare @src varchar(255), @desc varchar(255)
exec @hr = master.dbo.sp_OACreate 'PrintDocument.clsPrintDocument', _
@print_document OUT
if @hr <> 0 -- error creating instance!
begin
exec master.dbo.sp_OAGetErrorInfo @print_document, @src out, @desc out
select 'Creating Instance', hr=convert(varbinary(4),@hr), _
source=@src, description=@desc
set @return = -1
goto error
end
if @debug_mode<>''
print '1. created'
exec @hr = sp_OAMethod @print_document, 'PrintDocumentFromWord',_
null,@file_name, @debug_mode
if @hr <> 0
begin
exec sp_OAGetErrorInfo @print_document, @src OUT, @desc OUT
select 'Call to Method', hr=convert(varbinary(4),@hr), _
Source=@src, Description=@desc
exec @hr = sp_OADestroy @print_document
if @hr <> 0
begin
exec sp_OAGetErrorInfo @print_document, @src out, @desc out
select 'Destroing Instance',hr=convert(varbinary(4),@hr), _
source=@src, description=@desc
--return
end
set @return = -2
goto error
end
if @debug_mode<>''
print '2. send to object'
error:
exec @hr = sp_OADestroy @print_document
if @hr <> 0
begin
exec sp_OAGetErrorInfo @print_document, @src out, @desc out
select 'Destroing Instance',hr=convert(varbinary(4),@hr), _
source=@src, description=@desc
set @return = -3
end
if @debug_mode<>''
print '3. done!'
set nocount off
GO
就是这样。不要忘记注册您的 ActiveX 组件(我通常使用组件服务 MMC 管理单元来注册)。
推荐阅读
- swift - 在 ViewController 之间转换时使用 UIView.transition 和 UIView.AnimationOptions 时出现动画问题
- dataframe - macgien 学习中的数据类型
- ios - UIView 的cornerRadius 与 CAShapeLayer 不同
- c# - 了解 NPGSQL 和实体框架中一对多关系的行为
- asp.net-core - Blazor 客户端中非 Razor 文件的 gRPC 代码永远不会完成
- mongodb - 如何计算 MongoDB 日志中特定集合的 SELECT 查询请求总数?
- python - 将文本拆分为章节并将其存储在 txt 文件中
- java - 为什么 ArrayList.remove(char) 的自动装箱失败?它将 char 视为 int
- python - Sklearn中的PCA:如何按顺序返回解释最多变化的维度?
- angular - 添加授权标头不起作用 - Angular 5