0

私はインターネットの奥深くを検索してきましたが、私が見つけたすべての解決策はこの問題を解決しませんでした.

VB を使用して、SQL Server 2008 で Visual Web Developer 2010 Express を使用しています。

ID が存在しない場合は、テキスト ボックスに指定された ID と現在の日付 (time_scanned_in) の両方を挿入します (ID が既に存在する場合)。 、列に現在の日時を挿入[time_scanned_out]し、データベースの3つのフィールドすべてがいっぱいの場合、 を返し@message = 1ます。

SQL ストアド プロシージャは次のとおりです。

ALTER PROCEDURE dbo.InsertDateTime
@barcode_id nchar(20),
@message char(1) = 0 Output
AS
BEGIN
    if not exists(select * from tblWork where barcode_id = @barcode_id)
    begin
        INSERT INTO [tblWork] ([barcode_id], [time_scanned]) VALUES (@barcode_id, GetDate())
    end
    else if exists(select * from tblWork where barcode_id = @barcode_id AND time_scanned_out IS NOT NULL )
    begin
        SET @message=1
    end
    else if exists(select * from tblWork where barcode_id = @barcode_id AND time_scanned_out IS NULL)
    begin
        UPDATE [tblWork] SET [time_scanned_out] = GetDate() WHERE [barcode_id] = @barcode_id
    end
RETURN @message
end

これを (SP を右クリックして) 実行すると、問題なく動作し、すべてのフィールドが入力されると値が返されます。

しかし、vb コードで実行すると、そのような手順が見つからず、タイトルにエラーが表示されます。

VBコードは次のとおりです。

Dim opconn As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

Dim sqlConnection1 As New SqlConnection(opconn)
Dim cmd As New SqlCommand
Dim returnValue As Object

cmd.CommandText = "InsertDateTime"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = sqlConnection1

sqlConnection1.Open()
With cmd.Parameters.Add(New SqlParameter("@barcode_id", TextBox.Text))
End With
With cmd.Parameters.Add(New SqlParameter("@message", SqlDbType.Char, 1, Label3.Text))
End With

returnValue = cmd.ExecuteScalar()
sqlConnection1.Close()

リターン部分のコードはまだ作成していないことに注意してください。SPを見つけるために取得したら、コードを作成します。

グリッドビュー内の各データベースの sys.objects.name を持つすべてのオブジェクトを一覧表示しようとしましたが、必要なストアド プロシージャ以外はすべて一覧表示されました。

これはなぜですか、何かアイデアはありますか?解決策を見つけるのに何時間も費やしました。さらにコードや情報が必要な場合は、お気軽にお問い合わせください。

4

3 に答える 3

0

プロジェクト全体をまったく新しいデータベースで再作成し、すべて同じコードをコピーしました。これで、すべてが問題なく機能します。何が悪かったのかはまだわかりませんが、皆さん、ありがとうございました。皆さんは迅速で知識が豊富でした。

興味のある人のための最終的なVBコードは次のとおりです。

Dim myConnection As New SqlConnection(opconn)
Dim cmd As New SqlCommand()
Dim myReader As SqlDataReader

cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = myConnection
cmd.CommandText = "InsertTimes"

cmd.Parameters.AddWithValue("@message", OleDbType.Integer)
cmd.Parameters.AddWithValue("@barcode_id", TextBox.Text)
cmd.Parameters("@message").Direction = ParameterDirection.Output

Try
    myConnection.Open()
    myReader = cmd.ExecuteReader()

    Dim returnMessage As String = cmd.Parameters("@message").Value
    If returnMessage = 1 Then
        label_confirmation.Text = "Record successfully submitted!"
        TextBox.Text = ""
    ElseIf returnMessage = 2 Then
        label_confirmation.Text = "A finish time already exists for the record '" & TextBox.Text & "', would you like to override the finish time anyway?"
        button_yes.Visible = True
        button_no.Visible = True
    ElseIf returnMessage = 3 Then
        label_confirmation.Text = "Record submitted, work operation status complete!"
        TextBox.Text = ""
    End If

Catch ex As Exception
    label_confirmation.Text = ex.ToString()
Finally
    myConnection.Close()
End Try
于 2012-08-09T10:04:25.453 に答える
0

最初にcmd.parameters.clear()を試してから、cmdオブジェクトへのパラメーターの追加を開始してください。また、cmd.executescaler()の代わりに、cmd.executenonqueryまたはcmd.executeReader()を試してください。

于 2012-08-08T10:27:56.287 に答える
0

これを試して

 cmd.Parameters.AddWithValue("@barcode_id",  TextBox.Text)
 SqlParameter prmOut = cmd.Parameters.Add("@message",SqlDbType.Char, 1)
 prmOut.Value = Label3.Text
 prmOut.Direction = ParameterDirection.InputOutput

 cmd.ExecuteNonQuery()

 returnValue = prmOut.Value.ToString()
于 2012-08-08T10:34:34.810 に答える