我需要使用列表框中的值更新表。我正在尝试创建与列表中的项目一样多的参数,我的代码如下,但我如何命名它们?这样他们就不会互相覆盖?
For Each item As ListItem In ris
Dim pID As New SqlParameter("@userid", SqlDbType.Int)
pID.Value = objFormat.CheckSQL(item.Value)
myCommand.Parameters.Add(pID)
Next
在SQL方面,是否可以编写一个更新语句,它将采用动态数量的参数?
因此,例如,我需要在“活动”字段中更新具有相同值的多个用户...
答案 0 :(得分:1)
这是对它的一种看法,基本上在单个字符串参数中传递“list”,用逗号(或其他)分隔并在sproc中解析它。
http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
还有这个
Since there is no Sqlserver array parameter, what's the best way to proceed?
答案 1 :(得分:1)
答案 2 :(得分:0)
re:“谢谢,循环遍历列表项并且多次调用存储过程是不是很糟糕?而不是在一个存储过程中完成所有操作? - xrum Jan 19 at 16:55”
如果您考虑一下,您将在某处进行一些迭代 - 为什么不将所有值加载到列表中,并按照您的描述执行更新?如果是我,我只会确保我只打开一次连接:
Dim CommandText As String = _
"UPDATE MyTYable SET SomeField = @SomeField " & _
"WHERE UserID = @UserID"
Using cn As New SqlClient.SqlConnection(MyConnectionString)
Using cmd As New SqlClient.SqlCommand(cn, CommandText)
'The Record key in the database:
cmd.Parameters.AddWithValue("@UserID", -1)
'Whatever it is you plan to UPDATE:
cmd.Parameters.Add("@SomeField", "")
cn.Open()
For Each Item As ListItem In ris
cmd.Parameters("@UserID").Value = Item.Value
cmd.Parameters("SomeField").Value = SomeValueFromSomeWhere
cmd.ExecuteNonQuery()
Next
End Using
End Using
显然,这需要根据您的特定用途进行调整。我不确定你在组装的UserID列表中做了什么,但上面的代码框架代表了执行一系列INSERTS或UPDATES的相对有效的方法,而不会产生打开和关闭整个连接的开销。
如果您需要执行的更新数量确实很繁重,则上面提到的字符串连接方法之一可能更有效,并且/或者将所有要更新的值快速插入到背面的温度表Db中,后跟一个SELECT INTO语句,用于处理服务器上的批量INSERT。