2011-06-14 93 views
2

全部,使用实体框架传递存储过程的位字段参数4.1

我一直被困在以下问题上整天。我试图做一个包含三位字段参数的参数化存储过程调用。我一直遇到的异常是“将数据类型nvarchar转换为位时出错。”

这里是我的源代码:

存储过程

ALTER PROCEDURE usp_TestParamProc 
    @price_segment_set_id VARCHAR(8) = NULL, 
    @segment_group_id VARCHAR(8) = NULL, 
    @segment_price_band_id VARCHAR(8) = NULL, 
    @segment_id VARCHAR(8) = NULL, 
    @include_source_price_bands BIT = 0, 
    @apply_segmentation BIT = 0, 
    @print_sql BIT = 0 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT * 
    FROM MarketingSegmentDetails 
    WHERE SegmentID = @segment_id 

END 
GO 

C#代码:

 var segment_id = "1"; 
     string segment_group_id = "1"; 
     string segment_price_band_id = "1"; 
     string price_segment_set_id = "1"; 
     var include_source_price_bands = false; 
     var apply_segmentation = false; 
     var print_sql = false; 

     using (var context = new PricingContext()) 
     { 
      var list = new List<object>(); 
      list.Add(price_segment_set_id == null 
         ? new SqlParameter("price_segment_set_id", DBNull.Value) 
         : new SqlParameter("price_segment_set_id", price_segment_set_id)); 
      list.Add(segment_group_id == null 
         ? new SqlParameter("segment_group_id", DBNull.Value) 
         : new SqlParameter("segment_group_id", segment_group_id)); 
      list.Add(segment_price_band_id == null 
         ? new SqlParameter("segment_price_band_id", DBNull.Value) 
         : new SqlParameter("segment_price_band_id", segment_price_band_id)); 
      list.Add(segment_id == null 
         ? new SqlParameter("segment_id", DBNull.Value) 
         : new SqlParameter("segment_Id", segment_id)); 
      list.Add(include_source_price_bands == null 
         ? new SqlParameter("include_source_price_bands", DBNull.Value) 
         : new SqlParameter("include_source_price_bands", Convert.ToBoolean(include_source_price_bands))); 
      list.Add(apply_segmentation == null 
         ? new SqlParameter("apply_segmentation", DBNull.Value) 
         : new SqlParameter("apply_segmentation", Convert.ToBoolean(apply_segmentation))); 
      list.Add(print_sql == null 
         ? new SqlParameter("print_sql", DBNull.Value) 
         : new SqlParameter("print_sql", Convert.ToBoolean(print_sql))); 

      var segments = context.Database.SqlQuery<usp_SegmentProcessing>("usp_TestParamProc price_segment_set_id, segment_group_id, segment_price_band_id, segment_id, include_source_price_bands, apply_segmentation, print_sql", list.ToArray()).ToList(); 

任何帮助将是很大的欣赏编辑。我在项目工作中落后了。

感谢, 德里克

+0

你为什么要声明你的布尔参数瓦尔?尝试将它们声明为bool,然后删除convert.toboolean语句。 – therealmitchconnors 2011-06-14 20:32:25

+0

习惯声明隐式类型的力量。我会尝试你的建议。谢谢。 – 2011-06-14 21:23:31

回答

1

也许尝试做这样的事情

list.Add(
    new SqlParameter("print_sql", System.Data.SqlDbType.Bit) { Value = (print_sql != null ? print_sql : DBNull.Value) } 
); 

http://msdn.microsoft.com/en-us/library/h8f14f0z.aspx

+0

我想出了我的问题。这是两部分。一个是将SqlParameter声明为SqlDbType.Bit。第二部分是存储过程在其中声明了一个游标,这也导致了一个问题。谢谢您的帮助。 – 2011-06-14 21:21:11