2017-04-04 14 views
0

我有收到表的存儲過程,但每當我做插入我得到這個錯誤:錯誤從vb.net在SQL Server傳遞一個DataTable添加到存儲過程時

Cannot convert a char value to money. The char value has incorrect syntax.

我創建了一個表類型

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 
+0

答案在'dtTable'(你沒有發佈)的定義中。如果你看一下錯誤,你有'dtTabe'數據類型是VARCHAR(基本上是一個字符串)時,它應該是數字(金錢或數字或小數)。可能會容納$符號,你不應該這樣做。 –

+1

旁註:你應該** **不使用'sp_'前綴爲您的存儲過程。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

感謝您的反饋,其實我使用更復雜的名稱爲SP,當我創建dtTable a使用函數執行任何查詢,我希望如果我想返回一個DataTable或DataRow作爲示例:Dim DtTable as datatable = Exec_Query(查詢:=「SELECT ...「,LRw:= false),Lrw =邏輯行,以確定是否需要一個數據行或數據表 – FrankMejia7

回答

1

幾件事情:

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

您需要設置其SqlDbType:

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


2 。在連接之前處理你的命令,o R偶數更好地利用使用模式:

Using ConexionSQL = New SqlConnection(IniciaConexion) 
    Using command As New SqlCommand 

    End Using 
End Using 


3.不要貨幣數據類型,嘗試改變你的SQL數據表中有小數和您的.NET DataTable的第二列有一個小數,如:

DataTable dtTable = new DataTable(); 
dtTable.Columns.Add("Id_Exmp", typeof(int)); 
dtTable.Columns.Add("Discount_Amount", typeof(decimal)); 
+0

我懷疑OP目前使用某種類型的字符/字符串數據類型爲Discount_Amount,但我們直到他們發佈它纔會知道 –

+0

當我創建dtTable a使用一個函數執行任何查詢,我希望如果我想返回一個DataTable或DataRow作爲示例:Dim DtTable as datatable = Exec_Query(Query:=「Select ...」,LRw:= false ),Lrw =邏輯行以確定是否需要數據行或數據表 - – FrankMejia7

-1

你必須打開你的連接。

ConexionSQL.Open(). 
0

我發現這是什麼問題,主要的問題是我如何創建dtTable,爲了正確填寫該表型,我大部分都以同樣的量級類型創建列的順序,舉個例子。

昏暗DtTable如數據表= Exec_Query(查詢:= 「選擇Id_exm,Discoun ..」,LRW:= FALSE)

的地方的原因,我亂放,折扣第一和第二的ID,我沒有請注意,

然後一切正常。

相關問題