Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pyodbc从DB2检索数据_Python_Flask_Db2_Pyodbc_Db2 400 - Fatal编程技术网

Python 使用pyodbc从DB2检索数据

Python 使用pyodbc从DB2检索数据,python,flask,db2,pyodbc,db2-400,Python,Flask,Db2,Pyodbc,Db2 400,我试图使用pyodbc从DB2检索数据,并使用Python以JSON格式打印数据。我有两个不同的函数 这幅作品: import flask from flask import flash, request, Flask, jsonify import pyodbc @app.route('/api/acrdkl/filter', methods=['GET']) def api_filter(): dkkdcb = request.args.get('dkkdcb') dkb

我试图使用pyodbc从DB2检索数据,并使用Python以JSON格式打印数据。我有两个不同的函数

这幅作品:

import flask
from flask import flash, request, Flask, jsonify
import pyodbc

@app.route('/api/acrdkl/filter', methods=['GET'])
def api_filter():

    dkkdcb = request.args.get('dkkdcb')
    dkblrg = request.args.get('dkblrg')
    dkthrg = request.args.get('dkthrg')

    query = """select trim(dkkdcb), trim(dkkdps), trim(dkcob), trim(dkureg), trim(dkbktg), trim(dkblrg), trim(dkthrg)
    from simdta.ACRDKL WHERE dkkdcb = param_dkkdcb and dkblrg = param_dkblrg and dkthrg = param_dkthrg"""

    print("Dkkdcb ", dkkdcb)
    print("Dkblrg ", dkblrg)
    print("Dkthrg ", dkthrg)

    query = query.replace("param_dkkdcb", dkkdcb)
    query = query.replace("param_dkblrg", dkblrg)
    query = query.replace("param_dkthrg", dkthrg)
    print("Query 1 ", query)

    conn = pyodbc.connect("DSN=AS400;UID=.....;PWD=....")
    cur = conn.cursor()
    cur.execute(query)
    rows = cur.fetchall()
    results = []
    for dt in rows:
        print("DT ", dt)
        print("dkkdcb: ", dt[0])
        print("dkkdps: ", dt[1])
        print("dkcob: ", dt[2])
        print("dkureg: ", dt[3])
        print("dkbktg: ", dt[4])
        print("dkblrg: ", dt[5])
        print("dkthrg: ", dt[6])
        
        print("\n")
        results.append([x for x in dt])
    return jsonify(results)
但当我尝试使用此选项时,使用了
try except

@app.route('/api/acrdkl/filter2', methods=['GET'])
def filter2():
    try:
        cnxn = pyodbc.connect("DSN=AS400;UID=....;PWD=....")
        cursor = cnxn.cursor()
        sql= """select 
        trim(dkkdcb), trim(dkkdps), trim(dkcob), trim(dkureg), trim(dkbktg), trim(dkblrg), trim(dkthrg)
        from simdta.ACRDKL where dkkdcb=? and dkblrg=? and dkthrg=?"""
        data=(int(ardkkdcb), month, year)
        cursor.execute(sql, 1402, 10, 2020)
        rows = cursor.fetchall()
        result = []
        for dt in rows:
            print("dkkdcb: ", dt[0])
            print("dkkdps: ", dt[1])
            print("dkcob: ", dt[2])
            print("dkureg: ", dt[3])
            print("dkbktg: ", dt[4])
            print("dkblrg: ", dt[5])
            print("dkthrg: ", dt[6])
            
            print("\n")
            result.append([x for x in dt])
        return json.dumps(result)
    except Exception as e:
        return(str(e))
它给了我这个错误:

('22023', '[22023] [Microsoft][ODBC DB2 Driver]Data exception - SQLSTATE 22023, SQLCODE -302. SQLSTATE: 22023, SQLCODE: -302 (-302) (SQLExecDirectW)')

我在第二个函数中遗漏了什么吗?如果有更好的解决方法,我们将不胜感激。提前感谢。

第一个查询使用文本值,第二个查询使用主机变量。完全不同。Db2-302SQLCode指出,其中一个主机变量的值对于其数据类型来说太大。通常这是由编程错误引起的。检查Db2列数据类型,并验证在cursor.execute()期间绑定的实际值。嘿,我已经检查了数据库中的数据类型并将其与变量匹配,但仍然没有运气。这应该是工作,不是吗?需要调试。我们不能为你做这件事。跟踪pyodbc和microsoft驱动程序,查看封面下发生了什么。如果您无法调试,请解决问题,首先尝试仅使用1个主机变量,然后进行扩展,直到您看到是什么导致了问题的出现。啊,该死的。无论如何,您也可以显式地将参数标记转换为正确的列数据类型(而不是
使用
cast(?as…