【问题标题】:Parameterized query that returns TEXT column(s) always returns zero for INT columns返回 TEXT 列的参数化查询始终为 INT 列返回零
【发布时间】:2026-01-03 01:00:01
【问题描述】:

C# mySQL ODBC 的问题 我的桌子

CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fbid` varchar(30) NOT NULL,
`fbname` varchar(80) NOT NULL,
`datecreate` datetime NOT NULL,
`ipcreate` varchar(20) NOT NULL,
`datelogin` datetime NOT NULL,
`iplogin` varchar(20) NOT NULL,
`xstatus` int(2) NOT NULL,
`xverstion` int(5) NOT NULL,
`xdata` text NOT NULL,
`xitem` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

我的程序:

CREATE PROCEDURE `VVVVV_getUserByFbId`(fbid2 varchar(30))
BEGIN
SELECT * from vvvvv_account where vvvvv_account.fbid=fbid2 LIMIT 1;
END

fbid2 是参数 (=408301576730032) 在 C# 代码中

OdbcConnection connection = new OdbcConnection(constr);
            OdbcCommand cmd;           
            DataTable dt = new DataTable();
            try
            {

                OpenConnection(connection);

                cmd = new OdbcCommand("{call VVVVV_getUserByFbId(?)}", connection);
cmd.Parameters.AddWithValue("@fbid2", "408301576730032");
                cmd.CommandType = CommandType.StoredProcedure;

                OdbcDataAdapter da = new OdbcDataAdapter(cmd);
                da.Fill(dt);
                da.Dispose();
            }
            catch (Exception ex)
            {

            }
            finally
            {
                CloseConnection(connection);
            }
            return dt;

C# 输出 dt.Rows[0]["id"] 总是 = 0 不好 dt.Rows[0]["fbname"] = "ABC" 好的

表示我仍然可以正常从数据库中获取数据。但是 int column alway = 0, varchar, datetime colume 是可以的;

但如果我将程序更改为:

BEGIN
    select * from account where account.fbid='408301576730032' LIMIT 1;
END

在 C# 中"{call VVVVV_getUserByFbId()}" -> id field = 3903

如果没有参数 (fbid2) 或没有文本字段 (xdata, xitem) -> id, xstatus (int fields) 返回正常。但是如果传入参数或者选择xdata -> id (int fields) always = 0;

enter image description here

【问题讨论】:

  • C# mySQL ODBC 问题
  • 嘿,你能描述一下你的问题吗?我的理解是如果没有参数返回 id 否则返回 0。对吗?
  • 1.我的程序 BEGIN select * from account where account.fbid=fbid2 LIMIT 1; END fbid2 是参数 这是否意味着:在 C# 中 if "{call VVVVV_getUserById(?)}" -> id field get value always = 0 2. 但是如果过程 BEGIN select * from account where account.fbid='408301576730032' LIMIT 1; END 在 C# "{call VVVVV_getUserById()}" -> id field = 3903
  • 谢谢,现在我更好地理解了这个问题。

标签: c# mysql odbc procedure


【解决方案1】:

您在 MySQL 连接器/ODBC 中遇到了一个经过验证的错误,报告如下:

https://bugs.mysql.com/bug.php?id=97191

由于您使用的是 C#,您可能想看看 MySQL Connector/NET 是否更适合您的应用程序。

【讨论】:

    【解决方案2】:

    请尝试如下将返回值转换为int。

    int x = System.Convert.ToInt32(dt.Rows[0]["id"]);
    

    问题可能是 MySql int 没有映射到 C# int。

    【讨论】:

    • 我已经转换了,但是id值还是0
    • 节点:如果删除表中的文本列(xdata,xitem)-> ok。不知道是不是这两列的问题?