懂VB的高手请进

vb6.0中 adodc1.recordset.filed(i).type的值如何设置 ?

只能读,不能设置,你要设置他字段的type不是不可能。

'//在查询里就把字段原始类型给设置了
Adodc1.ConnectionString="连接字符串"
Adodc1.RecordSource="Select CStr(日期) as 日期文本, Int(文本序号) as 数字 From 表名"
Adodc1.Refresh
'//把查询出来的数据整理成任何类型都可以
Dim riqi As String
Dim shuzi As integer
Adodc1.ConnectionString="连接字符串"
Adodc1.RecordSource="Select 日期, 文本序号 From 表名"
Adodc1.Refresh
If Not Adodc1.Recordset.EOF Then
riqi=Cstr(Adodc1.Recordset.Fileds("日期"))
shuzi=Int(Adodc1.Recordset.Fileds("文本序号"))
End If

追问

我按你的方法在查询里就把字段原始类型给设置了
如:Adodc1.RecordSource="Select CStr(序号)from [Sheet1$]"
但是执行下面代码:
Set MSHFlexGrid1.DataSource = Adodc1
MSHFlexGrid1.Refresh
会报错。

请问高手这是为什么?有什么办法解决吗?

追答

把源代码给我看一下:
邮箱:[email protected]
怎么可能呢,VB是乱报错的,位置没那么准确,MSHFlexGrid1跟数据类型没有一丁点关系。八杆子打不着

追问

我已经发过去了,麻烦您帮我看看!谢谢!

追答

你还是比较聪明的,知道用变量存取字符串,但是忽略一点,Excel读来的数据默认原始类型,他自己本身也是一个Windows应用程序,不是数据库,他格式的限制不是存储过程上的限制,是显示在Sheets.Cells的简单限制,你用表格读出来的就是他的原形,用VS.NET 的dataGridView、Java的Tables读出来是一样的效果。MSHFlexGrid与DataGrid区别就在于这里,没有处理这样的数据,VSFlexGrid就处理过了。你修改后的唯一错误是根本就没查到数据,本来就是文本形式,为什么还有强制转换成文本形式呢?重复定义会引起查询错误。还有一点你没忽略数据混淆,在连接语句后加上:HDR=YES意思是把一列作为标题,加上EMIX=1意思是避免数据混淆引起的错误。尽量用数据库,不要用Excel操作

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-04
以下是MSDN的原文 针对类型转换的 示例: 123 要转成字符串可用 CStr(123)返回"123"

类型转换函数

每个函数都可以强制将一个表达式转换成某种特定数据类型。
语法
CBool(expression)
CByte(expression)
CCur(expression)
CDate(expression)
CDbl(expression)
CDec(expression)
CInt(expression)
CLng(expression)
CSng(expression)
CStr(expression)
CVar(expression)
CStr(expression)
必要的expression参数可以是任何字符串表达式或数值表达式。
返回类型
函数名称决定返回类型,如下所示:
函数 返回类型 expression参数范围
CBool Boolean 任何有效的字符串或数值表达式。
CByte Byte 0 至 255。
CCur Currency -922,337,203,685,477.5808
至922,337,203,685,477.5807。
CDate Date 任何有效的日期表达式。
CDbl Double 负数从 -1.79769313486232E308 至 -4.94065645841247E-324;正数从
4.94065645841247E-324 至 1.79769313486232E308。
CDec Decimal 零变比数值,即无小数位数值,为
+/-79,228,162,514,264,337,593,543,950,335。对于 28 位小数的数值,范围则为
+/-7.9228162514264337593543950335;最小的可能非零值是
0.0000000000000000000000000001。
CInt Integer -32,768 至 32,767,小数部分四舍五入。
CLng Long -2,147,483,648 至 2,147,483,647,小数部分四舍五入。
CSng Single 负数为 -3.402823E38 至 -1.401298E-45;正数为 1.401298E-45 至
3.402823E38。
CStr String 依据expression参数返回Cstr。
CVar Variant 若为数值,则范围与Double相同;若不为数值,则范围与String相同。

