代码之家  ›  专栏  ›  技术社区  ›  Vilius

在Python中使用pyodbc时,“cast规范的字符值无效”

  •  4
  • Vilius  · 技术社区  · 7 年前

    我制作了一个python脚本,它连接到Mssql数据库并在那里插入一些内容。

    问题在这一行:

    cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", name, date, trend_value)
    

    在这一行之后,我得到以下错误:

    cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", name, date, trend_value)
    pyodbc.DataError: ('22018', '[22018] [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification (0) (SQLExecDirectW)')
    

    我试着用“abc”代替“name”,但我得到了同样的错误”

    cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = ?), ?, ?)", 'abc', date, trend_value)
    

    然而,这一行很有效,我在数据库中得到了新行:

    cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = 'abc'), ?, ?)", date, trend_value)
    

    我做错了什么?

    4 回复  |  直到 7 年前
        1
  •  3
  •   Gord Thompson    7 年前

    pyodbc 4.0.22中引入的更改在处理查询参数时导致了几个不同的错误。pyodbc 4.0.23的发布解决了这些问题。

        2
  •  0
  •   L.S.    7 年前

    您可以使用格式来解决此问题:

    cursor.execute("insert into TREND_DATA (TREND_ID, TREND_DATE, TREND_VALUE) values ((select TREND_ID from TRENDS where TREND_NAME = {0}), ?, ?)".format(name), date, trend_value)
    

    看起来像是?内部()是一个问题。

    然而,这有一些安全隐患,不应作为永久解决方案使用。

        3
  •  0
  •   Ciprian Alexandru    6 年前

    我也有类似的问题。

    习惯于 bulk\u save\u对象 并且工作得很好,但在pyodbc 4.0.22中,它开始为bigints抛出类型转换错误(python中很长)。

    '[22018] [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification (0) (SQLExecDirectW)') [SQL: u'INSERT INTO [gg_expo] ([ID], [Status], [Timestamp]) VALUES (?, ?, ?)'] [parameters: ((3903146347805142551L, 1, u'2018-08-01T09:06:34.244'), (3959371193446428183L, 0, u'2018-08-01T09:06:55.128'), 
    

    我必须使用 添加\u all(行的\u list\u) 。希望这对别人有帮助!

        4
  •  0
  •   Hugo Vares    4 年前

    我遇到了这个错误,并且能够通过匹配源和目标的类型来解决这个问题。

    在我的例子中,我在插入之前将所有源代码大容量转换为字符串,而在目标表中,实际上有两个浮点列。

    在匹配了这些类型之后,插件工作得很好。