【问题标题】:Error when Passing a DataTable from vb.net to a stored procedure in SQL Server将 DataTable 从 vb.net 传递到 SQL Server 中的存储过程时出错
【发布时间】:2017-04-04 23:00:46
【问题描述】:

我有一个接收表的存储过程,但每当我进行插入时,我都会收到此错误:

无法将 char 值转换为货币。 char 值的语法不正确。

我创建一个表作为类型

CREATE TYPE dbo.Example AS TABLE
(
  Id_Exmp          int, 
  Discount_Amount  Money
)

我有一个以数据表为参数的存储过程:

CREATE PROCEDURE dbo.SP_Exmp
    @datatable dbo.Example READONLY
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO dbo.destination_table(column_list)
        SELECT column_list 
        FROM @datatable;
END

这是我在 VB.net 中的代码:

Function Example(ByVal dtTable as datatable)
    Try
        ConexionSQL = New SqlConnection(IniciaConexion)
        Command = New SqlCommand("SP_Exmp", ConexionSQL)
        Command.CommandType = CommandType.StoredProcedure

        'Parametros a Utilizar
        Command.Parameters.AddWithValue("@datatable ", dtTable )

        ConexionSQL.Open()
        If Command.ExecuteNonQuery() Then
            Return True
        Else
            Return False
        End If
        ConexionSQL.Close()
        ConexionSQL.Dispose()
        Command.Dispose()

    Catch ex As Exception
        MensajeError(ex, "Error")
        Return False
    End Try
End Function

【问题讨论】:

  • 答案在dtTable 的定义中(你还没有发布)。如果您查看错误,您在dtTabe 中有一个数据类型,即 varchar(基本上是一个字符串),而它应该是数字(货币或数字或小数)。可能是为了容纳 $ 符号,你不应该这样做。
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本没有前缀!
  • 感谢您的反馈,实际上我为 SP 使用了更复杂的名称,当我创建 dtTable 时使用执行任何查询的函数,我决定是否要返回 DataTable 或 DataRow示例: Dim DtTable as datatable = Exec_Query(Query:="Select...", LRw:=false), Lrw=Logic Row 以确定是否需要数据行或数据表

标签: c# sql-server vb.net stored-procedures datatable


【解决方案1】:

有几点:

  1. Command.Parameters.AddWithValue("@datatable ", dtTable )

你需要设置它的SqlDbType:

Command.Parameters.AddWithValue("@datatable ", dtTable).SqlDbType = SqlDbType.Structured;


2. 在连接之前处理你的命令,或者更好地使用使用模式:
Using ConexionSQL = New SqlConnection(IniciaConexion)
    Using command As New SqlCommand

    End Using
 End Using


3. 尝试将 SQL DataTable 更改为具有 Decimal 的第二列,并将 .Net Datatable 更改为具有 Decimal,而不是 Money DataType,例如:
DataTable dtTable = new DataTable();
dtTable.Columns.Add("Id_Exmp", typeof(int));
dtTable.Columns.Add("Discount_Amount", typeof(decimal));

【讨论】:

  • 我怀疑 OP 目前正在为 Discount_Amount 使用某种 char/string 数据类型,但在他们发布之前我们不会知道
  • 当我创建 dtTable a 使用执行任何查询的函数并且我决定是否要返回 DataTable 或 DataRow 作为示例: Dim DtTable as datatable = Exec_Query(Query:="Select. ..", LRw:=false), Lrw=Logic Row 以确定是否需要数据行或数据表 –
【解决方案2】:

我发现问题出在哪里,主要问题是我如何创建 dtTable 的顺序,为了正确填写表格类型,我通常在类型上创建具有相同顺序的列,作为示例。

Dim DtTable as datatable = Exec_Query(Query:="Select Id_exm, Discoun..", LRw:=false)

不管是什么原因,我乱七八糟的,先打折后id,我没注意,

然后一切正常。

【讨论】:

    【解决方案3】:

    你必须打开你的连接。

    ConexionSQL.Open().
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2012-06-21
      相关资源
      最近更新 更多