web-dev-qa-db-fra.com

Appel de fonctions SQL directement à partir de C #

J'ai l'obligation d'exécuter une requête sur une base de données qui renvoie un zéro ou un (Vérification de l'existence de critères spécifiques). Les spécifications techniques que j'ai reçues pour examen indiquent que Je devrais créer une procédure stockée, qui renverra une seule ligne, avec une seule colonne appelée "résultat", qui contiendra une valeur de bit de 0 ou 1. Cependant, je ne suis pas sûr qu'une procédure stockée serait la meilleure approche, mais je suis un peu incertain, alors j’ai pensé vous demander votre avis. Les deux options auxquelles je peux penser sont:

1: Créez une fonction scalaire SQL qui effectue la requête et renvoie un bit. Celle-ci peut ensuite être appelée directement à partir de l'application client .Net à l'aide d'un objet "TEXT" SqlCommand, qui renvoie alors un bool. de la méthode "ExecuteScalar ()".

2: Créez une procédure stockée comme décrit dans les spécifications techniques. Celle-ci serait alors appelée à partir de l’application .Net Client de la manière habituelle et renverrait un DataTable avec une seule ligne et une seule colonne, contenant le valeur de bit.

Pour moi, la première option semble la meilleure. Cependant, quelque chose dans ma tête me dit que ce n'est pas une si bonne idée.

S'il vous plaît, pourriez-vous donner votre avis et aider à soulager mes préoccupations? :)

Cordialement, Ian

9
Sk93

La fonction scalaire appelante est une solution absolument correcte.

7
TcKs

Exécutez la procédure stockée en utilisant la méthode ExecuteScalar () . Vous pouvez ensuite en convertir le résultat en booléen.

par exemple

   SqlConnection con = new SqlConnection(connectionString);
    SqlCommand com = new SqlCommand("Execute dbo.usp_MyStoredProc", con);
    return (Boolean)com.ExecuteScalar();
14
codingbadger

Cela fonctionne pour moi et est basé sur cette réponse https://stackoverflow.com/a/3232556/1591831 en utilisant un SqlDataAdapter (notez que vous n'avez pas besoin d'en utiliser un) et ExecuteScalar (peut utiliser ExecuteNonQuery comme indiqué ici. ):

bool res = false;
using (SqlConnection conn = new SqlConnection(GetConnectionString()))
{
    using (SqlCommand comm = new SqlCommand("dbo.MyFunction", conn))
    {
        comm.CommandType = CommandType.StoredProcedure;

        SqlParameter p1 = new SqlParameter("@MyParam", SqlDbType.Int);
        // You can call the return value parameter anything, .e.g. "@Result".
        SqlParameter p2 = new SqlParameter("@Result", SqlDbType.Bit);

        p1.Direction = ParameterDirection.Input;
        p2.Direction = ParameterDirection.ReturnValue;

        p1.Value = myParamVal;

        comm.Parameters.Add(p1);
        comm.Parameters.Add(p2);

        conn.Open();
        comm.ExecuteNonQuery();

        if (p2.Value != DBNull.Value)
            res = (bool)p2.Value;
    }
}
return res;
8
rasika

Je suppose que cela dépend de la logique que la fonction de base de données correspondante (sp/udf) doit exécuter. 

Si par exemple nous sommes intéressés par le nombre de fois que la fonction db a été exécutée, nous aurions certainement besoin de manipuler des données et de les mettre à jour sur différentes tables. Par conséquent, nous devrions aller pour les procs stockés ici. Si sa récupération est simple, un fichier UDF fera l'affaire.

1
deostroll

le résoudre avec une procédure stockée est préférable à long terme car il est plus flexible et adaptable

0
kamahl

j'utilise cette fonction scalaire SQL

CREATE FUNCTION DAYSADDNOWK(@addDate AS DATE, @numDays AS INT)
RETURNS DATETIME
AS
BEGIN
    SET @addDate = DATEADD(d, @numDays, @addDate)
    IF DATENAME(DW, @addDate) = 'sunday'   SET @addDate = DATEADD(d, 1, @addDate)
    IF DATENAME(DW, @addDate) = 'saturday' SET @addDate = DATEADD(d, 2, @addDate)

    RETURN CAST(@addDate AS DATETIME)
END
GO

alors c'est mon code c #

using (SqlCommand cmd3 = new SqlCommand("SELECT dbo.DAYSADDNOWK", ClassV.con))
                    ClassV.con.Open();
                    SqlCommand brecord = ClassV.con.CreateCommand();
                    brecord.CommandText = "INSERT INTO TblBorrowRecords VALUES ('" + DGStudents.CurrentRow.Cells[1].Value.ToString() + "','" + DGStudents.CurrentRow.Cells[2].Value.ToString() + "','" + DGStudents.CurrentRow.Cells[4].Value.ToString() + "','" + DGStudents.CurrentRow.Cells[3].Value.ToString() + "','" + DG.CurrentRow.Cells[4].Value.ToString() + "','" + DG.CurrentRow.Cells[5].Value.ToString() + "','" + DG.CurrentRow.Cells[6].Value.ToString() + "','" +System.DateTime.Now.Date.ToShortDateString() + "' , dbo.DAYSADDNOWK(GETDATE(),5) ,null , '" + ClassV.lname.ToString() + ", " + ClassV.fname.ToString() + " " + ClassV.mname.ToString() + "', null, 'Good',null)";
                    var DAYSADDNOWK = brecord.ExecuteScalar();

mon code C # ignore la fonction

0