সঞ্চিত পদ্ধতিতে কীভাবে DbContext.Database.SqlQuery <TEament> (স্কয়ার, প্যারাম) ব্যবহার করবেন? EF কোড প্রথম সিটিপি 5


250

আমার একটি সঞ্চিত পদ্ধতি রয়েছে যার তিনটি পরামিতি রয়েছে এবং ফলাফলগুলি ফেরত দেওয়ার জন্য আমি নিম্নলিখিতটি ব্যবহার করার চেষ্টা করছি:

context.Database.SqlQuery<myEntityType>("mySpName", param1, param2, param3);

প্রথমে আমি SqlParameterবস্তুগুলিকে প্যারাম হিসাবে ব্যবহার করার চেষ্টা করেছি কিন্তু এটি কার্যকর হয়নি এবং SqlExceptionনিম্নলিখিত বার্তাটি দিয়ে একটি ছুঁড়ে ফেলেছে :

পদ্ধতি বা ফাংশন 'মাইস্প্পনেম' প্যারামিটার '@ প্যারাম 1' আশা করে, যা সরবরাহ করা হয়নি।

সুতরাং আমার প্রশ্নটি কীভাবে আপনি প্যারামিটারগুলি প্রত্যাশিত একটি সঞ্চিত পদ্ধতিতে এই পদ্ধতিটি ব্যবহার করতে পারেন?

ধন্যবাদ।


আপনি এসকিউএল সার্ভারের কোন সংস্করণ ব্যবহার করছেন? ২০০২ এ কম্পাট (90) মোডে কাজ করে এমন কোডটি নিয়ে আমার সমস্যা হচ্ছে, তবে আমি 2005 এর বিপরীতে এটি চালালে এটি একটি সিনট্যাক্স ত্রুটিতে ব্যর্থ হয়।
17-18 এ গ্যাটস

4
@ গ্যাটস - আমার একই সমস্যা ছিল ডাব্লু / এসকিউএল ২০০. stored সঞ্চিত পদ্ধতির নামের আগে "এক্সইসিসি" যুক্ত করুন। ভবিষ্যতের রেফারেন্সের জন্য আমি এই তথ্য এখানে পোস্ট করেছি: স্ট্যাকওভারফ্লো
ড্যান মর্ক

উত্তর:


389

আপনার নিম্নলিখিত উপায়ে স্ক্লালপ্যারামিটার উদাহরণ সরবরাহ করা উচিত:

context.Database.SqlQuery<myEntityType>(
    "mySpName @param1, @param2, @param3",
    new SqlParameter("param1", param1),
    new SqlParameter("param2", param2),
    new SqlParameter("param3", param3)
);

3
আপনি কীভাবে এই পদ্ধতিটিকে নালার প্রকারের সাথে কাজ করবেন? আমি এটিকে নূন্যতম দশমিকের সাহায্যে চেষ্টা করেছিলাম, তবে দশমিকগুলি শূন্য হলে পরামিতি অনুপস্থিত বলে আমি ত্রুটি পাই। তবে, @ ড্যানমার্ক দ্বারা নীচে উল্লিখিত পদ্ধতিটি কাজগুলি সন্ধান করে।
পল জনসন

2
DbNull.Valueনালগুলির পরিবর্তে পাস করা কি সমস্যার সমাধান করে?
আলিরিজা

29
আপনি যেমন প্রসঙ্গে যেমন স্কেলপ্যারামিটার ব্যবহার এড়াতে \ @ পি # সিনট্যাক্সটিও ব্যবহার করতে পারেন abase সূত্র: এমএসডিএন.মাইক্রোসফটকম / en-US / data / jj592907 । (দ্রষ্টব্য: ব্যবহারকারীর বিজ্ঞপ্তিগুলি এড়াতে \ @ ব্যবহার করতে হয়েছে, ব্যাকস্ল্যাশ ছাড়াই পড়া উচিত))
মার্কো

3
আপনি যদি ডেটটাইম প্যারামিটারগুলি ব্যবহার করেন তবে আপনাকে কেবলমাত্র নাম এবং মানটিই নয়, পরামিতি প্রকারটিও নির্দিষ্ট করতে হবে। উদাহরণস্বরূপ: dbContext.Database.SqlQuery <Ivvoice> ("spGetInvoices @dateFrom, @dateTo", নতুন SQLlParameter {প্যারামিটারনাম = "ডেটফ্রোম", স্ক্যালডিবিটিটাইপ = স্কেলডিবিটাইপ.ডেটটাইম, মান = নতুন ডেটমেটাম, নিউমারেটাম স্ক্যালডিবিটাইপ = স্কেলডিবিটাইপ.ডেটটাইম, মান = শেষ তারিখ}); আর একটি গুরুত্বপূর্ণ বিষয় হল প্যারামিটারগুলির ক্রমকে সম্মান করা।
ফ্রান্সিসকো গোল্ডেনস্টাইন

