J'ai créé une fonction définie par l'utilisateur dans un projet SQL. Cette méthode C# doit être capable d'appeler une procédure stockée dans la même base de données. Comment dois-je m'y prendre ?
Réponses
Trop de publicités?OK, j'ai compris. Ce que j'avais besoin de faire, c'était d'accéder à une procédure stockée SQL dans une fonction définie par l'utilisateur Managed CLR. Et oui, cela peut sembler être une question de mauvaise conception, mais dans mon application, j'ai besoin de faire une recherche rapide dans mon UDF, après quelques jours de réflexion pour trouver un moyen de contourner cela (conception), il n'y a tout simplement pas d'autre moyen. Voici donc le code de la façon dont je l'ai fait, l'UDF qui est appelé à partir de SQL doit avoir les attributs suivants au-dessus de la signature de la méthode : [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)].
Dans cet UDF, je fais ensuite un autre appel à une méthode interne appelée "GetLookup". Mais comme GetLookup nécessite un accès à la base de données, la méthode d'appel, l'UDF dans ce cas, a besoin de ces attributs pour résoudre les problèmes d'accès.
(Les noms des variables etc. ne sont pas ceux que j'ai utilisés)
private static int GetLookup(int id_Lookup)
{
try
{
using (SqlConnection sqlConn = new SqlConnection("Context Connection=true"))
{
sqlConn.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = "uspApp_GetLookup";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConn;
cmd.Parameters.AddWithValue("ID_Lookup", ID_Lookup);
SqlParameter parameter = new SqlParameter("OutputValue", null);
parameter.DbType = DbType.Int32;
parameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();
if (cmd.Parameters != null && cmd.Parameters["ID_OutputValue_Account"] != null)
{
return int.Parse(cmd.Parameters["OutputValue"].Value.ToString());
}
return -1;
}
}
}
catch
{
throw;
}
}
Votre fonction définie par l'utilisateur dans votre projet SQL n'est pas en c# mais en SQL. Si vous l'avez écrite en C#, votre question n'a pas de sens.
Si toutefois vous voulez appeler une procédure stockée à partir de C#, vous devez vous tourner vers ado.net. l'espace de nom est System.Data.SQLClient
En supposant que vous parlez d'un Fonction gérée / CLR définie par l'utilisateur je ne pense pas que tu puisses.
Le seul moyen auquel je pense est de créer une nouvelle connexion au serveur SQL à partir de votre UDF. Je ne suis pas sûr que cela fonctionne, mais je suis certain que ce serait une mauvaise idée. ne le faites pas !
Je dois demander - pourquoi voulez-vous faire ça de toute façon ? Les UDF du CLR existent dans le but d'utiliser de petits bouts de code géré (par exemple des expressions régulières) dans vos procédures stockées, et non pour traiter de grands ensembles de résultats (c'est une chose pour laquelle SQL est généralement très bon).
Si vous devez appeler un SP dans une méthode C# compilée à l'intérieur de la base de données, vous devez vous demander si quelque chose ne va pas dans votre conception. Le code managé n'est pas là pour remplacer Transact-SQL mais pour compléter les quelques réflexions qu'il ne peut pas faire par lui-même.
Si vous devez appeler une SP, alors votre code doit être dans une autre SP. Bien qu'il soit difficile de décider si vous ne donnez pas plus de détails.