【发布时间】:2018-03-05 16:52:22
【问题描述】:
我有以下代码,它只是执行一个接受 1 个参数的存储过程。
Public Function GetData(ByVal Faccode As String, Optional ByRef s As String = "") As DataSet
Dim params As SqlParameter() = {New SqlParameter("@aFacilityCode", SqlDbType.VarChar, ParameterDirection.Input)}
' Set the value
params(0).Value = "SW29" 'Faccode
Try
Dim DSet As DataSet = RunProcedure("usp_FL_GetAllData", params, "ContactData")
Return DSet
Catch ex As Exception
Return Nothing
End Try
End Function
Protected Overloads Function RunProcedure( _
ByVal storedProcName As String, _
ByVal parameters As IDataParameter(), _
ByVal tableName As String) _
As DataSet
Dim dataSet As New dataSet
Try
myConnection.Open()
Dim sqlDA As New SqlDataAdapter
sqlDA.SelectCommand = BuildQueryCommand(storedProcName, parameters)
sqlDA.Fill(dataSet, tableName)
Return dataSet
Catch ex As Exception
Return Nothing
Finally
If myConnection.State = ConnectionState.Open Then
myConnection.Close()
End If
End Try
End Function
Private Function BuildQueryCommand( _
ByVal storedProcName As String, _
ByVal parameters As IDataParameter()) _
As SqlCommand
Dim command As New SqlCommand(storedProcName, myConnection)
command.CommandType = CommandType.StoredProcedure
Dim parameter As SqlParameter
For Each parameter In parameters
command.Parameters.Add(parameter)
Next
Return command
End Function
SQL 过程是这样定义的:
CREATE PROCEDURE [dbo].[usp_FL_GetAllData]
(
@aFacilityCode VARCHAR(10)
)
当我运行该软件时,SQL Profiler 显示正在进行此调用:
exec usp_FL_GetAllData @aFacilityCode='S'
最初,我在GetData 函数中为我的参数分配值Faccode,但注意到这种奇怪的截断,这就是我现在对值进行硬编码的原因。
我唯一能想到的是 SQL 过程将参数定义为varchar(1),但它被定义为 10,所以我不知道为什么会这样。 RunProcedure 用于许多不表现出这种行为的地方。
还有什么可能导致这种情况?
【问题讨论】:
-
你在你的过程中使用字符串连接吗?如果是这样,您是否正确地转义了任何撇号 (')?
-
fyi:ADO.Net 使用了一种称为“连接池”的功能,在尝试重用相同的连接对象时效果不佳。
RunProcedure()方法应该为每个调用创建一个新的连接对象,并且只重复使用相同的连接字符串。这样你真的好多了。 -
@DimUser 没有撇号或任何类似的字符。预期的 SQL 应该是
exec usp_FL_GetAllData @aFacilityCode = 'SW29'。 -
@JoelCoehoorn 我会调查一下,但这是一个非常古老的应用程序,我正在尝试修改,所以如果这从来不是问题,如果现在是问题,我会感到惊讶。该应用程序曾经同时使用 Oracle 和 MS SQL,因此我将 Oracle 代码删除并替换为 MS SQL 代码。
-
您的代码显示
SqlDbType.VarChar- 长度在哪里?varchar在很多情况下默认为varchar(1)。
标签: sql-server vb.net