আপনি কল্যাণকামী পরীক্ষা করতে পারবেন কি আমি আমি তোমাদের guidline অনুসরণ আছে ভুল কিন্তু সব সময়ে কোন প্রভাব করছি stackoverflow.com/questions/27926598/...
বিষাক্ত

129

এছাড়াও, আপনি "এসকিউএল" প্যারামিটারটি বিন্যাস নির্দিষ্টকরণকারক হিসাবে ব্যবহার করতে পারেন:

context.Database.SqlQuery<MyEntityType>("mySpName @param1 = {0}", param1)

এটি আপ-ভোট দিতে হবে। যদিও এটি উত্তর হিসাবে গ্রহণ করা হয়নি, উত্তর হিসাবে নির্বাচিতটির চেয়ে সমাধান লেখার পক্ষে এটি অনেক সহজ।
নিককোলি

10
এই সিনট্যাক্সটি আমাকে কিছুটা চিন্তিত করে। এটি কি এসকিউএল ইঞ্জেকশনটির পক্ষে সংবেদনশীল হতে পারে? আমি ধরে নেব যে EF "EXEC mySpName @ Param1 =" চলছে, এবং "x 'GO [দূষিত লিপি]" পাঠানো এবং কিছু সমস্যা দেখা দেওয়া সম্ভব হবে কি?
টম হাল্লাদে

10
@ টমহালাদে এসকিউএল ইঞ্জেকশনের ঝুঁকি নেই - পদ্ধতিটি এখনও তাদের স্টাইলের উপর ভিত্তি করে পরামিতিগুলিকে উদ্ধৃত করবে এবং এড়িয়ে যাবে, @ স্টাইলের প্যারামগুলির মতোই। সুতরাং স্ট্রিং প্যারামিটারের জন্য আপনি আপনার বিবৃতিতে উদ্ধৃতি ছাড়াই "নির্বাচন করুন ব্যবহারকারীদের কাছ থেকে ইমেইল = {0}" ব্যবহার করবেন।
রস ম্যাকনব

আমার ক্ষেত্রে এসপির জন্য প্রচুর alচ্ছিক প্যারামিটার রয়েছে এবং স্কেলপ্যারামিটারগুলির সাথে কলগুলি কাজ করে না তবে এই ফর্ম্যাটটি কৌশলটি করে, শুরুতে 'এক্সইসি' যুক্ত করতে হয়েছিল। ধন্যবাদ।
ওনুর টপাল

1
এই উত্তরটি কার্যকর যদি আপনার optionচ্ছিক পরামিতিগুলির সাথে কোনও প্রোকে প্যারামিটার নির্দিষ্ট করতে হয়। উদাহরণ যা কাজ করে না: ProcName @optionalParam1 = @opVal1, @optionalParam2 = @opVal2 উদাহরণ যা কাজ করে:ProcName @optionalParam1 = {0}, @optionalParam2 = {1}
গ্যারিসন নিলি

72

এই সমাধানটি এসকিউএল সার্ভার 2005 এর জন্য (কেবল)

আপনি ছেলেরা জীবনচর্চাকারী, তবে @ ড্যান মরক যেমন বলেছিলেন, আপনাকে এই মিশ্রণে এক্সইসিপি যুক্ত করতে হবে। যা আমাকে ট্রিপ করছিল তা হ'ল:

  • প্রোকের নামের আগে 'এক্সইসি'
  • পরমের মাঝে কমা mas
  • পরম সংজ্ঞাগুলিতে '@' কেটে ফেলা হচ্ছে (নিশ্চিত না যে বিটটি এখনও প্রয়োজন)।

:

context.Database.SqlQuery<EntityType>(
    "EXEC ProcName @param1, @param2", 
    new SqlParameter("param1", param1), 
    new SqlParameter("param2", param2)
);

21
+1 টি। উচ্চতর ভোটের উত্তরের কোনওটিরই অন্তর্ভুক্ত নয় exec, তবে আমি নিশ্চিত করতে পারি যে আমি এটি বাদ দিলে আমি একটি ব্যতিক্রম পেয়েছি।
জর্দান গ্রে

আপনাকে ধন্যবাদ, আমি একটি ত্রুটি পাচ্ছিলাম, এক্সইসিকে যুক্ত করেছি এবং ত্রুটিটি চলে গেছে। অদ্ভুত অংশটি ছিল যদি আমি প্রসঙ্গে থাকি D এটি কাজ করেছে, তবে আমি যদি প্যারামিটারগুলি যুক্ত করি তবে আমি এক্সইসি শব্দটি যুক্ত না করা পর্যন্ত এটি কাজ করে না।
সলমেড

