0

我一直在搜索互联网的深处,我发现的所有解决方案都没有解决这个问题。

我正在使用 Visual Web Developer 2010 Express 和 SQL Server 2008,使用 VB。

我正在尝试执行一个存储过程以将一些来自文本框控件的数据插入到数据库中,如果 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 就会这样做。

尝试在 gridview 中列出每个数据库的 sys.objects.name 的所有对象,它列出了除我想要的存储过程之外的所有内容。

这是为什么,有什么想法吗?将不胜感激,花了几个小时试图找到一个解决方案。如果有人需要更多代码或信息,请随时询问。

4

3 回答 3

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 回答
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 回答