【问题标题】:How to convert this String-based sql query to use Linq如何将此基于字符串的 sql 查询转换为使用 Linq
【发布时间】:2011-02-03 17:30:23
【问题描述】:

我有以下例程(有效),但由于它使用手动输入的字符串,更新起来很麻烦:

Private Sub ListDefaults()
    Dim conn As New SqlConnection( _
    "server=bas047\AUTODESKVAULT;Database=DWGDetails;Integrated Security=SSPI")
    'Dim conn As New SqlConnection( _
    '"server=bas047\AUTODESKVAULT;Database=DWGDetails;Integrated Security=SSPI")
    Try
        'clear columns
        If Not Me.DataGridView1.DataSource Is Nothing Then
            Me.DataGridView1.Columns.Clear()
            Me.DataGridView1.DataSource = Nothing
        End If
        conn.Open()
        Dim cmd As SqlCommand = conn.CreateCommand()
        Dim DLcmd As SqlCommand = conn.CreateCommand()
        Dim ILcmd As SqlCommand = conn.CreateCommand()
        'Dim srctbl As String = String.Empty
        If RadioButton1.Checked = True Then 'A3
            shtsize = "A3"
            cmd.CommandText = "SELECT [AttributeName],[IsDefaultValue],[DefaultValue] FROM " & _
                Chr(34) & "DefaultValues(Borders SB-A3_993-5.2(block))" & Chr(34)
            srctbl = "DefaultValues(Borders SB-A3_993-5.2(block))"
        ElseIf RadioButton2.Checked = True Then 'A2
            shtsize = "A2"
            cmd.CommandText = "SELECT [AttributeName],[IsDefaultValue],[DefaultValue] FROM " & _
                Chr(34) & "DefaultValues(Borders SB-A2_992-5.2(block))" & Chr(34)
            srctbl = "DefaultValues(Borders SB-A2_992-5.2(block))"
        ElseIf RadioButton3.Checked = True Then 'A1
            shtsize = "A1"
            cmd.CommandText = "SELECT [AttributeName],[IsDefaultValue],[DefaultValue] FROM " & _
                Chr(34) & "DefaultValues(Borders SB-A1_991-5.2(block))" & Chr(34)
            srctbl = "DefaultValues(Borders SB-A1_991-5.2(block))"
        ElseIf RadioButton4.Checked = True Then 'A0
            shtsize = "A0"
            cmd.CommandText = "SELECT [AttributeName],[IsDefaultValue],[DefaultValue] FROM " & _
                Chr(34) & "DefaultValues(Borders SB-A0_990-5.2(block))" & Chr(34)
            srctbl = "DefaultValues(Borders SB-A0_990-5.2(block))"
        End If

        'Populate datagridview1
        da = New SqlDataAdapter(cmd.CommandText, conn.ConnectionString)
        ds = New DataSet
        da.Fill(ds, srctbl)

        DataGridView1.DataSource = ds.Tables(0)
        DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells)
        'should enable setting of the date and drawn by entries
        'Dim X As Integer
        'For X = 0 To DataGridView1.Rows.Count
        '    If UCase(DataGridView1.Rows(X).Cells(0).Value) = "DRAWN BY" Then
        '        MessageBox.Show("Found Drawn by!")
        '    End If
        'Next
    Catch ex As System.Data.SqlClient.SqlException
        MessageBox.Show("There was an error in executing the SQL." & vbLf & "Error Message:" & ex.Message, "SQL")
    Finally
        'cleanup and reset!
        conn.Close()
    End Try
End Sub

我认为这是 Linq 的理想人选。到目前为止,这就是我所拥有的似乎可行的方法:

Private Sub ListDefaultsMk1()
    Try
        Using db As New DWGDetailsDataContext
            If RadioButton1.Checked = True Then 'A3
                shtsize = "A3"
                DataGridView1.DataSource =
                From c In db.DefaultValues_Borders_SB_A3_993_5_2_block__s()
                Select New With {c.AttributeName, c.IsDefaultValue, c.DefaultValue}
            ElseIf RadioButton2.Checked = True Then 'A2
                shtsize = "A2"
                DataGridView1.DataSource =
                    From c In db.DefaultValues_Borders_SB_A2_992_5_2_block__s()
                    Select New With {c.AttributeName, c.IsDefaultValue, c.DefaultValue}
            ElseIf RadioButton3.Checked = True Then 'A1
                shtsize = "A1"
                DataGridView1.DataSource =
                    From c In db.DefaultValues_Borders_SB_A1_991_5_2_block__s()
                    Select New With {c.AttributeName, c.IsDefaultValue, c.DefaultValue}
            ElseIf RadioButton4.Checked = True Then 'A0
                shtsize = "A0"
                DataGridView1.DataSource =
                    From c In db.DefaultValues_Borders_SB_A0_990_5_2_block__s()
                    Select New With {c.AttributeName, c.IsDefaultValue, c.DefaultValue}
            End If
        End Using
    Catch ex As Exception
        MessageBox.Show("There was an error in executing the SQL." & vbLf & "Error Message:" & ex.Message, "SQL")
    End Try
End Sub

我的程序的下一步是从 datagridview 中获取(编辑的)值(在手写 SQL 代码的情况下,共享数据集“ds”)并填充另一个表,但我不知道如何使用 Linq 执行此操作。

谁能提供帮助?

提前致谢,

亚历克斯。

编辑:这是我根据评论将其简化为的内容

    Private Sub ListDefaultsMk1()
    Try
        Using db As New DWGDetailsDataContext
            If RadioButton1.Checked = True Then 'A3
                shtsize = "A3"
                DataGridView1.DataSource = (From c In db.DefaultValues_Borders_SB_A3_993_5_2_block__s Select c).ToList()
            ElseIf RadioButton2.Checked = True Then 'A2
                shtsize = "A2"
                DataGridView1.DataSource = (From c In db.DefaultValues_Borders_SB_A2_992_5_2_block__s Select c).ToList()
            ElseIf RadioButton3.Checked = True Then 'A1
                shtsize = "A1"
                DataGridView1.DataSource = (From c In db.DefaultValues_Borders_SB_A1_991_5_2_block__s Select c).ToList()
            ElseIf RadioButton4.Checked = True Then 'A0
                shtsize = "A0"
                DataGridView1.DataSource = (From c In db.DefaultValues_Borders_SB_A0_990_5_2_block__s Select c).ToList()
            End If
        End Using
    Catch ex As Exception
        MessageBox.Show("There was an error in executing the Linq2SQL Query!" & vbLf & "Error Message:" & ex.Message, "SQL")
    End Try
End Sub

【问题讨论】:

    标签: sql vb.net linq linq-to-sql


    【解决方案1】:

    Linq2Sql 和 DataSets 是两个完全不同的野兽,您可以在网格中使用它们的原因是因为网格可以使用更多类型而不仅仅是数据集。

    您可以在技术上使用 ToList() 来确定 linq 查询结果,然后将列表绑定到网格。之后,所有编辑都将反映在 List 上,您可以根据需要将其转换为其他格式(除了表格、数据集中的表格(必须是数据集)、表格之外,您没有提供有关数据应该去哪里的太多信息在数据库等)。

    【讨论】:

    • 谢谢 mmix,我现在有空就来看看 - 直到现在我才看到你的回复。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多