2
এফওয়াইআই: আমার execকীওয়ার্ডের দরকার নেই। @ প্যারামগুলিতে অপসারণের জন্য +1, যা আমাকে সর্বদা গণ্ডগোল করে।
নাথান কোপ 30'14

+1, আমি EXEC অনুপস্থিত ছিল এবং বার্তাটির সাথে স্কেলএক্সেপশন পেতে থাকি: 'প্রোকনাম' এর কাছে ভুল সিনট্যাক্স।
এ। মারে

1
@ জিগলার আপনি 2005 বা আরও নতুন? এক্সইসি কীওয়ার্ডটি মূলত আমাদের 2005 সালের বিপরীতে যাচ্ছিল তাদের জন্য একটি সমস্যা হয়ে
টম হাল্লাডে

15
return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
new object[] { param1, param2, param3 });

// অথবা

using(var context = new MyDataContext())
{
return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
new object[] { param1, param2, param3 }).ToList();
}

// অথবা

using(var context = new MyDataContext())
{
object[] parameters =  { param1, param2, param3 };

return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
parameters).ToList();
}

// অথবা

using(var context = new MyDataContext())
{  
return context.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
param1, param2, param3).ToList();
}

এটা পরিষদের EntityFramework.dll, v4.4.0.0 আমার জন্য কাজ করছে
Thulasiram

2
আপনি যদি (var প্রসঙ্গ = নতুন MyDataContext ()) ব্যবহার করেন তবে .ToList () বাধ্যতামূলক।
থুলসিরাম

আমি এটি আবিষ্কার করতে কিছু ভাল সময় ব্যয় করেছি। সঠিক ফলাফল সেট পেতে টোলিস্ট () বাধ্যতামূলক।
হালিম

8

বেশিরভাগ উত্তর ভঙ্গুর কারণ তারা এসপির প্যারামিটারের ক্রমের উপর নির্ভর করে। স্টোরড প্রোকের প্যারামগুলির নাম দেওয়া এবং সেগুলিকে প্যারামিটারাইজড মান দেওয়া ভাল।

প্যারামিটারগুলির ক্রম সম্পর্কে চিন্তা না করে আপনার এসপিকে কল করার সময় নামযুক্ত প্যারামগুলি ব্যবহার করার জন্য

এক্সিকিউটিস্টোরকিউরি এবং এক্সিকিউটস্টোরকম্যান্ড সহ এসকিউএল সার্ভার নামের প্যারামিটার ব্যবহার করা হয়েছে

সেরা পদ্ধতির বর্ণনা দেয়। ড্যান মর্ক এর উত্তর এখানে ভাল।

  • কনটেনেটিং স্ট্রিংগুলির উপর নির্ভর করে না এবং এসপিতে সংজ্ঞায়িত পরামিতিগুলির ক্রমের উপর নির্ভর করে না।

উদাহরণ:

var cmdText = "[DoStuff] @Name = @name_param, @Age = @age_param";
var sqlParams = new[]{
   new SqlParameter("name_param", "Josh"),
   new SqlParameter("age_param", 45)
};

context.Database.SqlQuery<myEntityType>(cmdText, sqlParams)

দেখে মনে হচ্ছে "প্যারামগুলি" একটি সংরক্ষিত কীওয়ার্ড, সুতরাং আমি মনে করি না আপনি এটি ব্যবহার করতে পারেন। অন্যথায় এটি আমার জন্য সহায়ক উত্তর ছিল। ধন্যবাদ!
ooXei1sh

@ ooXei1sh - স্থির, sqlParamsচলক ব্যবহার করে
ডন

সংরক্ষিত শব্দটি ব্যবহার করতে আপনি @ এর সাথে উপসর্গ করতে পারেন , তবে আপনার সত্যিকারের উচিত হবে না
স্টিংজি জ্যাক

6
db.Database.SqlQuery<myEntityType>("exec GetNewSeqOfFoodServing @p0,@p1,@p2 ", foods_WEIGHT.NDB_No, HLP.CuntryID, HLP.ClientID).Single()

অথবা

db.Database.SqlQuery<myEntityType>(
    "exec GetNewSeqOfFoodServing @param1, @param2", 
    new SqlParameter("param1", param1), 
    new SqlParameter("param2", param2)
);

অথবা

var cmdText = "exec [DoStuff] @Name = @name_param, @Age = @age_param";
var @params = new[]{
   new SqlParameter("name_param", "Josh"),
   new SqlParameter("age_param", 45)
};

