【发布时间】: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