weixin_43405952 2023-11-26 21:45 采纳率: 83.3%
浏览 7
已结题

请问ruby这报错是为什么?

先上代码:


require 'sqlite3'
class hx
    sy=Array.new #收益
    def cr_sp(pm,sl,md,cb,bz) #是插入商品资料
        sql="INSERT INTO sp(pm,sl,md,cb,bz)VALUES('"+pm+"','"+sl+"','"+md+"','"+cb+"','"+bz+"')"
        db=SQLite3::Database.new("C:\\Users\\sai\\Desktop\\kw\\kw.db")
        db.execute(sql)
        puts "完成!"
    end
    def cr_ss(sj,dh,pm,hszj,sl,yf_sf,yf_dd,kddh)
        db=SQLite3::Database.new("C:\\Users\\sai\\Desktop\\kw\\kw.db")
        sql1="INSERT INTO ss(sj,dh,pm,hszj,sl,yf_sf,yf_dd,kddh)VALUES('"+sj+"','"+dh+"','"+pm+"','"+hszj+"','"+sl+"','"+yf_sf+"','"+yf_dd+"','"+kddh+"')"
        db.execute(sql1)
        puts "完成!"
    end
    def sy_d(pm,dh)
        db=SQLite3::Database.new("C:\\Users\\sai\\Desktop\\kw\\kw.db")
        sql2="select hszj+yf_dd-yf_sf-(select cb from sp where pm='"+pm+"') from ss where dh='"+dh+"'"
        sy=db.execute(sql2)
        sy.each do |sy1|
            puts "收益:"+sy1
            @sy<<sy1
        end
    end
end
a=hx()
puts "1、插入新商品\n2、插入新订单\n3、计算收益"
xz=gets
if xz=="1"
    puts "商品名:"
    pm1=gets
    puts "数量:"
    sl1=gets
    puts "目的:"
    md=gets
    puts "成本:"
    cb=gets
    puts "备注:"
    bz=gets
    a.cr_sp(pm1.chomp,sl1.chomp,md.chomp,cb.chomp,bz,chomp)
elsif xz=="2"
    puts "时间:"
    sj=gets
    puts "订单号:"
    dh=gets
    puts "商品名:"
    pm2=gets
    puts "回收资金:"
    hszj=gets
    puts "数量:"
    sl2=gets
    puts "实付运费:"
    yf_sf=gets
    puts "订单运费:"
    yf_dd=gets
    puts "运单号:"
    kddh=gets
    a.cr_ss(sj.chomp,dh.chomp,pm2.chomp,hszj.chomp,sl2.chomp,yf_sf.chomp,yf_dd.chomp,kddh.chomp)
elsif xz=="3"
    puts "起始时间:"
    qs=gets
    puts "结束时间:"
    js=gets
    sql3="select pm,dh from ss where sj<="+qs.chomp+"' and sj>='"+js.chomp+"'"
    sy_d1=db.execute(sql1)
    sy_d1.each do |p1,d1|
        a.sy_d(p1,d1)
    end
    puts "时间段内收益:"
    sum = 0
    sy_p=sy.each { |a| sum+=a }
    puts sy_p
else
    puts "请做出你的选择!"
end

在运行中报错no implicit conversion of nil into String (TypeError),具体如下:

img

感觉很奇怪,请问是为什么?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-27 10:03
    关注

    【以下回答由 GPT 生成】

    这个问题可能由以下几个原因引起: 1. 语法错误: 类名应该以大写字母开头, 所以应该将class hx改成class Hx。 2. SQLite3库未正确安装: 需要确保已经正确安装了sqlite3 gem。可以使用gem install sqlite3来安装。 3. SQL语句拼接错误: 在拼接SQL语句时,应该使用绑定参数而不是直接拼接字符串,这样可以防止SQL注入攻击。可以使用?预处理语句来替代参数。

    针对这些原因,我可以给出以下解决方案:

    # 将类名改为大写字母开头
    class Hx
      # 省略其他代码
    
      # 修改cr_sp方法,使用绑定参数
      def cr_sp(pm, sl, md, cb, bz)
        db = SQLite3::Database.new("C:\\Users\\sai\\Desktop\\kw\\kw.db")
        sql = "INSERT INTO sp(pm, sl, md, cb, bz) VALUES(?, ?, ?, ?, ?)"
        db.execute(sql, pm, sl, md, cb, bz)
        puts "完成!"
      end
    
      # 修改cr_ss方法,使用绑定参数
      def cr_ss(sj, dh, pm, hszj, sl, yf_sf, yf_dd, kddh)
        db = SQLite3::Database.new("C:\\Users\\sai\\Desktop\\kw\\kw.db")
        sql1 = "INSERT INTO ss(sj, dh, pm, hszj, sl, yf_sf, yf_dd, kddh) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"
        db.execute(sql1, sj, dh, pm, hszj, sl, yf_sf, yf_dd, kddh)
        puts "完成!"
      end
    
      # 修改sy_d方法,使用绑定参数
      def sy_d(pm, dh)
        db = SQLite3::Database.new("C:\\Users\\sai\\Desktop\\kw\\kw.db")
        sql2 = "select hszj+yf_dd-yf_sf-(select cb from sp where pm=?) from ss where dh=?"
        sy = db.execute(sql2, pm, dh)
        sy.each do |sy1|
          puts "收益:#{sy1}"
          @sy << sy1
        end
      end
    end
    

    希望这些建议对你有所帮助。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月17日
  • 已采纳回答 3月9日
  • 创建了问题 11月26日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上