功能需要很长时间才能执行

时间:2012-06-13 11:07:05

标签: sql vb.net sql-server-2008 ado.net

实际上,我试图找出数据库表中是否存在partno,并且在count = checkCommand.ExecuteReader sataement中需要很长时间

请找到以下方法

Public Function CheckProductNo(ByVal Partno As String) As Boolean
    Dim count As SqlDataReader
    Dim valid As Boolean = False
    Using connection As New SqlConnection
         connection.Open()
        Using checkCommand As New SqlCommand("PartNo_check", connection)

            checkCommand.CommandType = CommandType.StoredProcedure
            checkCommand.Parameters.Add(New SqlParameter("@PartNo", Partno))
            count = checkCommand.ExecuteReader
            If count.ToString > 0 Then
                valid = True
            End If
        End Using

    End Using
    Return valid

End Function


STORED PROCEDURE
CREATE PROCEDURE PartNo_Check
@PartNo VARCHAR(30)

AS

SELECT PartNo from T_Product where PartNo=@Partno

Thanks 

4 个答案:

答案 0 :(得分:1)

重要的是具体说明你的代码应该做什么 - 看起来就像你试图确定某些东西是否存在,而不是它的计数或其他属性。为此,我会修改你的sproc如下:

STORED PROCEDURE
CREATE PROCEDURE PartNo_Check
@PartNo VARCHAR(30)

AS

SET NOCOUNT ON;

SELECT  CASE WHEN EXISTS ( SELECT PartNo 
                           FROM     T_Product
                           where PartNo=@Partno) THEN 1
             ELSE 0
        END

从理论上讲,这应该是你想要做的最好的,你应该确保ParNo列上有一个索引,正如史蒂夫所说的那样。然后您的方法可以写成:

 Public Function CheckProductNo(ByVal Partno As String) As Boolean
   Using connection As New SqlConnection
     connection.Open()
    Using checkCommand As New SqlCommand("PartNo_check", connection)
        checkCommand.CommandType = CommandType.StoredProcedure
        checkCommand.Parameters.Add(New SqlParameter("@PartNo", Partno))
        return convert.toboolean(checkCommand.executescalar)
    End Using

End Using

End Function

答案 1 :(得分:0)

假设您的PartNo_check仅返回单个数值,请尝试使用

Dim result As Integer = Convert.ToInt32(checkCommand.ExecuteScalar())

使用给定的存储过程代码,然后使用

Dim result As String = checkCommand.ExecuteScalar().ToString()

如果存储过程只返回一行,其中一列执行,则ExecuteScalar将该唯一结果作为其返回值。忽略其他列或行

See MSDN references

答案 2 :(得分:0)

我会尝试从下往上调试问题;您可以通过在某种SQL管理工具中查询存储过程来检查存储过程是否花费了太多时间。

如果是这种情况,我的第一个决议是优化数据库,检查索引等。

答案 3 :(得分:0)

如果您的目标是确认Partno是否有数据,那么我建议您将查询修改为:

STORED PROCEDURE
CREATE PROCEDURE PartNo_Check
@PartNo VARCHAR(30)

AS

SELECT Top 1 PartNo from T_Product where PartNo=@Partno

然后你必须

count = checkCommand.ExecuteReader
If count.HasRow then valid=true

这是针对您的问题,但如果您想操纵任何相关数据,这将不是一个好的解决方案。

希望这项工作尽可能快!