【问题标题】:Best practice to pass a list as input in SQL query using vb.net [duplicate]使用 vb.net 在 SQL 查询中传递列表作为输入的最佳实践 [重复]
【发布时间】: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


【解决方案1】:

你可以使用一个函数来获取一个逗号分隔的字符串并返回一个表格......

CREATE FUNCTION [dbo].[FileNames]( @FilenameValues nvarchar(max) )
RETURNS  @Result TABLE( FileName nvarchar(max) )
AS
BEGIN

        -- convert to an xml string
        DECLARE @xml XML 
        SELECT @xml = CAST( '<A>' + REPLACE( @FilenameValues, ',', '</A><A>' ) + '</A>' AS XML )

        -- select rows out of the xml string
        INSERT INTO @Result            
        SELECT DISTINCT LTRIM( RTRIM( t.value( '.', 'nvarchar(max)' ) ) ) AS [FileName]
        FROM @xml.nodes( '/A ') AS x(t)

        RETURN

   END

然后在你的 SQL 中加入它...

JOIN (
    SELECT * FROM dbo.FileNames( 'MyFileName.doc, MyOtherFileName.doc' )
) FileNames ON FileNames.FileName = Docs.Filename 

或者在 WHERE 中使用 ...

WHERE Docs.Filename IN( 
    SELECT * FROM dbo.FileNames( 'MyFileName.doc, MyOtherFileName.doc' )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多