我想通过此代码从 RaisError 获取消息:
retmsg := &sqlexp.ReturnMessage{}
rows, err = db.QueryContext(ctx, query, retmsg)
if err != nil {
return
}
active := true
for active {
msg := retmsg.Message(ctx)
switch m := msg.(type) {
case sqlexp.MsgNotice:
result = fmt.Sprintf("%s", m.Message)
return
case sqlexp.MsgNext:
inresult := true
for inresult {
inresult = rows.Next()
if inresult {
var d interface{}
if err = rows.Scan(&d); err == nil {
result = fmt.Sprintf("%s %v", result, d)
}
}
}
case sqlexp.MsgNextResultSet:
active = rows.NextResultSet()
case sqlexp.MsgError:
result = fmt.Sprintf("%s", m.Error)
}
}
使用的程序代码:
declare @err_message nvarchar(255),
@err_count int = 0
BEGIN
if (isnull(@InStorageID,0)=0 and isnull(@OutStorageID,0)=0)
begin
SET @err_message = ' Message: empty storage '
select @err_count=@err_count+1
RAISERROR (@err_message,10, 1)
end
if (@Quantity<0 or @Quantity=0)
begin
SET @err_message = ' Message: items quantity less than zero '
select @err_count=@err_count+1
RAISERROR (@err_message,10, 1)
end
if not exists (select 1 from [dbo].[tblQuantity] qt
where qt.ConsignmentID=@ConsignmentID and
qt.StorageID=@OutStorageID and
(qt.Quantity-@Quantity)>=0
) and @OutStorageID>0
begin
SET @err_message = ' Message: the quantity of goods is more than what is in stock '
select @err_count=@err_count+1
RAISERROR (@err_message,10, 1)
end
if (@err_count=0)...
我可以收到消息“消息:空存储”和“消息:物品数量小于零”。但是“消息:货物数量多于库存”不能。
问题开始于行:msg := retmsg.Message(ctx) 它的运行阻止了这个挂起的 sqlexp 包块。
func (m *ReturnMessage) Message(ctx context.Context) RawMessage {
select {
case <-ctx.Done():
return MsgNextResultSet{}
case raw := <-m.queue:
return raw
}
}
我尝试改变上下文;
将代码更改为包 sqlexp: 添加带有空消息的默认值,但仍然无法正常工作。
我试图调试以寻找错误,但没有任何效果,也许值是相同的。
在我看来,这是由于执行子查询导致等待执行时间过长,但我不确定