অ্যাডউইথওয়ালিউ প্যারামিটার নাল হলে ব্যতিক্রম


90

এসকিউএল কোয়েরির জন্য প্যারামিটার নির্দিষ্ট করার জন্য আমার কাছে নিম্নলিখিত কোড রয়েছে। আমি ব্যবহার করার পরে আমি নিম্নলিখিত ব্যতিক্রম পাচ্ছি Code 1; আমি যখন ব্যবহার করি তবে ঠিকঠাক কাজ করে Code 2। ইন Code 2আমরা নাল এবং অত: পর একটি জন্য একটি চেক আছে if..elseব্লক।

ব্যতিক্রম:

প্যারামিটারাইজড ক্যোয়ারী '(@ অ্যাপ্লিকেশন_এক্স_ইড এনভারচার (৪০০০)) নির্বাচন করুন Eapplication_ex_id এ' সরবরাহ করা হয়নি এমন প্যারামিটার '@ অ্যাপ্লিকেশন_েক্স_আইডি' আশা করে।

কোড 1 :

command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);

কোড 2 :

if (logSearch.LogID != null)
{
         command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
}
else
{
        command.Parameters.AddWithValue("@application_ex_id", DBNull.Value );
}

প্রশ্ন

  1. আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এটি লগ অনুসন্ধান থেকে NULL নিতে অক্ষম? কোড 1 এ লোগড মান (তবে ডিবিএনল গ্রহণ করতে সক্ষম)?

  2. এটি পরিচালনা করার জন্য আরও ভাল কোড আছে?

তথ্যসূত্র :

  1. একটি স্ক্যেলপ্যারামিটারে নাল বরাদ্দ করুন
  2. টেবিলের ডেটার উপর ভিত্তি করে ডেটাটাইপ ফেরত আসে
  3. ডাটাবেস স্মার্টিন্ট থেকে সি # নল ইন্টিতে রূপান্তর ত্রুটি
  4. ডিবিএনুলের কী কথা?

কোড

    public Collection<Log> GetLogs(LogSearch logSearch)
    {
        Collection<Log> logs = new Collection<Log>();

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            string commandText = @"SELECT  *
                FROM Application_Ex E 
                WHERE  (E.application_ex_id = @application_ex_id OR @application_ex_id IS NULL)";

            using (SqlCommand command = new SqlCommand(commandText, connection))
            {
                command.CommandType = System.Data.CommandType.Text;

                //Parameter value setting
                //command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
                if (logSearch.LogID != null)
                {
                    command.Parameters.AddWithValue("@application_ex_id", logSearch.LogID);
                }
                else
                {
                    command.Parameters.AddWithValue("@application_ex_id", DBNull.Value );
                }

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        Collection<Object> entityList = new Collection<Object>();
                        entityList.Add(new Log());

                        ArrayList records = EntityDataMappingHelper.SelectRecords(entityList, reader);

                        for (int i = 0; i < records.Count; i++)
                        {
                            Log log = new Log();
                            Dictionary<string, object> currentRecord = (Dictionary<string, object>)records[i];
                            EntityDataMappingHelper.FillEntityFromRecord(log, currentRecord);
                            logs.Add(log);
                        }
                    }

                    //reader.Close();
                }
            }
        }

        return logs;
    }

4
আপনি কি আরও ভাল বলতে চান? কোড 2 একটি ডাটাবেসে নাল মান প্রেরণের সঠিক উপায়।
— ফিল গান

উত্তর:


149

বিরক্তিকর, তাই না

তুমি ব্যবহার করতে পার:

command.Parameters.AddWithValue("@application_ex_id",
       ((object)logSearch.LogID) ?? DBNull.Value);

অথবা বিকল্পভাবে, "ড্যাপার" এর মতো একটি সরঞ্জাম ব্যবহার করুন, এটি আপনার জন্য সমস্ত গোলমাল করবে।

উদাহরণ স্বরূপ:

var data = conn.Query<SomeType>(commandText,
      new { application_ex_id = logSearch.LogID }).ToList();

আমি ... ড্যাপারে একটি পদ্ধতি যুক্ত করার জন্য প্রলুব্ধ হয়েছি IDataReader... এটি সত্যিই নিশ্চিত নয় যে এটি কোনও ভাল ধারণা কিনা।


4
আমি Parametersসম্পত্তি সম্পর্কে একটি এক্সটেনশন ভাবছিলাম - এটি একটি Object?
— ফিল গান

