【问题标题】:SQL Server stored procedure allows to insert into a table only numbers, not charactersSQL Server 存储过程只允许向表中插入数字,而不是字符
【发布时间】:2015-07-31 07:47:23
【问题描述】:

我开发了一个连接到 SQL Server 2014 的 vb.net 应用程序。在服务器端,我创建了以下存储过程,以便在 vb 应用程序调用时向表中插入一行。

create procedure uspInsertToTableWith1Value
@table nvarchar(50),
@column nvarchar(50),
@value nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
declare @SQL nvarchar(50)
select @SQL = N'INSERT INTO ' + QUOTENAME(@table) + ' (' + @column + ') ' + 'VALUES (' + @value + ')';
EXEC sp_executesql @SQL
END

vb 应用有一个按钮,代码如下:

Private Sub Button22_Click(sender As System.Object, e As System.EventArgs) Handles Button22.Click
Dim tbl1 = "Facility"
Dim cln1 = "f1"
Dim vl1 = TextBox7.Text
InsertToTableWith1Value(tbl1, cln1, vl1)
end sub

这是连接到 SQL Server 的 sub:

Public Sub InsertToTableWith1Value(tbl, cln, vl)
    Try
        Dim cmd As New SqlCommand
        cmd.Connection = con
        cmd.CommandText = "uspInsertToTableWith1Value"
        cmd.CommandType = CommandType.StoredProcedure
        With cmd.Parameters

            .AddWithValue("@table", tbl)
            .AddWithValue("@column", cln)
            .AddWithValue("@value", vl)
        End With
        con.Open()
        cmd.ExecuteNonQuery()
        con.Close()
    Catch ex As Exception
        con.Close()
        MsgBox(ex.Message)
    End Try
End Sub

问题是当我通过 vb 应用程序向表中添加新记录时,它只接受数字。当我添加字符或带有字符的数字时,它会删除所有头部数字,只留下剩余的字符并给出两个异常错误,具体取决于我输入的内容。例如,如果我输入“2ww”,我会得到“'ww' 附近的语法错误”。如果我输入“ww”,我会得到“Invalid column name 'ww'”。

知道如何解决这个问题吗?我已经花了两天时间在网上搜索。感谢所有帮助我的人。

顺便说一句,如果我手动直接通过服务器添加行,它会接受所有内容,这没关系。

我听从了你们给我的所有建议,所以这是我的最终代码,它运行良好: (我真的希望把这最后一句话贴在正确的地方)

Public Sub InsertToTableWith1Value(tbl, cln, vl)
    Try
        Dim cmd As New SqlCommand
        cmd = New SqlCommand("INSERT [" & tbl & "] (" & cln & ") VALUES ('" & vl & "')", con)
        With cmd.Parameters
            .AddWithValue("@table", tbl)
            .AddWithValue("@column", cln)
            .AddWithValue("@value", vl)
        End With
        con.Open()
        cmd.ExecuteNonQuery()
        con.Close()
    Catch ex As Exception
        con.Close()
        MsgBox(ex.Message)
    End Try

End Sub

【问题讨论】:

  • 为什么该存储过程甚至存在?这就像你试图通过重新实现 SQL 来避免 SQL,非常糟糕。如果您要允许应用程序拥有将数据插入任何表的任何列的完全访问权限,只需让它运行 ad-hoc INSERTs 并完成它。
  • 嗯,你是对的,但由于我是 SQL Server 新手,我创建这个存储过程只是为了我的学习目的。

标签: sql-server vb.net stored-procedures


【解决方案1】:

我认为问题在于您需要在单词周围加上撇号

insert into table (col1) values ('2ww')

您可以在 SQL Server 中使用 '' 来表示单个撇号。

解决办法是

select @SQL = N'INSERT INTO ' + QUOTENAME(@table) + ' (' + @column + ') ' + 'VALUES (''' + @value + ''')';

编辑请注意,这只会让您将数据插入到具有文本数据类型的列中,您不希望数字数据插入时使用撇号。

【讨论】:

  • SQL 注入警报! SQL 注入警报!
  • 是的,这就是我所需要的,只是用于文本数据类型。
  • 为什么不用带参数的 sp_executesql 呢?
  • @Horia 我同意,但仅供参考,您不能参数化表/列名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多