【问题标题】:VB: Stored Procedures and Passing in ParametersVB:存储过程和传入参数
【发布时间】:2014-04-01 19:19:05
【问题描述】:

我很难让一个存储过程在传递给它的参数的情况下执行。我已经用网络上的不同示例更改了代码,但我不断收到以下错误,所以我一定是错了。

*Conversion failed when converting the varchar value 'Error' to data type int*

一个作业号从 txt_JobNumber.Text 传递到 v_jobNumber,然后它被传递到存储过程中。然后存储过程进行查找和插入。存储过程在 T-SQL “EXEC Z_Add_LotNumber 'IU9FU-0000'”中自行正常执行

以下是为 VB、存储过程和堆栈跟踪截取的一些代码。有人可以指出我做错了什么。

我正在使用 Visual Studio 2013 Professional 和 SQL Server 2008 R2

VB 代码

Private Sub btn_Run_Click(sender As Object, e As EventArgs) Handles btn_Run.Click
    Dim response As MsgBoxResult

    v_jobNumber = txt_JobNumber.Text    'IUBG1-0000  >>> Value of txt_JobNumber.Text
    lbl_JobNumber.Text = v_jobNumber

    '======================================================================================================
    Dim conn As SqlConnection
    Dim com As SqlCommand
    Dim connectionString As String = "Data Source=[hostname];uid=[user];pwd=[password];database=[database]"

    conn = New SqlConnection(connectionString)
    com = New SqlCommand()

    com.Connection = conn
    com.CommandType = CommandType.StoredProcedure
    com.CommandText = "Z_Add_LotNumber"
    com.Parameters.AddWithValue("@fjobno", v_jobNumber)   'IUBG1-0000  >>> Value of v_jobNumber

    conn.Open()
    com.ExecuteNonQuery() ‘<<<<< Error >>>>> [Conversion failed when converting the varchar value 'Error' to data type int.]
    conn.Close()
    '======================================================================================================

    response = MsgBox("Job Number: " & v_jobNumber)

End Sub

存储过程

ALTER PROCEDURE [dbo].[Z_Add_LotNumber]
  @fjobno varchar(50)
AS
DECLARE @V_Date smalldatetime;
DECLARE @V_fpartno varchar(25);

SET @V_Date = GETDATE();
SET @V_fpartno = (SELECT fpartno FROM joitem WHERE fjobno =  @fjobno);

BEGIN
.
.
.
END

INSERT INTO Z_LotNumber(
        JobNumber
        PartNumber
        CreateDate
        .
        .
        .
        )Values(
        @fjobno
        @V_fpartno
        @V_Date
        .
        .
        .
        )

堆栈跟踪

   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteScalar()
   at AutoGenLotNumber.Form1.btn_Run_Click(Object sender, EventArgs e) in c:\users\xxxxx\documents\visual studio 2013\Projects\AutoGenLotNumber\AutoGenLotNumber\Form1.vb:line 32
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(ApplicationContext context)
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
   at AutoGenLotNumber.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

表定义

    COLUMN_NAME,                DATA_TYPE,          CHAR_MAX_LENGTH,    IS_NULLABLE
1   Id                          int                 NULL                NO
2   JobNumber                   char                15                  YES
3   PartNumber                  char                25                  YES
4   PartRev                     char                3                   YES
5   PartQuantity                numeric             NULL                YES
6   RecordType                  char                1                   YES
7   LotNumber                   char                20                  YES
8   CreateDate                  smalldatetime       NULL                YES
9   PartDescription             varchar            -1                   YES
10  HIBIC_Number                varchar             22                  YES
11  ExpirationDate              varchar             7                   YES
12  CIFF_Reference              varchar             300                 YES
13  Auxiliary_CIFF_Reference    varchar             300                 YES

【问题讨论】:

  • 显示Z_LotNumber表定义...
  • 您不必将单引号连接到参数值。

标签: sql sql-server vb.net stored-procedures


【解决方案1】:

把参数定义改成这样:

 com.Parameters.AddWithValue("@fjobno", v_jobNumber) 

或者我喜欢的方式:

com.Parameters.Add(new SqlParameter("@fjobno", v_jobNumber)) 

编辑: 您不必将单引号连接到参数值。

编辑 2:

 conn.Open()
 com.ExecuteNonQuery() //Not ExecuteScalar()
 conn.Close()

【讨论】:

  • 我尝试了您的两个建议,但仍然遇到同样的错误。还有什么我可以尝试的吗?
  • 另外,您正在使用 com.ExecuteScalar(),当您想从存储过程中返回单个值时,您可以使用该方法,只需尝试使用 ExecuteNonQuery()
  • 我换掉了执行语句,我仍然在该行代码上遇到同样的错误。
猜你喜欢
  • 2016-07-13
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多