6
@ ফিল হুম, হ্যাঁ এটিই, এবং আপনি কী বলতে চাইছেন তা আমি দেখতে পেয়েছি ... সম্ভবতAddWithValueAndTreatNullTheRightDamnedWay(...)
— মার্ক গ্র্যাভেল

4
@ মার্কগ্রাভেল আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে এটি লগ অনুসন্ধান থেকে NULL নিতে কেন অক্ষম? কোড কোড 1-এ লোগড মান (তবে ডিবিএনল গ্রহণ করতে সক্ষম)?
— LCJ

18
@ লিজো কারণ nullএকটি প্যারামিটার মান মানে "এই পরামিতিটি প্রেরণ করবেন না"। আমি সন্দেহ এটি একটি খারাপ সিদ্ধান্ত যে কেবলমাত্র বেকড পেয়েছিলাম আসলে, আমি মনে করি। সবচেয়ে এর DBNullএকটি মৌলিকভাবে খারাপ সিদ্ধান্ত যে বেকড পেয়েছিলাম ছিল: stackoverflow.com/a/9632050/23354
— মার্ক Gravell

4
@tylerH নাল কোয়েলে rulesালার নিয়মের কারণে - যা সি # 9
— মার্ক গ্র্যাভেল

52

আমি SqlParameterCollectionনাল মানগুলি পরিচালনা করে কেবল তার জন্য কেবল একটি এক্সটেনশন পদ্ধতি লিখতে আরও সহজ বলে মনে করি :

public static SqlParameter AddWithNullableValue(
    this SqlParameterCollection collection,
    string parameterName,
    object value)
{
    if(value == null)
        return collection.AddWithValue(parameterName, DBNull.Value);
    else
        return collection.AddWithValue(parameterName, value);
}

তারপরে আপনি কেবল এটিকে কল করুন:

sqlCommand.Parameters.AddWithNullableValue(key, value);

মান হতে পারে int- এ বা int- এ ?, স্ট্রিং, bool, বা bool, ?, তারিখসময় বা DATETIME? ইত্যাদি?
— কিকিনেট

4
আমি মার্কের উত্তরটি পড়েছি এবং ভেবেছিলাম "আমি কেবল পরামিতি সংগ্রহের জন্য কেবল একটি এক্সটেনশন পদ্ধতি লিখব", তারপরে আমি একটি চুল স্ক্রোল করে রেখেছিলাম ... (একটি এক্সটেনশন পদ্ধতির সুন্দর জিনিসটি হ'ল আমি একটি একক সন্ধান / প্রতিস্থাপন করতে পারি) পরে ও আমার সমস্ত কোড আপডেট করা হয়)
— jleach

4
দুর্দান্ত সমাধান ... এক্সটেনশন পদ্ধতিগুলি অবশ্যই একটি স্ট্যাটিক শ্রেণিতে সংজ্ঞায়িত করা উচিত। কীভাবে: কাস্টম এক্সটেনশন পদ্ধতিটি প্রয়োগ করুন এবং কল করুন
— ক্রিস ক্যাটিগনি

4
হতে পারে আমি ভুল হয়ে গেছি (একটি সি # নবাগত ধরণের) তবে আপনি আরও ভাল করে এটি করতে পারবেন না:return collection.AddWithValue(parameterName, value ?? DBNull.Value);
— টোবিয়াস ফিল

4
@ তোবিয়াসফিল হ্যাঁ, আপনি এটিও করতে পারেন। এটি কেবল স্বাদের বিষয়।
— এক্সিওমেটিকনেক্সাস

4

কোনও সঞ্চিত প্রক্রিয়া কল করার সময় আপনি যদি এটি করছেন ঠিক তেমন ক্ষেত্রে: আমি মনে করি আপনি যদি প্যারামিটারে একটি ডিফল্ট মান ঘোষণা করেন এবং কেবল প্রয়োজনে যুক্ত করেন তবে এটি পড়া সহজ।

এসকিউএল:

DECLARE PROCEDURE myprocedure
    @myparameter [int] = NULL
AS BEGIN

সি #:

int? myvalue = initMyValue();
if (myvalue.hasValue) cmd.Parameters.AddWithValue("myparamater", myvalue);

0

অগত্যা এসকিউএলডিবিটাইপ সেট করে কিছু সমস্যা

command.Parameters.Add("@Name", SqlDbType.NVarChar);
command.Parameters.Value=DBNull.Value

যেখানে আপনি টাইপ করেন SQLDbType.NVarChar। অগত্যা এসকিউএল টাইপ সেট করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.