SELECT INTO语句在VB.NET中不起作用,但在Access中直接运行时起作用

时间:2011-06-15 20:27:49

标签: sql vb.net ado.net

我正在使用ADO.NET(OleDB)将旧的VB6代码转换为VB.NET。这是我的查询,它将在VB.NET中运行时创建一个空白表,但在Access中直接运行时可以工作。这个代码大概也适用于VB6,因为我使用相同的SQL:

SELECT qryAsOf.name, qryAsOf.type, 0 as opt, 0 as swap
INTO qryCon
FROM qryAsOf
LEFT JOIN qryLinked on qryAsOf.c = qryLinked.lc

我觉得这与左连接有关,选择合在一起,但就像我说只有VB有问题,Access完美处理它。

谢谢:)

编辑:更多详情 -

如果没有INTO行,此查询将返回所有600多行。

这不起作用:

cm.CommandText = "CREATE TABLE qryCon (etc...)"
cm.ExecuteNonQuery()
cm.CommandText = "INSERT INTO qryCon SELECT ..." '(rest of query above without INTO line)
cm.ExecuteNonQuery

这项工作:

cm.CommandText = "CREATE PROC qryCon AS SELECT ..." '(same select as above without INTO, again)
cm.ExecuteNonQuery

可以正常工作的CREATE PROC,除了我需要稍后将数据插入其中,所以我得到了关于如何需要可更新表的错误。我真的希望结束qryCon成为一个表,但我似乎无法让它工作:(

*但是,当我做这样的事情时(使用上面存储的proc(重命名),如果在Access中查看,则充满了数据)

cm.CommandText = "SELECT * FROM storedProc"
dr = cm.ExecuteReader

while dr.Read
    cm.CommandText = "INSERT INTO qryCon VALUES (dr.GetValue(0), dr.GetValue(1), dr.GetValue(2), dr.GetValue(3))
    cm.ExecuteNonQuery
end while

这不起作用!顺便说一句,我删除了查询中的串联以确保可读性。它在实际项目中是正确的。

3 个答案:

答案 0 :(得分:0)

中间件可能不支持select into语法,这往往有些泛泛。该语句可能必须以“passthrough”执行,即本机语法模式。

答案 1 :(得分:0)

您的VB6 / Access语法在解析结果时会在您查询对象本身的位置进行处理。

对于.Net,您希望利用较新的ADO.Net库并使用DataReader(或DataAdapter,如果您需要在代码中多次处理结果而无需再次访问数据库)对象为了处理您的查询。您可以在MSDN site上找到如何使用它们的概述。

编辑:

更新问题后,您希望SQL查询为:

SELECT qryAsOf.name, qryAsOf.type, 0 as opt, 0 as swap
FROM qryAsOf
LEFT JOIN qryLinked on qryAsOf.c = qryLinked.lc

然后你将遍历结果并通过每个循环解析值(在MSDN链接中找到类似

的内容)
If reader.HasRows Then
   Do While reader.Read()
      Console.WriteLine(reader.GetInt32(0) & vbTab & reader.GetString(1))
   Loop       
Else
   Console.WriteLine("No rows found.")
End If

答案 2 :(得分:0)

由于我之前关于传递模式的评论似乎已被低估,可能是@onedaywhen,我包含此链接:

http://msdn.microsoft.com/en-us/library/ms681754(v=vs.85).aspx

  

Jet OLEDB:ODBC传递语句   (DBPROP_JETOLEDB_ODBCPASSTHROUGH)

     

表示Jet应该传递SQL   后面的Command对象中的文本   结束不变。

文档似乎表明,除非调用此功能,否则中间件可以更改SQL文本。所以我再说一遍,你可能想确保oleDB支持SELECT INTO语法。我并不是说SELECT INTO不受支持 - 只是这是一个值得OP注意的问题。

P.S。当通过旨在支持各种后端的中间层与数据库交谈时,我认为,当语句包含像IIF()或UDF这样的函数时,使用传递模式是一个好主意,或任何语法,例如SELECT INTO,这是非普遍支持的。

P.P.S。以下是一些可能相关的其他信息: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx