【发布时间】:2017-08-25 11:12:11
【问题描述】:
我正在使用带有 SQL Server 2012 数据库的 vb.net。
我想检查数据库中文件列表的状态。查询很简单,类似这样。
DECLARE @Filename NVARCHAR(100)
SET @Filename = 'MyFileName.doc'
SELECT DISTINCT
Docs.Filename,
Status.Name as 'Status'
FROM
[Documents] AS Docs
INNER JOIN
[Status] AS Status ON Status.StatusID = Docs.CurrentStatusID
WHERE
Docs.Filename LIKE @Filename
它适用于一个文件名,我可以在 vb.net 中使用 sql 连接轻松启动它,如本例所示。
Dim conn As New SqlConnection
If conn.State = ConnectionState.Closed Then
conn.ConnectionString = PDMConnectionString
End If
Try
conn.Open()
Dim sqlquery As String =
"DECLARE @Filename NVARCHAR(100)
SELECT DISTINCT
Docs.Filename,
Status.Name as 'Status'
FROM [Documents] AS Docs
INNER JOIN [Status] AS Status
ON Status.StatusID = Docs.CurrentStatusID
WHERE Docs.Filename LIKE @Filename "
Dim data As SqlDataReader
Dim adapter As New SqlDataAdapter
Dim parameter As New SqlParameter
Dim command As SqlCommand = New SqlCommand(sqlquery, conn)
With command.Parameters
.Add(New SqlParameter("@filename", "MyFileName.doc"))
End With
command.Connection = conn
adapter.SelectCommand = command
data = command.ExecuteReader()
While data.Read
'do something'
End While
Catch ex As Exception
End Try
问题是我需要找到很多文件的状态,我想只用一个查询来完成。
我可以通过像这样更改最后一行,删除 vb.net 中的参数并直接发送查询来直接在查询中执行此操作:
WHERE
Docs.Filename IN ('MyFileName.doc', 'MyOtherFileName.doc')
但这意味着很多字符串连接,我不太喜欢该解决方案的代码外观。
在这种情况下使用较少的字符串连接并使代码更易于管理的最佳做法是什么?
【问题讨论】:
-
@Magnus,您对复制的建议有“错误”的解决方案。正确的方法是表值参数
-
取决于您所说的“大量字符串连接”的意思,Linq 只需几行就可以完成这类事情。我会检查 SQL Server 是否允许将数组作为参数,即使是您在存储过程中选择的 XML 列表
标签: sql-server vb.net