【问题标题】:tiny_tds failed at the second executetiny_tds 在第二次执行时失败
【发布时间】:2018-06-09 00:05:26
【问题描述】:

今天tiny_tds突然不接受多个execute并返回:

C:\>ruby test_use.rb
one
two
C:/test_use.rb:15:in `execute': Attempt to initiate a new Adaptive Server operation with results pending (TinyTds::Error)
    from C:/test_use.rb:15

代码就是三个USEs:

require 'rubygems'
require 'yaml'
require 'fastercsv'
require 'tiny_tds'
require 'iconv'

CONFIG = YAML.load_file("config.yml")

client = TinyTds::Client.new(:username => CONFIG["db"]["username"], :password => CONFIG["db"]["password"], 
  :host => CONFIG["db"]["server"], :database => CONFIG["db"]["database"])

puts "one"
client.execute("USE DATAFEED")
puts "two"
client.execute("USE DATAFEED")
puts "three"
client.execute("USE DATAFEED")

任何线索是什么问题?我已经尝试重新启动 Windows 机器。

【问题讨论】:

    标签: sql-server ruby windows tiny-tds


    【解决方案1】:

    这是我如何做的一个例子。

    results = $regcenter_db.execute("select top 10 * from events")
    event_ids = results.collect { |i| i["event_id"] }
    results.do    
    

    【讨论】:

      【解决方案2】:

      您必须使用do 终止执行:

      Client.execute("...").do

      【讨论】:

      • 请注意该语法。如果您尝试待办事项results = client.execute("...").do,您将获得受影响的行数而不是结果。我一直在做results = client.execute("..."),然后再打电话给client.do。
      【解决方案3】:

      您必须致电docancel。如果您正在执行类似获取部分结果的操作,并且您对执行 do 方法不感兴趣,您可以调用 cancel 来中止查询。

      【讨论】:

        【解决方案4】:

        根据 GitHub 上的documentation for TinyTds

        重要的是,您要么从查询中返回数据,很可能使用#each 方法,要么在要求客户端执行另一个 SQL 批处理之前取消结果。否则会产生错误。

        要取消查询,请使用cancel 方法:

        client.execute("USE DATAFEED").cancel
        

        【讨论】:

          猜你喜欢
          • 2013-03-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-02
          • 2018-04-06
          • 2014-07-05
          • 1970-01-01
          • 1970-01-01
          • 2021-04-02
          相关资源
          最近更新 更多