2012-08-03 22 views
7

मैंने SQL में एक फ़ंक्शन बनाया है, अब मुझे अपने सी # एप्लिकेशन में उस फ़ंक्शन का उपयोग करने की आवश्यकता है।मैं सी # में एसक्यूएल फ़ंक्शन कैसे कॉल कर सकता हूं?

मैं कुछ इस तरह उपयोग करने की कोशिश, लेकिन यह मैं गलत यह बाद से मैं हो रही है कर रहा हूँ लगता है:

Must declare the scalar value '@2064734117' 

... जब मैं पहले पैरामीटर और 1 दूसरा पैरामीटर के रूप में के रूप में 2064734117 देना । यहां कोड है जिसके बारे में मैं बात कर रहा हूं:

SqlConnection con = new SqlConnection(clsDb.connectionString); 
string query = string.Format("select Function1(@{0},@{1}) ", 
    int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1); 
con.Open(); 
SqlCommand cmd = new SqlCommand(query,con); 
SqlDataAdapter READER = new SqlDataAdapter(); 
READER.SelectCommand = cmd; 
DataTable table = new DataTable(); 
READER.Fill(table); 
radGridView1.DataSource = table; 
con.Close(); 

और मेरा फ़ंक्शन दो पूर्णांक पैरामीटर लेता है और एक तालिका देता है। मैंने इसे विजुअल स्टूडियो में चेक किया और यह काम किया, लेकिन मैं इसे अपने आवेदन में काम नहीं कर सका।

ALTER FUNCTION dbo.Function1 
(
/* 
@parameter1 int = 5, 
@parameter2 datatype 
*/ 
@ID int, 
@clsTypeID int 
) 
    RETURNS TABLE/* @table_variable TABLE (column1 datatype, column2 datatype) */ 
    AS 
     /*BEGIN */ 
    /* INSERT INTO @table_variable 
     SELECT ... FROM ... */ 
RETURN SELECT * FROM tblCLASS2 
     WHERE STNID = @ID AND CLASSTYPEID = @clsTypeID 
/*END */ 
/*GO*/ 
+1

क्या त्रुटियों मिल रहा है? इसके अलावा एक विकल्प एक संग्रहित प्रक्रिया लिखना है जो आपके फ़ंक्शन को कॉल करता है और केवल ado.net/c# – kd7

+0

के माध्यम से proc को कॉल करता है। यह कोड काम करना चाहिए, यह क्या त्रुटि दे रहा है? ध्यान दें कि यह फ़ंक्शन * एक फ़ंक्शन जैसा नहीं दिखता है, यह बेहतर रूप से 'संग्रहीत प्रक्रिया' में लागू किया जाएगा। हालांकि, यह किसी भी तरह से काम करना चाहिए। –

+0

मुझे "स्केलर मान घोषित करना होगा '@ 2064734117'"। जब मैं पहले पैरामीटर के रूप में 2064734117 और दूसरे पैरामीटर के रूप में 1 देता हूं। – Breeze

उत्तर

11

आपका एसक्यूएल थोड़ा बंद है, यह होना चाहिए:

string query = string.Format("select * from dbo.Function1({0},{1});", int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()),1); 

आप एसक्यूएल इंजेक्शन को रोकने के लिए SqlParameter-वस्तुओं का उपयोग करना चाहें:

string query = "select * from dbo.Function1(@pa1,@par2);"; 
    cmd.Parameters.Add("@par1", SqlDbType.Int).Value = int.Parse(e.CurrentRow.Cells["CodeMeli"].Value.ToString()); 
    cmd.Parameters.Add("@par2", SqlDbType.Int).Value = 1; 
1

आप कुछ इस तरह कर सकते हैं::

 myConn.Open(); 

     //generating the new command for our database 
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "SELECT OBJECTID_1, NDNT as theAddress, MIN(ABS(x - " + double.Parse(x.ToString()) + ") + ABS(y - " + double.Parse(y.ToString()) +")) from dbo.DWH_OUTPUT GROUP BY OBJECTID_1,NDNT HAVING (MIN(ABS(x - " + double.Parse(x.ToString()) + ") + ABS(y - " + double.Parse(y.ToString()) + ")) = (Select MIN(ABS(a.x - " + double.Parse(x.ToString()) + ") + ABS(a.y - " + double.Parse(y.ToString()) + ")) from dbo.DWH_OUTPUT a))"; 
     cmd.Connection = myConn; 

     //getting some more ado.net objects 
     SqlDataAdapter da = new SqlDataAdapter(); 
     DataSet ds = new DataSet(); 

     da.SelectCommand = cmd; 
     da.Fill(ds, @"Addresses"); 

     if (ds.Tables[0].Rows.Count > 0) 
     { 
      theAddress = ds.Tables[0].Rows[0][@"theAddress"] + @" (proximity address)"; 
     } 

     myConn.Close(); 

नोट कैसे इस उदाहरण में, आप CommandType.Text को SqlCommand के CommandType सेट

और ये मेरे समारोह घोषणा है। अपने कमांड पैरामीटर निर्दिष्ट करें (यानी अपने कोड स्निपेट में चयन फ़ंक्शन), और फिर Fill विधि के साथ डेटासेट को पॉप्युलेट करें। फिर आप पंक्तियों से मूल्यों को बाहर निकाल सकते हैं जैसा कि आप सामान्य रूप से मानक ado.net के साथ करेंगे।

आप एक संग्रहीत proc कॉल करने के लिए की जरूरत है, इस पर एक नजर है:

How do I call a TSQL function from ado.net

3

एक नज़र में, पहली बात मैं देख सकता हूँ कि आप वस्तु मालिक/स्कीमा निर्दिष्ट नहीं कर रहे है ; यह कार्यों के लिए आवश्यक है, इसलिए यह select dbo.Function1(...

दूसरा: string.Format उत्पन्न करने के लिए आपका कॉल देखें; और @nn के लिए एक और पूर्णांक उत्पन्न कर रहा है, लेकिन मान्य पैरामीटर नाम नहीं है। कौन सा, काम है, क्योंकि

तीसरा: एक मेज यूडीएफ (बल्कि एक अदिश यूडीएफ से) select * from dbo.Function1(..., तो आपको ही नहीं, select dbo.Function1(...

1

के लिए आप पूरी तरह से की जरूरत है: आप किसी भी पैरामीटर

चौथा नहीं जोड़ा था, साथ मालिक/स्कीमा नाम समारोह के योग्य नाम A working sample available at following link:

संबंधित मुद्दे

 संबंधित मुद्दे