0

実際、データベーステーブルにpartnoが存在するかどうかを調べようとしていますが、count =checkCommand.ExecuteReadersataementで時間がかかります。

以下の方法を見つけてください

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

4 に答える 4

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
于 2012-06-13T14:57:05.740 に答える
0

PartNo_checkが単一の数値のみを返すと仮定して、使用してみてください

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

与えられたストアドプロシージャコードを使用して、

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

ストアドプロシージャが1つの列を持つ1つの行のみを返す場合、ExecuteScalarはその一意の結果を戻り値として受け取ります。追加の列または行は無視されます

MSDNリファレンスを参照してください

于 2012-06-13T11:14:15.020 に答える
0

私は問題をボトムアップでデバッグしようとします。ある種のSQL管理ツールで照会することにより、ストアドプロシージャに時間がかかりすぎているかどうかを確認できます。

その場合、私の最初の解決策は、データベースの最適化、インデックスの確認などです。

于 2012-06-13T11:14:20.820 に答える
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

これはあなたの問題のためですが、関連するデータを操作したい場合、これは良い解決策ではありません。

これがあなたが望むように速く働くことを願っています!

于 2012-06-13T12:50:28.530 に答える