SMS テキストをデータベース テーブルに格納するアプリケーションを作成しました。SMS がいつ受信されるかは予測できません。データベース テーブルに新しい行が追加されたときに通知を受け取る方法を見つける必要があります。MSSQLServer 2005 と C# を使用した Windows フォーム アプリケーションを使用しています。誰かが私にこれを行う方法を提案できますか? ありがとうございました。
6 に答える
このような誤った方法を支持する圧倒的な声にもかかわらず、少なくともアプリケーションに直接通知しないように、トリガーを使用することはできません。トリガーからアプリケーションに接続して変更を通知する方法はまったくありません。「ソケットを使用する」や「メールを使用する」などのソリューションはせいぜい素朴であり、現実の条件下では失敗します。
基本的に 3 つの選択肢があります。
変更のためのプール。実装が最も簡単で、定期的にクエリを実行して、新しいレコードが表示されるかどうかを確認します。欠点は、1) データ モデル スキーマによっては変更を検出するのが難しい場合があること、および 2) レイテンシと負荷のバランスを取るのが難しいことです。どのくらいの頻度でポーリングする必要がありますか。
挿入アプリケーションから通知します。これらのレコードはアプリケーションによって挿入され、レコードを挿入するコードもアプリケーションに通知します。多くの場合、管理下にないコードの変更が必要です。
クエリ通知を使用します。
4 つ目の方法は、トリガーを使用してメッセージをローカル キューに送信し、アプリケーションをバックグラウンドで待機させることですWAITFOR(RECEIVE...)
(これはポーリングとは異なります) が、クエリ通知とSqlDependency
.
と組み合わせたトリガーを使用DatabaseMail
して、警告する電子メールを送信できます。
はい、INSERT トリガーを使用します。
Stackoverflow の記事は次のとおりです。SQL Server 2008 - シンプルな INSERT トリガーの記述を支援する
T-SQL リファレンスは次のとおりです: http://msdn.microsoft.com/en-us/library/ms189799.aspx
あなたの質問には十分な詳細がありませんが、行が(どういうわけか)データベースに挿入され、C#アプリケーションにそれを知らせたいと思っていると思いますか?(それ以外の場合は、他の多くの人が言っているようにトリガーを使用してください)
このような状況では、データベースに udp または tcp/ip を介してある種の「ping」を送信させ、対応するリスナー コンポーネントを C# アプリケーションに記述することを検討します。
これをグーグルで検索したところ、関連するリンクがhttp://www.codeproject.com/Articles/8973/SQL-Server-extended-stored-procedure-to-send-UDP-mおよびhttp://lamahashim.blogspotのように見えます.co.uk/2009/06/using-c-udpclient-send-and-receive.html
このアプローチを採用する場合、通信をブロックする可能性のあるファイアウォールの問題などに注意する必要があります。また、「c# アプリが実行されていないときに何が起こるか」なども考慮する必要があります。
これに最適なソリューションは、挿入後の TRIGGER です