2009-06-29 23 views
7

मैं डीबी.NET में SQL उपयोगकर्ता परिभाषित फ़ंक्शंस का उपयोग कैसे करें?

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[fn_GetUserId_Username] 
    (
    @Username varchar(32) 
    ) 
RETURNS int 
AS 
    BEGIN 
    DECLARE @UserId int 
    SELECT @UserId = UserId FROM [User] WHERE Username = @Username 
    RETURN @UserId 
    END 

अब मैं अंदर मेरी नेट C# या VB.NET कोड उसे चलाना चाहते हैं में एक अदिश समारोह बनाया।

मैं इकाई फ्रेमवर्क का उपयोग करता हूं, मैंने इसे फ़ंक्शन मैपिंग के साथ मैप करने की कोशिश की और मुझे सफलता नहीं मिली।

public int GetUserIdByUsername(string username) 
{ 
    EntityConnection connection = (EntityConnection)Connection;    
    DbCommand com = connection.StoreConnection.CreateCommand(); 
    com.CommandText = "fn_GetUserId_Username"; 
    com.CommandType = CommandType.StoredProcedure; 
    com.Parameters.Add(new SqlParameter("Username", username)); 
    if (com.Connection.State == ConnectionState.Closed) com.Connection.Open(); 
    try 
    { 
     var result = com.ExecuteScalar(); //always null 
    } 
    catch (Exception e) 
    { 
    } 
    return result; 
} 

कोई समाधान है: मैं सरल DbCommand साथ यह करने के लिए परवाह नहीं है, समस्या मैं यह है कि कोई परिणाम (समारोह संस्थाओं कक्षा में मौजूद है) है? सी # या वीबी.नेट में पोस्ट का स्वागत किया जाएगा।

उत्तर

15

यह दाएं जैसा लगता है कि इस मामले में एक .NET फ़ंक्शन को परिभाषित करने और आपके यूडीएफ को मैप करने के लिए इकाई ढांचे की कार्यक्षमता का उपयोग करना है, लेकिन मुझे लगता है कि मुझे लगता है कि आपको परिणाम क्यों नहीं मिलता है आप उम्मीद करते हैं कि जब आप इसे करने के लिए ADO.NET का उपयोग करते हैं - आप इसे बता रहे हैं कि आप संग्रहीत प्रक्रिया को कॉल कर रहे हैं, लेकिन आप वास्तव में एक फ़ंक्शन को कॉल कर रहे हैं।

इस प्रयास करें:

public int GetUserIdByUsername(string username) 
{ 
    EntityConnection connection = (EntityConnection)Connection;    
    DbCommand com = connection.StoreConnection.CreateCommand(); 
    com.CommandText = "select dbo.fn_GetUserId_Username(@Username)"; 
    com.CommandType = CommandType.Text; 
    com.Parameters.Add(new SqlParameter("@Username", username)); 
    if (com.Connection.State == ConnectionState.Closed) com.Connection.Open(); 
    try 
    { 
     var result = com.ExecuteScalar(); // should properly get your value 
     return (int)result; 
    } 
    catch (Exception e) 
    { 
     // either put some exception-handling code here or remove the catch 
     // block and let the exception bubble out 
    } 
} 
+0

परिणाम: SqlException: 'fn_GetUserId_Username' किसी मान्यता प्राप्त समारोह नाम नहीं है। – Shimmy

+3

@Shimmy: मालिक का नाम निर्दिष्ट करें, "dbo" -> "dbo.fn_GetUserId_Username (@Username) चुनें" – Sung

+0

यह काम करता है, धन्यवाद! – Shimmy

3

यह बहुत ऊपर जवाब देने के लिए समान है, लेकिन नीचे कोड आप मापदंडों के किसी भी संख्या और किसी भी वापसी प्रकार के साथ एक यूडीएफ कॉल करने के लिए अनुमति देता है। यह एक अधिक सामान्य समाधान के रूप में उपयोगी हो सकता है। यह भी पूरी तरह से परीक्षण नहीं किया गया है ... मुझे लगता है कि यह वर्चर्स के साथ कुछ समस्याएं होगी।

internal static T1 CallUDF<T1>(string strUDFName, params SqlParameter[] aspParameters) 
{ 
    using (SqlConnection scnConnection = GetConnection()) 
    using (SqlCommand scmdCommand = new SqlCommand(strUDFName, scnConnection)) 
    { 
     scmdCommand.CommandType = CommandType.StoredProcedure; 

     scmdCommand.Parameters.Add("@ReturnValue", TypeToSqlDbType<T1>()).Direction = ParameterDirection.ReturnValue; 
     scmdCommand.Parameters.AddRange(aspParameters); 

     scmdCommand.ExecuteScalar(); 

     return (T1) scmdCommand.Parameters["@ReturnValue"].Value; 
    } 
} 

private static SqlDbType TypeToSqlDbType<T1>() 
{ 
    if (typeof(T1) == typeof(bool)) 
    { 
     return SqlDbType.Bit; 
    } 
     . 
     . 
     . 
    else 
    { 
     throw new ArgumentException("No mapping from type T1 to a SQL data type defined."); 
    } 
} 
+0

उचित और शानदार! Thnx। –

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

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