एक पंक्ति सम्मिलित करने और C# में पहचान मान आउटपुट करने के लिए SQL कथन


नमस्ते,

मेरे पास कार्यक्षमता है जहां मुझे एसक्यूएल तालिका में एक छवि डालने और पंक्ति की पहचान कुंजी डालने की आवश्यकता है। यहां C# कोड ब्लॉक है जहां मैं अपना इंसर्ट करता हूं:

सी#
using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connstring"].ConnectionString))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("INSERT INTO ImageTable(photo,imagetype,imageName) OUTPUT inserted.photoid VALUES(@photo,@type,@Imgname)", conn))
    {
        cmd.Parameters.Add("@photo", System.Data.SqlDbType.Image).Value = myData;
        cmd.Parameters.Add("@type", System.Data.SqlDbType.VarChar, 20).Value = type;
        cmd.Parameters.Add("@Imgname", System.Data.SqlDbType.VarChar, 253).Value = imageName;
        imageId = (int)cmd.ExecuteScalar();
    }
    conn.Close();
}

जब मैं इस कथन को निष्पादित कर रहा हूं तो मुझे एक त्रुटि मिल रही है:
यदि स्टेटमेंट में INTO क्लॉज के बिना आउटपुट क्लॉज है तो डीएमएल स्टेटमेंट की लक्ष्य तालिका ‘इमेजटेबल’ में कोई भी सक्षम ट्रिगर नहीं हो सकता है।

मेरे पास डीबी में उस टेबल पर एक ट्रिगर है।
क्या कोई बता सकता है कि मैं इस समस्या का समाधान कैसे कर सकता हूँ?
अग्रिम में धन्यवाद।
बिच्छू

समाधान 2

मार्कस ने जो सुझाव दिया है, मैं उस पर भी गौर करूंगा @@IDENTITY कीवर्ड

अग्रिम पठन @@पहचान कीवर्ड[^]

दरअसल, SCOPE_IDENTITY() फ़ंक्शन अधिक उपयुक्त होगा। यदि ट्रिगर जो पहले दृष्टिकोण को अवरुद्ध करता है (हालाँकि मैंने उस दृष्टिकोण को पहले कभी नहीं देखा है!) पहचान कॉलम वाली तालिकाओं में कोई प्रविष्टि करता है, तो @@IDENTITY “वैश्विक रूप से अंतिम डाली गई” पंक्ति की पहचान को प्रतिबिंबित करेगा – उस पंक्ति को नहीं जिसकी आप परवाह करते हैं के बारे में।

SCOPE_IDENTITY() फ़ंक्शन अंतिम सम्मिलित पंक्ति की पहचान को फ़ंक्शन कॉल के समान दायरे में एक कथन द्वारा लौटाता है।

समाधान 1

यहां आपके पास कुछ विकल्प हैं.
1) आप एक संग्रहित प्रक्रिया लिख ​​सकते हैं जो आउटपुट पैरामीटर के साथ इंसर्ट करती है। जब आपने सफलतापूर्वक मान डाल दिया है तो आप आउटपुट पैरामीटर को SCOPE_IDENTITY() पर सेट कर सकते हैं।
2) आप क्वेरी के OUTPUT भाग को हटा सकते हैं और फिर आईडी को पुनः प्राप्त करने के लिए इन्सर्ट सफल होने के बाद दूसरी क्वेरी चला सकते हैं। SELECT Max(ID) FROM ImageTable WHERE imageType="your value" AND imageName="your value"

समाधान 3

यह संभव है, लेकिन अब आपको मूल्य प्राप्त करने के लिए ExecuteScalar का उपयोग करने की आवश्यकता है। यदि प्रदर्शन मायने रखता है, तो इसके बजाय आउटपुट पैरामीटर का उपयोग करें।

इन रेखाओं के साथ – साथ:

सी#
cmd.CommandText = "declare @id int OUTPUT; insert T vaules(1, 'abc', 0); set @id = SCOPE_IDENTITY()";

var idParam = cmd.Parameters.AddWithValue("@id", 0); 
idParam.Direction = ParameterDirection.Output;

संग्रहीत प्रोसेस का उपयोग करने पर भी विचार करें; यह कई मामलों में सलाह योग्य है।

コメント

タイトルとURLをコピーしました