2017-04-04 19 views
0

にストアドプロシージャにvb.netからのDataTableを渡すとき、私はテーブルを受け取るストアドプロシージャを持っていますが、私はこのエラーを取得し、インサート作るたび:エラーSQL Serverの

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 
) 

として表Iは、パラメータとしてデータテーブルを取るストアドプロシージャがあります。

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(あなたが投稿していない)の定義にあります。エラーを見ると、数値(金額または数値または小数)でなければならないときに、varchar(基本的に文字列)である 'dtTabe'にデータ型があります。おそらくあなたがしてはならない$記号に対応するでしょう。 –

+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を作成すると、関数を使用するとすべてのクエリが実行され、DataTableまたはDataRowを例として返すといいでしょう。Dim DtTable as datatable = Exec_Query(クエリ:= "選択..."、LRw:= false)、Lrw =データローまたはデータテーブルが必要かどうかを判断するための論理行 – FrankMejia7

答えて

1

カップル:

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

あなたは、そのは、SqlDbTypeを設定する必要があります。

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


2接続の前にコマンドを破棄してください。 Rも、より有効に利用するパターンの使用:代わりマネーのデータ型の

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

    End Using 
End Using 


3を、例えば、小数点を持つように小数点とあなたの.NetのDataTableの2番目の列を持っているあなたのSQLのデータテーブルを変更してみてください:

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

OPが現在Discount_Amountのためのある種のchar/stringデータ型を使用していると思われますが、投稿するまではわかりません –

+0

dtTableを作成するときa関数を使用するとクエリが実行され、例としてDataTableまたはDataRowを返すとしたらどうなるでしょう:Dim DtTable as datatable = Exec_Query(Query:= "Select ..."、LRw:= false )、Lrw =ロジックローで、データローまたはデータテーブルが必要かどうかを判断する - – FrankMejia7

-1

接続を開く必要があります。私はそれが問題だったものが分かった

ConexionSQL.Open(). 
0

、主な問題は、正しくテーブルタイプを埋めるために、私はほとんどの種類で同じ順序で列を作成し、私はdtTableの作成方法を順でした、例として。

点心のDataTable = Exec_QueryとしてDtTable(クエリ:=は "Id_exm、Discounを選択します.."、LRWを:= false)を私は障害に入れてどこの理由で

、最初の割引とid第二に、私はしませんでしたそれに注意してください、

すべてうまく動作します。