wake-up-neo.com

SQL-Funktionen direkt aus C # aufrufen

Ich habe eine Anforderung, eine Abfrage gegen eine Datenbank auszuführen, die entweder eine Null oder eine Eins zurückgibt (Überprüfung auf Vorhandensein bestimmter Kriterien). Die technischen Spezifikationen, die mir zur Überprüfung gegeben wurden, besagen, dass ich eine gespeicherte Prozedur erstellen sollte, die eine einzelne Zeile mit einer einzelnen Spalte namens "result" zurückgibt, die einen Bitwert von 0 oder 1 enthält. Ich bin mir nicht sicher, ob eine gespeicherte Prozedur der beste Ansatz wäre, aber ich bin ein bisschen unsicher, also dachte ich, ich würde Sie um Meinungen bitten. Die zwei Optionen, die mir einfallen, sind:

1: Erstellen Sie eine SQL-Funktion mit Skalarwert, die die Abfrage ausführt und ein Bit zurückgibt. Dies könnte dann direkt aus der .NET-Clientanwendung heraus mit einem "TEXT" SqlCommand-Objekt aufgerufen werden, und es würde ein Bool aus der "ExecuteScalar ()" - Methode zurückgegeben.

2: Erstellen Sie eine gespeicherte Prozedur wie in den technischen Daten beschrieben. Dies würde dann von der .NET-Client-App auf normale Weise aufgerufen werden und würde eine DataTable mit einer einzelnen Zeile und einer einzelnen Spalte zurückgeben, die den Bitwert enthält.

Option eins erscheint mir am besten. Allerdings sagt etwas in meinem Hinterkopf, dass dies keine so gute Idee ist.

Könnten Sie bitte Ihre Meinung äußern und helfen, meine Bedenken auszuräumen? :)

Prost, Ian

9
Sk93

Die aufrufende skalare Funktion ist die absolut richtige Lösung.

7
TcKs

Führen Sie die gespeicherte Prozedur mit der ExecuteScalar () - Methode aus. Das Ergebnis kann dann in einen Boolean umgewandelt werden.

z.B

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

Dies funktioniert für mich und basiert auf dieser Antwort https://stackoverflow.com/a/3232556/1591831 mit einem SqlDataAdapter (beachten Sie, dass Sie keinen benötigen) und ExecuteScalar (kann ExecuteNonQuery wie hier gezeigt verwenden ):

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

Ich denke, es hängt von der Logik ab, die die entsprechende db-Funktion (sp/udf) ausführen muss.

Wenn für z. Wir sind daran interessiert, wie oft die jeweilige db-Funktion ausgeführt wurde. Wir müssen auf jeden Fall einige Datenmanipulationen und Aktualisierungen an verschiedenen Tabellen vornehmen. Daher müssten wir hier für gespeicherte Procs gehen. Wenn es ein einfacher Abruf ist, reicht ein udf.

1
deostroll

die Lösung mit einer gespeicherten Prozedur ist auf lange Sicht besser, weil sie flexibler und anpassbarer ist

0
kamahl

ich benutze diese SQL-Skalarfunktion

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

dann ist dies mein c # code

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();

mein C # -Code überspringt die Funktion