ゼロまたは1のいずれかを返すデータベースに対してクエリを実行する必要があります(特定の基準の存在を確認します)。レビュー用に提供された技術仕様では、0または1のビット値を含む「result」と呼ばれる単一の列を持つ単一の行を返すストアドプロシージャを作成する必要があると述べています。 mストアドプロシージャが最善のアプローチであるかどうかはわかりませんが、少し確信が持てないので、意見を求めたいと思いました。私が考えることができる2つのオプションは次のとおりです。
1:クエリを実行してビットを返すSQLスカラー値関数を作成します。これは、「TEXT」SqlCommandオブジェクトを使用して.Netクライアントアプリケーション内から直接呼び出すことができ、「ExecuteScalar()」メソッドからブール値を返します。
2:技術仕様の説明に従ってストアドプロシージャを作成します。次に、これは通常の方法で.Netクライアントアプリから呼び出され、ビット値を含む単一の行と単一の列を持つDataTableを返します。
私には、オプション1が最適のようです。しかし、私の頭の後ろにある何かが、これはそれほど良い考えではないと言っています。
ご意見をお聞かせください。私の懸念を和らげていただけませんか。 :)
乾杯、イアン
スカラー値関数の呼び出しは絶対に正しい解決策です。
ExecuteScalar()メソッドを使用してストアドプロシージャを実行します。次に、この結果をブール値にキャストできます。
例えば
SqlConnection con = new SqlConnection(connectionString);
SqlCommand com = new SqlCommand("Execute dbo.usp_MyStoredProc", con);
return (Boolean)com.ExecuteScalar();
これは私にとってはうまくいき、この答えに基づいています 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;
対応するdb関数(sp/udf)が実行しなければならないロジックに依存すると思います。
たとえば特定のdb関数が実行された回数に関心があるので、さまざまなテーブルでデータ操作と更新を行う必要があります。したがって、ここでストアドプロシージャを探す必要があります。単純な検索であれば、udfで十分です。
ストアドプロシージャを使用して解決する方が、柔軟性と適応性が高いため、長期的には優れています。
私はこの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#コードは関数をスキップします