2016-11-12 8 views
0

誰かが私を助けてくれるのではないかと思いますが、C#とSQL Serverを使用してストアドプロシージャにデータテーブルを渡そうとしています。私は取得していますエラーメッセージがクラスからデータテーブルを作成してストアドプロシージャに渡すSQL ServerとC#

オペランドタイプ衝突である:nvarchar型はCustomerTermsTableTypeと互換性がありません以下

私はSQL Server内で作成されたタイプがある

データベースの種類

CREATE TYPE dbo.CustomerTermsTableType AS TABLE 
( 
      DueDays int, 
      DiscountPercent DECIMAL (5, 2), 
      DiscountDays int, 
      CreditLimit DECIMAL (19, 4), 
      ChargeInterest bit, 
      IsStandardTerms bit, 
      UseDiscounts bit, 
      CompanyID int, 
      PaymentTimeFrame varchar(50) , 
      TrackingState int 
); 
GO 

次に、ストアドプロシージャを作成しました。

CREATE PROCEDURE [dbo].[sp_InsertTerms] 
    @CustomerTermsTableType CustomerTermsTableType ReadONLY 
AS 
BEGIN 
    INSERT INTO dbo.Terms (ChargeInterest, CompanyID, DiscountDays, DueDays, DiscountPercent, IsStandardTerms, PaymentTimeFrame, TrackingState, UseDiscounts, CreditLimit) 
     SELECT 
      ChargeInterest, CompanyID, DiscountDays, DueDays, DiscountPercent, 
      IsStandardTerms, PaymentTimeFrame, TrackingState, UseDiscounts, CreditLimit 
     FROM 
      @CustomerTermsTableType; 
END 

作成し、C#を使用してストアドプロシージャを実行

public static DataTable CreateDataTable<T>(IEnumerable<T> list) 
{ 
    Type type = typeof(T); 
    var properties = type.GetProperties(); 

    DataTable dataTable = new DataTable(); 

    foreach (PropertyInfo info in properties) 
    { 
     dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType)); 
    } 

    foreach (T entity in list) 
    { 
     object[] values = new object[properties.Length]; 

     for (int i = 0; i < properties.Length; i++) 
     { 
      values[i] = properties[i].GetValue(entity); 
     } 

     dataTable.Rows.Add(values); 
    } 

    return dataTable; 
} 

データテーブルを埋めます。

List<SqlParameter> TermParms = new List<SqlParameter>(); 
SqlParameter parameter = new SqlParameter(); 
parameter.SqlDbType = SqlDbType.Structured; 
parameter.TypeName = "dbo.CustomerTermsTableType"; 
parameter.Value = CreateDataTable<termview>(newList); 
TermParms.Add(parameter); 

DbRawSqlQuery<dynamic> TermsID = _context.Database.SqlQuery<dynamic>("sp_InsertTerms CustomerTermsTableType ", TermParms.ToArray()); 

エラー

オペランドタイプ衝突:nvarchar型は、私が間違っていたものを考え出し最後にCustomerTermsTableType

答えて

0

と互換性がありません。 _context.Database.SqlQueryコマンドで問題が発生していたので、私はそれを以下に置き換えました。

using (SqlConnection con = new SqlConnection(_context.Database.Connection.ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand("sp_InsertTerms", con)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add("@CustomerTermsTableType", SqlDbType.Structured).Value = Terms; 

     con.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
} 
0

最初の問題は、あなたのパラメータ名、@CustomerTermsTableType、SqlParameterオブジェクトに設定されていないことのように見えます。 SQLQueryでも割り当てられていません。また、単一のパラメータがある場合にパラメータ配列が必要な理由も明確ではありません。

ここに、質問に示すようにdbcontextフレーバを使用するときに、格納可能なprocにデータテーブルを渡す簡単な例を示します。これは、より複雑なシナリオのために調整することができます。

パフォーマンス向上のため、クエリの前にストアドプロシージャに「SET NOCOUNT ON」を追加することをお勧めします。

関連する問題