web-dev-qa-db-ja.com

C#から直接SQL関数を呼び出す

ゼロまたは1のいずれかを返すデータベースに対してクエリを実行する必要があります(特定の基準の存在を確認します)。レビュー用に提供された技術仕様では、0または1のビット値を含む「result」と呼ばれる単一の列を持つ単一の行を返すストアドプロシージャを作成する必要があると述べています。 mストアドプロシージャが最善のアプローチであるかどうかはわかりませんが、少し確信が持てないので、意見を求めたいと思いました。私が考えることができる2つのオプションは次のとおりです。

1:クエリを実行してビットを返すSQLスカラー値関数を作成します。これは、「TEXT」SqlCommandオブジェクトを使用して.Netクライアントアプリケーション内から直接呼び出すことができ、「ExecuteScalar()」メソッドからブール値を返します。

2:技術仕様の説明に従ってストアドプロシージャを作成します。次に、これは通常の方法で.Netクライアントアプリから呼び出され、ビット値を含む単一の行と単一の列を持つDataTableを返します。

私には、オプション1が最適のようです。しかし、私の頭の後ろにある何かが、これはそれほど良い考えではないと言っています。

ご意見をお聞かせください。私の懸念を和らげていただけませんか。 :)

乾杯、イアン

10
Sk93

スカラー値関数の呼び出しは絶対に正しい解決策です。

7
TcKs

ExecuteScalar()メソッドを使用してストアドプロシージャを実行します。次に、この結果をブール値にキャストできます。

例えば

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

これは私にとってはうまくいき、この答えに基づいています https://stackoverflow.com/a/3232556/1591831 SqlDataAdapter(使用する必要はないことに注意してください)とExecuteScalar(ExecuteNonQueryを使用できます)を使用しますここに示すように):

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;
9
rasika

対応するdb関数(sp/udf)が実行しなければならないロジックに依存すると思います。

たとえば特定のdb関数が実行された回数に関心があるので、さまざまなテーブルでデータ操作と更新を行う必要があります。したがって、ここでストアドプロシージャを探す必要があります。単純な検索であれば、udfで十分です。

1
deostroll

ストアドプロシージャを使用して解決する方が、柔軟性と適応性が高いため、長期的には優れています。

0
kamahl

私はこの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

次に、これは私の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();

私のC#コードは関数をスキップします