C# 使用实体框架4.1将位字段参数传入存储过程

C# 使用实体框架4.1将位字段参数传入存储过程,c#,entity-framework,frameworks,parameterized-query,C#,Entity Framework,Frameworks,Parameterized Query,全部, 我一整天都在讨论以下问题。我正在尝试进行一个参数化的存储过程调用,其中包括三位字段参数。我经常遇到的异常是“将数据类型nvarchar转换为位时出错。” 以下是我的源代码: 存储过程 ALTER PROCEDURE usp_TestParamProc @price_segment_set_id VARCHAR(8) = NULL, @segment_group_id VARCHAR(8) = NULL, @segment_price_band_id VARCHAR

全部,

我一整天都在讨论以下问题。我正在尝试进行一个参数化的存储过程调用,其中包括三位字段参数。我经常遇到的异常是“将数据类型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();
var段_id=“1”;
字符串段\u组\u id=“1”;
字符串段\u价格\u波段\u id=“1”;
字符串价格\u段\u集\u id=“1”;
var include_source_price_bands=false;
var apply_segmentation=false;
var print_sql=false;
使用(var context=new PricingContext())
{
var list=新列表();
list.Add(price\u segment\u set\u id==null
?新的SqlParameter(“price\u segment\u set\u id”,DBNull.Value)
:新的SqlParameter(“price_segment_set_id”,price_segment_set_id));
添加(段\组\ id==null
?新的SqlParameter(“段\组\ id”,DBNull.Value)
:新的SqlParameter(“段组id”,段组id));
添加(段\价格\波段\ id==null
?新的SqlParameter(“段价格带id”,DBNull.Value)
:新的SqlParameter(“段价格带id”,段价格带id));
list.Add(segment_id==null
?新的SqlParameter(“段id”,DBNull.Value)
:新的SqlParameter(“segment_Id”,segment_Id));
添加(包括来源、价格、波段==null
?新的SqlParameter(“包括来源价格带”,DBNull.Value)
:新的SqlParameter(“包括来源价格带”,Convert.ToBoolean(包括来源价格带));
list.Add(apply_segmentation==null
?新的SqlParameter(“apply_segmentation”,DBNull.Value)
:新的SqlParameter(“apply_segmentation”,Convert.ToBoolean(apply_segmentation));
list.Add(print_sql==null
?新的SqlParameter(“print_sql”,DBNull.Value)
:新的SqlParameter(“print_sql”,Convert.ToBoolean(print_sql));
var segments=context.Database.SqlQuery(“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();
任何帮助都将不胜感激。我在项目工作上落后了

谢谢,
德里克

也许可以试着做类似的事情

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

为什么要将布尔参数声明为变量?尝试将它们声明为bool,然后删除convert.toboolean statements.force of habity声明隐式类型。我会尝试你的建议。谢谢。我解决了我的问题。它分为两部分。一部分是将SqlParameter声明为SqlDbType.Bit。第二部分是存储过程ha其中声明了一个游标,这也导致了一个问题。感谢您的帮助。