使用ODBC向SQL Server数据库中更新数据时总是提示"将数据类型 varchar 转换为 float 时出错",请教大家!

chenhq 2007-10-24 01:14:41
数据交换过程如下:
void CZ6Lj_testmsgTable::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CZ6Lj_testmsgTable)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, _T("[ask_sta]"), m_ask_sta);
RFX_Text(pFX, _T("[bcch_0]"), m_bcch_0,255,);
RFX_Text(pFX, _T("[bcch_1]"), m_bcch_1);
RFX_Text(pFX, _T("[bcch_2]"), m_bcch_2);
RFX_Text(pFX, _T("[bcch_3]"), m_bcch_3);
RFX_Text(pFX, _T("[bcch_4]"), m_bcch_4);
RFX_Text(pFX, _T("[bcch_5]"), m_bcch_5);
RFX_Text(pFX, _T("[bcch_6]"), m_bcch_6);
RFX_Date(pFX, _T("[begin_time]"), m_begin_time);
RFX_Text(pFX, _T("[c_no]"), m_c_no);
RFX_Text(pFX, _T("[c1_0]"), m_c1_0);
RFX_Text(pFX, _T("[c1_1]"), m_c1_1);
RFX_Text(pFX, _T("[c1_2]"), m_c1_2);
RFX_Text(pFX, _T("[c1_3]"), m_c1_3);
RFX_Text(pFX, _T("[c1_4]"), m_c1_4);
RFX_Text(pFX, _T("[c1_5]"), m_c1_5);
RFX_Text(pFX, _T("[c1_6]"), m_c1_6);
RFX_Text(pFX, _T("[c2_0]"), m_c2_0);
RFX_Text(pFX, _T("[c2_1]"), m_c2_1);
RFX_Text(pFX, _T("[c2_2]"), m_c2_2);
RFX_Text(pFX, _T("[c2_3]"), m_c2_3);
RFX_Text(pFX, _T("[c2_4]"), m_c2_4);
RFX_Text(pFX, _T("[c2_5]"), m_c2_5);
RFX_Text(pFX, _T("[c2_6]"), m_c2_6);
RFX_Text(pFX, _T("[cid_0]"), m_cid_0);
RFX_Text(pFX, _T("[cid_1]"), m_cid_1);
RFX_Text(pFX, _T("[cid_2]"), m_cid_2);
RFX_Text(pFX, _T("[cid_3]"), m_cid_3);
RFX_Text(pFX, _T("[cid_4]"), m_cid_4);
RFX_Text(pFX, _T("[cid_5]"), m_cid_5);
RFX_Text(pFX, _T("[cid_6]"), m_cid_6);
RFX_Long(pFX, _T("[id]"), m_id);
RFX_Text(pFX, _T("[lac_0]"), m_lac_0);
RFX_Text(pFX, _T("[lac_1]"), m_lac_1);
RFX_Text(pFX, _T("[lac_2]"), m_lac_2);
RFX_Text(pFX, _T("[lac_3]"), m_lac_3);
RFX_Text(pFX, _T("[lac_4]"), m_lac_4);
RFX_Text(pFX, _T("[lac_5]"), m_lac_5);
RFX_Text(pFX, _T("[lac_6]"), m_lac_6);
RFX_Text(pFX, _T("[pos_id]"), m_pos_id);
RFX_Date(pFX, _T("[real_time]"), m_real_time);
RFX_Text(pFX, _T("[rxl_0]"), m_rxl_0);
RFX_Text(pFX, _T("[rxl_1]"), m_rxl_1);
RFX_Text(pFX, _T("[rxl_2]"), m_rxl_2);
RFX_Text(pFX, _T("[rxl_3]"), m_rxl_3);
RFX_Text(pFX, _T("[rxl_4]"), m_rxl_4);
RFX_Text(pFX, _T("[rxl_5]"), m_rxl_5);
RFX_Text(pFX, _T("[rxl_6]"), m_rxl_6);
RFX_Text(pFX, _T("[rxo]"), m_rxo);
RFX_Text(pFX, _T("[sta_id]"), m_sta_id);
RFX_Text(pFX, _T("[taskno]"), m_taskno);
RFX_Long(pFX, _T("[test_order]"), m_test_order);
RFX_Text(pFX, _T("[bsic_0]"), m_bsic_0);
RFX_Text(pFX, _T("[bsic_1]"), m_bsic_1);
RFX_Text(pFX, _T("[bsic_2]"), m_bsic_2);
RFX_Text(pFX, _T("[bsic_3]"), m_bsic_3);
RFX_Text(pFX, _T("[bsic_4]"), m_bsic_4);
RFX_Text(pFX, _T("[bsic_5]"), m_bsic_5);
RFX_Text(pFX, _T("[bsic_6]"), m_bsic_6);
//}}AFX_FIELD_MAP
}
我已经实验过了,如果所有的字段(如bsic_6)都填写字数字,程序不出错,如果填写字符(如"-"),Updata()时系统就提示"将数据类型 varchar 转换为 float 时出错"
...全文
478 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dyw 2007-10-26
  • 打赏
  • 举报