db.Database.SqlQuery<myEntityType>(cmdText, @params)

অথবা

db.Database.SqlQuery<myEntityType>("mySpName {0}, {1}, {2}",
new object[] { param1, param2, param3 }).ToList();

3

আমি এই পদ্ধতিটি ব্যবহার করি:

var results = this.Database.SqlQuery<yourEntity>("EXEC [ent].[GetNextExportJob] {0}", ProcessorID);

আমি এটি পছন্দ করি কারণ আমি কেবল গাইডস এবং ডেটটাইমগুলিতে ড্রপ করেছি এবং এসকিএলকিউয়ারি আমার জন্য সমস্ত ফর্ম্যাটিং সম্পাদন করে।


1

@ টম হাল্যাডের উত্তরটি এই উল্লেখের সাথে সঠিক যে আপনি শপুলকেও নাল মানগুলি পরীক্ষা করতে এবং DbNullable প্রেরণ করুন যদি প্যারামগুলি শূন্য থাকে তবে আপনি যেমন একটি ব্যতিক্রম পাবেন like

প্যারামিটারাইজড ক্যোয়ারী '...' প্যারামিটার '@parameterName' আশা করে, যা সরবরাহ করা হয়নি।

এরকম কিছু আমাকে সাহায্য করেছিল

public static object GetDBNullOrValue<T>(this T val)
{
    bool isDbNull = true;
    Type t = typeof(T);

    if (Nullable.GetUnderlyingType(t) != null)
        isDbNull = EqualityComparer<T>.Default.Equals(default(T), val);
    else if (t.IsValueType)
        isDbNull = false;
    else
        isDbNull = val == null;

    return isDbNull ? DBNull.Value : (object) val;
}

(পদ্ধতির ক্রেডিট https://stackoverflow.com/users/284240/tim-schmelter এ যায় )

তারপরে এটি ব্যবহার করুন:

new SqlParameter("@parameterName", parameter.GetValueOrDbNull())

বা অন্য সমাধান, আরও সহজ, তবে জেনেরিক নয়:

new SqlParameter("@parameterName", parameter??(object)DBNull.Value)

0

আমার কাছে একই ত্রুটি বার্তা ছিল যখন আমি একটি সঞ্চিত প্রক্রিয়া কল করার সাথে কাজ করছিলাম যা দুটি ইনপুট পরামিতি নেয় এবং এসইএলপি স্টেটমেন্ট ব্যবহার করে 3 টি মান ফেরত দেয় এবং আমি ইএফ কোডের প্রথম পদ্ধতির নীচে মত সমস্যাটি সমাধান করেছি

 SqlParameter @TableName = new SqlParameter()
        {
            ParameterName = "@TableName",
            DbType = DbType.String,
            Value = "Trans"
        };

SqlParameter @FieldName = new SqlParameter()
        {
            ParameterName = "@FieldName",
            DbType = DbType.String,
            Value = "HLTransNbr"
        };


object[] parameters = new object[] { @TableName, @FieldName };

List<Sample> x = this.Database.SqlQuery<Sample>("EXEC usp_NextNumberBOGetMulti @TableName, @FieldName", parameters).ToList();


public class Sample
{
    public string TableName { get; set; }
    public string FieldName { get; set; }
    public int NextNum { get; set; }
}

আপডেট : দেখে মনে হচ্ছে এসকিউএল সার্ভার 2005 এর সাথে নিখোঁজ রয়েছে এক্সইসি কীওয়ার্ডটি সমস্যা তৈরি করছে। সুতরাং এটি সমস্ত এসকিউএল সার্ভার সংস্করণগুলির সাথে কাজ করার অনুমতি দেওয়ার জন্য আমি আমার উত্তর আপডেট করেছি এবং নীচের লাইনে EXEC যুক্ত করেছি

 List<Sample> x = this.Database.SqlQuery<Sample>(" EXEC usp_NextNumberBOGetMulti @TableName, @FieldName", param).ToList();


0

আমি EF 6.x এর সাথে আমার মতো করেছিলাম:

using(var db = new ProFormDbContext())
            {
                var Action = 1; 
                var xNTID = "A239333";

                var userPlan = db.Database.SqlQuery<UserPlan>(
                "AD.usp_UserPlanInfo @Action, @NTID", //, @HPID",
                new SqlParameter("Action", Action),
                new SqlParameter("NTID", xNTID)).ToList();


            }

বর্গফেরমিটারে দ্বিগুণ হবেন না কিছু লোক তাদের ভেরিয়েবলের সাথে এটি করে পোড়া হয়

var Action = new SqlParameter("@Action", 1);  // Don't do this, as it is set below already.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.