说明
如果传递给函数的expression超过转换目标数据类型的范围,将发生错误。
通常,在编码时可以使用数据类型转换函数,来体现某些操作的结果应该表示为特定的数据类型,而不是缺省的数据类型。例如,当单精度、双精度或整数运算发生的情况下,使用CCur来强制执行货币运算。
应该使用数据类型转换函数来代替Val,以使国际版的数据转换可以从一种数据类型转换为另一种。例如,当使用Ccur时,不同的小数点分隔符、千分位分隔符和各种货币选项,依据系统的国别设置都会被妥善识别。
当小数部分恰好为 0.5 时,Cint和CLng函数会将它转换为最接近的偶数值。例如,0.5 转换为 0、1.5 转换为
2。Cint和CLng函数不同于Fix和Int函数,Fix和Int函数会将小数部分截断而不是四舍五入。并且Fix和Int函数总是返回与传入的数据类型相同的值。
使用IsDate函数,可判断date是否可以被转换为日期或时间。Cdate可用来识别日期文字和时间文字,以及落入可接受的日期范围内的数值。当转换一个数字成为日期时,是将整数部分转换为日期,小数部分转换为从午夜起算的时间。
CDate依据系统上的国别设置来决定日期的格式。如果提供的格式为不可识别的日期设置,则不能正确判断年、月、日的顺序。另外,长日期格式,若包含有星期的字符串,也不能被识别。
CVDate函数也提供对早期 Visual Basic 版本的兼容性。CVDate函数的语法与CDate函数是完全相同的,不过,CVDate是返回一个Variant,它的子类型是Date,而不是实际的Date类型。因为现在已有真正的Date类型,所以CVDate也不再需要了。转换一个表达式成为Date,再赋值给一个Variant,也可以达到同样的效果。也可以使用这种技巧将其他真正的数据类型转换为对等的Variant子类型。
注意CDec函数不能返回独立的数据类型,而总是返回一个Variant,它的值已经被转换为Decimal子类型。追问

我的意思是能不能转换这个adodc1.recordset.filed(i).type的类型,就是type的类型,不是数据的强制类型转换。
因为我加载数据文件的时候type已经自动确定了,比如某字段里的数据大多数是浮点类型,它就自动识别type=5,但是我后续需要向该字段添加文本"abc",这个时候就会报错“类型不匹配”
能不能把type转换成文本类型(202)。

追答

那只改在数据库里面改字段类型了

第2个回答  2013-05-03
这个不能必的,这是你查出来的字段的数据类型,库里是什么类型,这里就是什么类型。
如果你硬要改的话最好是用个变量先把该值接收下来,然后再进行类型转换。
有问题欢迎继续探讨。追问

请问具体如何类型转换:
比如我读取到Adodc1.Recordset.Fields(2).Type 为5,是数字类型,我后续需进行Adodc1..Recordset.Fields(2)=”abc"操作,就会报错“类型不匹配”,请问我具体如何转换Type?

谢谢!

追答

我这种操作方式本来就不合理,怎么可以所字符串存到数值类型的字段中呢?你得改表,把原来的数值字段类型改成文本型:Access中的文本类型或SqlServer中的NVARCHAR型。不同类型的数据存储结构是不同的,不能乱放。

第3个回答  2013-05-03
Me.Adodc1.Recordset.Fields(i).Type

VB6中记录集的Fields(Index)的属性是只读的,无法赋值。
如果你想改变类型,只能强制转换了追问

嗯,我开始Adodc1.Recordset加载数据表时,Type的类型已经自动设定好了,比如说我数据表这个字段的都是数字,它自动识别Type=5,但是我后续需向数据表添加记录是字符,就会报错说“类型不匹配,我想把Type统一设定为202(文本型),这个具体怎么操作?如何强制转换?谢谢!

追答

数据库中的字段类型是数字类型,你非要把文本放进去,那根本就放不进去,肯定提示类型不匹配。
如果你把数字放入文本类型的字段中,不会报错,因为自动在后台转换了,比如数字15,系统自动就转换成字符串"15"了。
因为不同数据类型存储方式不同,就说上面的数字15和字符串"15"吧:
如果定义字段1为int16类型,那么这个字段只占用2个字节,能存放有符号-32768~32767之间的数或者无符号0~65535之间的数,把15存进去的话高字节为0,低位字节为15;但是如果是字符串类型的话,每个字符占有1个字节,"15"这个字符串就占有2个字节,第1个字节存放字符"1"的ASCII码49,第2个字节存放字符"5"的ASCII码53,这样的话,你把字符串"15"不经过转换数字类型来读的话,结果是121597,那结果跟15相差多了。

说了这么多,意思就说说,不同的数据类型存储结构不同,不能混用。有些能够混用且没有报错的,那是因为系统能够自动转换,如果系统不能自动转换,肯定要报错的。

数据库设计的时候,表格的字段数据类型是根据需要设计好的,一般不再更改。如果你想在这个字段既存储数字又存储字符串,那就把字段的数据类型设置为文本类型或者字符类型的。读的时候再转换

第4个回答  2019-09-27
function
getiwant(p()
as
long,ins
as
long
,bors
as
long)
dim
i
as
long
dim
ii
as
long
dim
tbig
as
long
dim
tsmall
as
long
for
i=1
to
ins
if
tsmall>p(i)
then
tsmall=p(i)
if
tbig<p(i)
then
tbig(i)=p(i)
next
i
if
bors=0
then
getiwant=tsmall
else
getiwant=tbig
end
function
'把数放到数组里面就行了
'ins表示数的个数.
'bors来判断是要最大值还是最小值.当然你也可以只要两个参数.用ubound来判断数的个数.但是就怕你数组大好多无用数据在里面.
相似回答