【问题标题】:Need sql statement review for vb.net windows forms express desktop 2013vb.net windows forms express desktop 2013需要sql语句审核
【发布时间】:2015-01-15 16:50:32
【问题描述】:

我已经在这个 sql 语句上工作了大约 2 个小时,但我无法让它为我的一生工作。我很确定所有列名和表名都是正确的,但我在第一期的第三行出现语法错误。你们可以仔细检查我的陈述以确保我没有遗漏任何东西。另外,我在我的 sql 服务器上运行了这段代码,它工作了,所以我想知道为什么它不能在 vb.net 中工作。也许 vb.net 不支持这里的东西?

 Try

                Dim A As String = CBShear.Text
                Dim B As String = CBName.Text
                Using conn1 As New SqlConnection(connstring)
                    conn1.Open()
                    Using comm1 As SqlCommand = New SqlCommand("INSERT INTO Production.dbo.tblFabWipLog (FabWipId, Shear, CheckedIn, NameIn, CartType)" _
                        & "SELECT TOP 1 FabWipID, cast('" & A & "' as varchar), Cast(getdate() as smalldatetime), cast('" & B & "' as varchar), Cast('Mother' as varchar)" _
                       & "FROM production.dbo.tblFabWipID WHERE FabWipID NOT IN (Select tblFabWipID.FabWipID" _
 & "FROM Production.dbo.tblFabWipID LEFT JOIN production.dbo.tblFabWipLog ON tblFabWIPID.FabWipID = tblFabWipLog.FabWipID WHERE Active = 1 AND CheckedOut IS NULL" _
  & "AND NOT CheckedIn IS NULL) AND LocID LIKE 'M%' ORDER BY LocID ASC)", conn1)

                        Dim dt As DataTable = New DataTable
                        Dim rs As New SqlDataAdapter
                        rs.SelectCommand = comm1
                        rs.Fill(dt)
                        DGVCheck.DataSource = dt

                    End Using
                End Using


            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try

【问题讨论】:

  • 更新,第4行sql语句。
  • 这段代码容易受到sql注入攻击。它实际上是在乞求被黑。
  • 我将其更改为 .addwithvalue 参数以使其更安全。我还在我的标准 sql 连接中集成了安全性,并且我还只允许用户通过一个组合框输入数据,该组合框有一个可以从中选择的下拉列表。用户不能输入自己的文本。另外,我怀疑这是否会出于没有理由的目的而被黑客入侵。
  • @JoelCoehoorn 我只使用“.text”应用程序进行测试。请参阅上面的评论。

标签: sql vb.net winforms


【解决方案1】:

连接的每行末尾没有空格。

Using comm1 As SqlCommand = New SqlCommand("INSERT INTO Production.dbo.tblFabWipLog (FabWipId, Shear, CheckedIn, NameIn, CartType) " _
& "SELECT TOP 1 FabWipID, cast('" & A & "' as varchar), Cast(getdate() as smalldatetime), cast('" & B & "' as varchar), Cast('Mother' as varchar) " _
& "FROM production.dbo.tblFabWipID WHERE FabWipID NOT IN (Select tblFabWipID.FabWipID " _
& "FROM Production.dbo.tblFabWipID LEFT JOIN production.dbo.tblFabWipLog ON tblFabWIPID.FabWipID = tblFabWipLog.FabWipID WHERE Active = 1 AND CheckedOut IS NULL " _
& "AND NOT CheckedIn IS NULL) AND LocID LIKE 'M%' ORDER BY LocID ASC)", conn1)

【讨论】:

  • 这解决了主要问题 +1。谢谢!
【解决方案2】:

在为您的 SQL 语句构建字符串时,您没有需要它们的空格。他们是这样写的,这是您的 select 语句在编译时的样子,并且可能解释了它为什么不起作用。

INSERT INTO Production.dbo.tblFabWipLog (FabWipId, Shear, CheckedIn, NameIn, CartType)SELECT TOP 1 FabWipID, cast('[somevalue]' as varchar), Cast(getdate() as smalldatetime), cast('[somevalue]' as varchar), Cast('Mother' as varchar)FROM production.dbo.tblFabWipID WHERE FabWipID NOT IN (Select tblFabWipID.FabWipIDFROM Production.dbo.tblFabWipID LEFT JOIN production.dbo.tblFabWipLog ON tblFabWIPID.FabWipID = tblFabWipLog.FabWipID WHERE Active = 1 AND CheckedOut IS NULLAND NOT CheckedIn IS NULL) AND LocID LIKE 'M%' ORDER BY LocID ASC)

处理这些类型的查询构建例程的最佳方法是使用变量来构建字符串,然后放置一个断点,以便您可以剪切/复制/粘贴到 Sql Mgt Studio 以确保查询作为您的 SQL 语句工作在运行时生成。

【讨论】:

  • 看起来我可能还有一两个语法错误,但这似乎是主要问题。非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多