Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从SQL查询中检索值并将其存储在VB.NET中的变量中?_Sql_Vb.net - Fatal编程技术网

如何从SQL查询中检索值并将其存储在VB.NET中的变量中?

如何从SQL查询中检索值并将其存储在VB.NET中的变量中?,sql,vb.net,Sql,Vb.net,我试图找到最大产品ID,并将该值存储在局部变量“MaxID”中,然后返回该值。我正在尝试将查询结果转换为整数类型,但无法执行此操作。代码如下: Public Function GetMaxID(ByVal TableName As String, ByVal ID As String) As Integer Dim MaxID As Integer Dim sqlquery As SqlCommand Dim field_name As Strin

我试图找到最大产品ID,并将该值存储在局部变量“MaxID”中,然后返回该值。我正在尝试将查询结果转换为整数类型,但无法执行此操作。代码如下:

Public Function GetMaxID(ByVal TableName As String, ByVal ID As String) As Integer
        Dim MaxID As Integer
        Dim sqlquery As SqlCommand
        Dim field_name As String = ID
        Dim con As SqlConnection
        con = New SqlConnection()
        con.ConnectionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename='D:\Docs Dump\Work\Srinath\SrinathDB.mdf';Integrated Security=True;Connect Timeout=30"
        con.Open()
        Try
            sqlquery = New SqlCommand("SELECT MAX( @field ) FROM @table ", con)
            sqlquery.Parameters.AddWithValue("@field", field_name)
            sqlquery.Parameters.AddWithValue("@table", TableName)
            MaxID = CInt(sqlquery.ToString)
            con.Close()
            Return MaxID
        Catch ex As Exception
            Return 0
            Exit Function
            con.Close()
        End Try
    End Function
End Class
MaxID=CInt(sqlquery.ExecuteScalar())
您还应该了解
SqlCommand.ExecuteReader()
SqlCommand.ExecuteNonQuery()
(用于插入/更新/删除)和
SqlDataAdapter.Fill()

仍然存在的问题是,不能将参数值用于表名或列名。Sql Server引擎有一个“编译”步骤,在该步骤中,它必须能够在查询开始时制定执行计划,包括权限/安全性,但是像
@table
@field
这样的变量名直到稍后才会解析。这并不是实际发生的情况,但请将其视为在这些地方有字符串文字;想象一下试着运行这个:

SELECT MAX('ID') FROM 'MyTable'
MAX('ID')
将始终从任何行中的
ID
列返回字符串值
ID
,而任何内容。但是
MyTable
部分不是字符串文本的正确位置,这样的查询甚至无法编译

我还经常看到这里的人试图创建像
GetMaxId()
这样的函数,但一开始几乎总是被误导。如果此函数的预期用途与我通常看到的相同,那么您在应用程序中设置了一个主要的竞争条件问题(可能在任何测试中都不会出现)。Sql Server为您提供了诸如
identity
列、
sequences
scope\u identity()函数等功能。您应该以这样的方式使用这些ID,即在创建新ID时在服务器上解析它们,然后仅(并且立即)返回到应用程序代码

但撇开这个问题不谈,这里有一个更好的方法来构造这个函数:

公共类数据库
私有解析为String=“数据源=(LocalDB)\MSSQLLocalDB;AttachDbFilename='D:\Docs Dump\Work\Srinath\SrinathDB.mdf';集成安全性=True;连接超时=30”
'您希望每个已经知道表名和列名的表都有一个单独的方法
公共函数GetMyTableMaxID()为整数
Dim sql As String=“从MyTable中选择最大值(ID)”
将con用作新的SqlConnection(构造)_
sqlQuery作为新的SqlCommand(sql,con)
“参数就在这里。
'不要使用AddWithValue()!这会造成性能问题。
'相反,在提供特定类型信息的地方使用Add()重载。
'此级别没有异常处理。UI或业务层更适合处理这些问题
con.Open()
返回CInt(sqlQuery.ExecuteScalar())
终端使用
'无需呼叫con.Close()
“在旧代码中,它被完全忽略了,但由此处的Using块处理
端函数
末级
MaxID=CInt(sqlquery.ExecuteScalar())
您还应该了解
SqlCommand.ExecuteReader()
SqlCommand.ExecuteNonQuery()
(用于插入/更新/删除)和
SqlDataAdapter.Fill()

仍然存在的问题是,不能将参数值用于表名或列名。Sql Server引擎有一个“编译”步骤,在该步骤中,它必须能够在查询开始时制定执行计划,包括权限/安全性,但是像
@table
@field
这样的变量名直到稍后才会解析。这并不是实际发生的情况,但请将其视为在这些地方有字符串文字;想象一下试着运行这个:

SELECT MAX('ID') FROM 'MyTable'
MAX('ID')
将始终从任何行中的
ID
列返回字符串值
ID
,而任何内容。但是
MyTable
部分不是字符串文本的正确位置,这样的查询甚至无法编译

我还经常看到这里的人试图创建像
GetMaxId()
这样的函数,但一开始几乎总是被误导。如果此函数的预期用途与我通常看到的相同,那么您在应用程序中设置了一个主要的竞争条件问题(可能在任何测试中都不会出现)。Sql Server为您提供了诸如
identity
列、
sequences
scope\u identity()函数等功能。您应该以这样的方式使用这些ID,即在创建新ID时在服务器上解析它们,然后仅(并且立即)返回到应用程序代码

但撇开这个问题不谈,这里有一个更好的方法来构造这个函数:

公共类数据库
私有解析为String=“数据源=(LocalDB)\MSSQLLocalDB;AttachDbFilename='D:\Docs Dump\Work\Srinath\SrinathDB.mdf';集成安全性=True;连接超时=30”
'您希望每个已经知道表名和列名的表都有一个单独的方法
公共函数GetMyTableMaxID()为整数
Dim sql As String=“从MyTable中选择最大值(ID)”
将con用作新的SqlConnection(构造)_
sqlQuery作为新的SqlCommand(sql,con)
“参数就在这里。
'不要使用AddWithValue()!这会造成性能问题。
'相反,在提供特定类型信息的地方使用Add()重载。
'此级别没有异常处理。UI或业务层更适合处理这些问题
con.Open()
返回CInt(sqlQuery.ExecuteScalar())
终端使用
'无需呼叫con.Close()
“在旧代码中,它被完全忽略了,但由此处的Using块处理
端函数
末级

不能使用参数定义字段或表名。应调用