将VBA Recordset定义为String

时间:2012-06-22 14:30:04

标签: excel vba excel-vba recordset teradata

当我们在VBA&中定义记录集时从数据库读取数据,记录集将其数据类型转换为表的列数据类型。

Dim rs as adobb.RecordSet 
Set rs = CmdSqlData.Execute() ' After this rs fields will be stored based on table's datatype

有没有办法将记录集本身设置为String和Perform,

Set rs = CmdSqlData.Execute()

对于Eg:如果Database表定义中有时间戳值(具有整数值),则Recordsset将其字段数据类型设置为timestamp。

问题是,在数据库中,

  

时间值是12345(不是日期和时间),但是当记录集读取它时,它   例如:2012年6月23日   十点15分23秒

我希望价值为12345

3 个答案:

答案 0 :(得分:2)

您的SELECT语句需要为Teradata TIMESTAMP执行显式CAST到FLOAT(DATE是INTEGER)

SELECT CURRENT_TIMESTAMP()
     , CAST(CURRENT_TIMESTAMP() AS FLOAT) AS NumericTimeStamp
;

你应该能够解决VBA的其余部分,因为Recordset会将NumericTimeStamp识别为FLOAT而不是TIMESTAMP。

修改

以下SELECT语句将采用带有FORMAT子句的整数,并返回一个字符数据类型作为双重转换的结果:

SELECT CAST(CAST(1234 as INTEGER FORMAT '99:99:99') AS CHAR(8));

您是否尝试使用SELECT语句打开记录集,明确地将包含时间的列作为CHAR(8)进行CAST?

答案 1 :(得分:1)

我设法现在单独转换此时间戳。但是有多种时间戳格式可供使用。我无法自动将SQL查询从不同的数据类型转换为字符串。 我要求VBA将TERADATA VALUE读为字符串 我做了什么,

    If Field_format = "99:99:99" then
    Sql = "Select Cast(Field_format as integer) from Mytable"
    Elseif Field_format = "99:99:99.999" then
    Sql = "Select Cast(Field_format as Float) from Mytable"
    Elseif Field_format = "99:99:99.999" then
    Sql = "Select Field_format from Mytable"
    End if
...
Set rs = CmdSqlData.Execute() 

请注意teradata中有这么多数据类型(大约400+),我不能像上面那样转换everthying。

  

我只是想让VBA将Teradata值读为字符串。   想知道StackOverflow中没有VBA专家

答案 2 :(得分:0)

如果您要连接到SQL Server数据库,则timestamp数据类型是一个二进制字段,用于确定记录是否已更改(请参阅How to convert SQL Server's timestamp column to datetime format)。这与日期时间字段不同,日期时间字段包含时间和日期。

从ADO中的记录集返回一个字符串需要像:

Dim cn as ADODB.Connection
Dim rs as ADODB.Recordset
Dim strSQL as string
Dim strSomething as string

strSQL = "SELECT fld1 FROM tbl1"

Set cn = New ADODB.Connetion
cn.ConnectionString = {your connection string here}
cn.open
rs.open strSQL, cn
While Not rs.EOF
    strSomething = rs!fld1
Wend
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing