【发布时间】: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