这是我设置命令的方式。它以第一个参数UpdateType停止。此代码正在从VB.NET 2008版本中更新。
Dim db As New DB()
Dim cmd As SqlCommand = New SqlCommand()
'Put into an object, and use AddWithValue due to Parameters.Add being deprecated.
Dim UpdateType As String = "PARAMETERS"
If IsNewJob Then
cmd.CommandText = "sp_MB_AddJob"
Else
cmd.CommandText = "sp_MB_UpdateJob"
cmd.Parameters.AddWithValue("@UpdateType", SqlDbType.NVarChar).Value = UpdateType
cmd.Parameters.AddWithValue("@OrigJobName", OrigJobName.ToString)
End If
cmd.Parameters.AddWithValue("@UserID", CInt(Utils.GetLoggedInUserID))
cmd.Parameters.AddWithValue("@ProjectName", ProjectName.ToString)
答案 0 :(得分:1)
对于类型.Add
,NVARCHAR
或VARCHAR
,应将VARBINARY
用作类型
与长度。在这里,我展示了如何处理您在问题中遇到的问题,仅出于示例目的,我做了一些说明。使用AddWithValue
可能会对SQL性能和其他方面产生负面影响。
可以在许多地方找到一些帮助您的信息,包括https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/configuring-parameters-and-parameter-data-types
Dim db As New DB()
Dim cmd As SqlCommand = New SqlCommand()
Dim UpdateType As String = "PARAMETERS"
cmd.CommandType = CommandType.StoredProcedure
If IsNewJob Then
cmd.CommandText = "sp_MB_AddJob"
Else
cmd.CommandText = "sp_MB_UpdateJob"
cmd.Parameters.Add("@UpdateType", SqlDbType.NVarChar, 10).Value = UpdateType
cmd.Parameters.Add("@OrigJobName", SqlDbType.NVarChar, 50).Value = OrigJobName.ToString
End If
cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = CInt(Utils.GetLoggedInUserID)
cmd.Parameters.Add("@ProjectName", SqlDbType.NVarChar, 30).Value = ProjectName.ToString
答案 1 :(得分:0)
将数据库对象保留在使用它们的方法的本地,以便您可以控制它们的关闭和处理。 `使用...结束使用块可以帮助您解决这一问题。请注意,单个using块同时处理连接和命令。
不推荐使用.Add
方法。绝对是.Add(String, Object)
重载。 `.AddWithValue当然不受欢迎。参见http://www.dbdelta.com/addwithvalue-is-evil/
和
https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
还有一个:
https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications
这是另一个
https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html
我不得不猜测参数的数据类型和列大小。检查数据库中的实际值,并相应地更正代码。
Private Sub OpCode()
Dim UpdateType As String = "PARAMETERS"
Using cn As New SqlConnection("Your connection string"),
cmd As New SqlCommand()
cmd.Connection = cn
If IsNewJob Then
cmd.CommandText = "sp_MB_AddJob"
Else
cmd.CommandText = "sp_MB_UpdateJob"
cmd.Parameters.Add("@UpdateType", SqlDbType.NVarChar, 50).Value = UpdateType
cmd.Parameters.Add("@OrigJobName", SqlDbType.NVarChar, 200).Value = OrigJobName.ToString
End If
cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = CInt(Utils.GetLoggedInUserID)
cmd.Parameters.Add("@ProjectName", SqlDbType.NVarChar, 200).Value = ProjectName.ToString
cn.Open()
cmd.ExecuteNonQuery()
End Using
End Sub