我一直在寻找互联网的深度,我找到的所有解决方案都没有解决这个问题。
我正在使用Visual Web Developer 2010和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()
注意,我还没有完成返回部分的代码,一旦找到它就会这样做。
尝试使用sys.objects.name为gridview中的每个数据库列出所有对象,它列出了除我想要的存储过程之外的所有内容。
为什么这个,任何想法?非常感谢,花了好几个小时试图找到解决方案。 如果有人需要更多代码或信息,请随时提出。
答案 0 :(得分:0)
首先尝试cmd.parameters.clear(),然后开始在cmd对象中添加参数。也可以代替cmd.executescaler(),尝试cmd.executenonquery或cmd.executeReader()
答案 1 :(得分: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()
答案 2 :(得分: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