回复
lz看看MFC源代码where msgid=62010388000012这个条件是怎么生成的?自己仿照一个版本:使用字符串比较函数。
chenhq 2007-10-24
  • 打赏
  • 举报
回复
同样的程序,如果使用ACCESS的ODBC数据源完全没有问题!
我在其他地方查到的资料说:
问题陈述:
有一天,执行

SELECT * FROM XXX_ORIGINAL_20031205
where msgid=62010388000012

语句,结果SQL Server报告出错:“将数据类型 varchar 转换为 numeric 时出错。”



这是什么意思呢?

Msgid这个字段的类型是:varchar(30)。



环境:

数据库服务器:Microsoft SQL Server 2000以及7.0;

数据库服务器补丁:Microsoft SQL Server 2000 ServicePack1;



原因分析:
不是SQL Server突然不能从数字自动转换为字符串,而是单单对这个字段的数值有问题,这也和这个字段中实际已存储的字符串有关。



你看,我执行这个SQL语句是没有问题,可以自动转换:

SELECT * FROM XXXX_ORIGINAL_20031205
where recordid=62010388000012

recordid这个字段的类型也是:varchar(30)。

这为什么就可以呢?



为什么?

这是因为msgid字段的真实数值是类似于这样的字符串“12051113280101053509”,由于你的SQL命令中要求拿字符串跟我们提供的这个数字62010388000012匹配,所以SQLServer默认要把这么多个“12051113280101053509”先统统转换为数字,再去跟62010388000012匹配。

(首先这就涉及到一个效率问题,转换这么多msgid成为数字,再跟你的数字匹配,将是一个多么大的浪费啊)

当然,这回SQLServer转不过来了,因为“12051113280101053509”换为数字实在太大了,超出了范围,所以你看SQLServer于是乎报告“将数据类型 varchar 转换为 numeric 时出错”,他指的就是把历史数据“12051113280101053509”这个varchar(30)转成numeric不行,而不是把你SQL脚本传递的参数62010388000012转换失败。



让我们看看另一种形式的错误,就更清楚了:

我们执行

SELECT * FROM XXXX_ORIGINAL_20031205
where msgid=120

命令就会得到错误:

varchar 值 '12050003010101026986' 的转换溢出了 int 列。超出了最大整数值。



这个错误,是不是很清楚地表明了SQLServer在帮你执行SQL命令时背后所作的事情?

他试图帮你主动把记录中的这个字段转换成你在SQL命令中指明的那个数据类型。



我的建议:
很多时候,我们懒得去看某个字段到底是什么类型,是char,还是tinyint,还是bool,还是varchar,我们就随便写一个数字,让聪明的SQL Server自己去判断该转成什么。

但是,第一,SQL Server不是转换你的脚本命令中的数值,而是转换已有的历史数据到你指定的那个类型,所以会增加执行时间;第二,容易转换出错。

所以,切忌让SQLServer自己判断,自动帮你转换,那样将降低执行效率,而且增加出错几率。你能够显式告诉SQL Server你的数据类型的话,就请一定这么做

但是我不知道在VC中使用ODBC操作数据库的时候如何解决该问题!
凤矶 2007-10-24
  • 打赏
  • 举报
回复
加了‘-’,可能数值超范围了
wy2001wy 2007-10-24
  • 打赏
  • 举报
回复
可能那个字段设成浮点数了呗,你往里面填字符串,sql server认为写错了,就报错了呗。
你把字段设成字符串的,肯定不会出错吧。
dyw 2007-10-24
  • 打赏
  • 举报
回复
先确认SQL Server怎么把数字字符串转换为float。一般可以自动转换的吧
然后查看RFX_Text内部作了哪些工作,是否与SQL Server要求的一致。
若不同,可以自己写一个RFX函数(比如: RFX_MySingle),里面加上SQL转换。

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