【问题标题】:Invalid column name when run from vb.net从 vb.net 运行时列名无效
【发布时间】:2018-07-25 14:04:43
【问题描述】:

当我尝试运行我的 vb.net 代码时,我遇到了这个“无效的列名”错误。这个 vb.net 会将一些参数传递给存储过程。但是当我尝试从 SQL Server Management Studio 执行存储过程时,它可以工作。

下面是我的代码:

    LoadData("tbl_Sources", "sPlayerID,'',sPlayerName", "tbl_Dest", "dPlayerID,"",dPlayerName")

------------------------------------------

Public Function LoadData(ByVal frmTblname As String, ByVal frmClmnName As String, ByVal toTblName As String, ByVal toClmnName As String) As Integer

    Dim con As New SqlClient.SqlConnection
    Dim conManager As New Connection
    Dim sqlParams() As SqlParameter = New SqlParameter() { _
        New SqlParameter("@fromTable", SqlDbType.NVarChar, 50) With {.Value = frmTblname}, _
        New SqlParameter("@fromColumn", SqlDbType.Structured, 4000) With {.Value = "'" + frmClmnName + "'"}, _
        New SqlParameter("@toTable", SqlDbType.NVarChar, 50) With {.Value = toTblName}, _
        New SqlParameter("@toColumn", SqlDbType.NVarChar, 4000) With {.Value = "'" + toClmnName + "'"} _
        }
    Dim err As Integer

    con = conManager.GetConnection(sConn)      
    err = ConnectionExec.RunSPReturnInteger(con, "insertUnknownDir", sqlParams)
    Return err
End Function

---------------------------------------------------------
Public Function RunSPReturnInteger(ByVal con As SqlClient.SqlConnection, ByVal strSP As String, ByVal ParamArray commandParameters() As SqlClient.SqlParameter) As Integer
    Dim retVal As Integer

    LogManager.WriteLog("#################################### Start " + strSP + " ####################################")
    Try
        Dim cmd As New SqlCommand(strSP, con)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.CommandTimeout = 0
        Dim p As SqlClient.SqlParameter

        For Each p In commandParameters
            p = cmd.Parameters.Add(p)
            p.Direction = ParameterDirection.Input
            p.SqlDbType = SqlDbType.Structured              
        Next

        retVal = cmd.ExecuteNonQuery()

        cmd.Dispose()
        Return retVal
        LogManager.WriteLog("Try RunSPReturnInteger 1 -> SP Name : " + strSP + " > " + retVal.ToString)
    Catch ex As Exception
        'MsgBox(ex.Message)
        LogManager.WriteLog("Catch RunSPReturnInteger 1-> SP Name : " + strSP + ">> " + ex.Message)
        Throw New Exception(ex.Message, ex)
        Return -1
    End Try        
End Function

这是我的存储过程:

ALTER procedure [dbo].[insertUnknownDir] @fromTable nvarchar(50),@fromColumn nvarchar(4000),@toTable nvarchar(50),@toColumn nvarchar(4000) 
as 
begin 
declare @Query nvarchar(4000)   print 'exec [insertUnknownDir] '+@fromTable+' ,'+@fromColumn+' ,'+@toTable+','+@toColumn+'' 
SET @Query ='INSERT INTO ['+@toTable+']('+@toColumn+') 
SELECT TOP 15 '+@fromColumn+' 
FROM '+@fromTable+'
WHERE profile.sPlayerID = '+@fromTable+'.sPlayerID'     
 exec sp_executesql @Query
END

感谢任何建议/帮助!

【问题讨论】:

  • 我看不出该代码是如何编译的。查看RunSPReturnInteger 的声明并查看您是如何称呼它的。差远了。你创建了一个SqlParameter 数组并且从不使用它。
  • @jmcilhinney,对不起,这是一个旧代码,我已经对其进行了编辑。谢谢你
  • 为什么要把每个参数的SqlDbType都改成Structured?您正在通过构造函数将该属性设置为正确的值,然后在 RunSPReturnInteger 中无明显原因地更改它。
  • @jmcilhinney 好吧,我还是个初学者,我只关注msdn.microsoft.com/en-us/library/… 以及从这里stackoverflow.com/questions/16070932/…
  • 我看不出其中任何一个告诉您将SqlDbType 设置为Structured,所以也不是原因。将每个参数的SqlDbType 设置为数据的适当数据类型。如果您不知道这些值的含义,请进行一些研究。无论如何,如果在执行最终 SQL 时生成了该错误消息,那么您应该确切地确定该 SQL 代码是什么,您不觉得吗?只看代码来构建它是没有意义的。查看结果并确定它是否是您所期望的。

标签: vb.net sql-server-2008 visual-studio-2008


【解决方案1】:

由于您使用动态 SQL,因此可能会出现失败的参数组合。 最好运行 SQL Profiler 来捕获在特定数据库上执行的 SQL 语句,以查看导致错误的确切 SQL 查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多