0

Visual Studio 2010でC#、. NET Framework 3.5を使用してWebサービスを作成しています。質問は基本的なものかもしれませんが、機能させることができませんでした。

Webサービスを介してSQLデータベースにデータを正常に送信できました。SQLデータベースの1つのテーブルにレコード/行を挿入しているときに、別のテーブル、たとえばテーブルBにデータを挿入できるようにしたいのです。テーブルBには5つの列があります。前のテーブル(Webサービスを介して挿入されるテーブルA)から2つの列値を取得します。表Bの1つの列は主キー値であり、残りの2つの列には静的テキスト値があります。

テーブルAの構造は次のとおりです

id int (primary key)
CustName varchar(45)
CustAddress varchar(45)
CustContacts varchar(45)
CustQuoteDate varchar(45)
CustLoginId varchar(45)

表Bの構造:

id int (primary key)
OrderId varchar(45) NOT NULL //This will get value from table A's Primary key
OrderReqDate [varchar](45) NOT NULL //This will get value from table A's  CustQuotDate 
OrderStatus [varchar](45) NOT NULL // This will be a static value "Requested"
OrderGroup [varchar](45) NOT NULL // This will be a static value "GGGG"

そこで、2番目の挿入についてクエリをテストしました。

INSERT INTO dbo.TableB(OrderId , currstatus, OrderReqDate, OrderGroup) 
SELECT ta.id, 'REQUESTED', ta.CustQuoteDate, 'GGGG' from dbo.TableA ta
where ta.CustLoginId = 'kenw1'

したがって、TableAに新しく追加されたCustLoginIdごとに、2番目のテーブル。TableBは、tableAからいくつかのフィールドを含む行挿入も取得します。

私の質問は、2番目の挿入を実行できるように以下のWebサービスコードを編集する方法/場所です。私を助けるためのあなたの時間と努力は大いに感謝されるでしょう。TIA。

これが私のWebサービスです。

[WebMethod(Description = "Adds a Customer Request Form data to the database [TableA].")]
public void AddCustRequestRecord(string CustName, string CustAddress, string custContacts, string custQuoteDate, string CustLoginId)
{
    //Static text values for columns in tableB
    string OrderStatus = "REQUESTED";
    string OrderGroup = "GGGG";

    string connectionString =
      ConfigurationManager.ConnectionStrings["myDatabase"].ConnectionString;

    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        DateTime now = DateTime.Now;
        string QuoteDt = now.ToString();

        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = System.Data.CommandType.Text;
        cmd.CommandText = "INSERT INTO TableA "
          + "(CustName, CustAddress, custContacts, CustLoginId, custQuoteDate) "
          + "VALUES (@CustName, @CustAddress, @custContacts, @CustLoginId,'" + Quotedt + "')";

        cmd.Parameters.AddWithValue("CustName", CustName);
        cmd.Parameters.AddWithValue("CustAddress", CustAddress);
        cmd.Parameters.AddWithValue("custContacts", custContacts);
        cmd.Parameters.AddWithValue("CustLoginId", CustLoginId);
        cmd.Parameters.AddWithValue("custQuoteDate", custQuoteDate);

        cmd.Connection = conn;

        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();                
        }
        catch
        {
            // Handle the error using your own preferred error-handling method
        }
        finally
        {
            conn.Close();
        }
    }
}
4

4 に答える 4

1

持っているものに基づいて、1つの接続と2番目のコマンドを使用する必要があります。両方のコマンドの接続を開いたままにしますが、エラーが発生した場合に両方のSQL挿入がロールバックされるように、必ずトランザクションを使用してください。

SqlConnection.BeginTransactionMSDNで見つかったものは、コーディング方法の良い例http://msdn.microsoft.com/en-us/library/86773566.aspxを示しています

于 2012-08-02T11:57:51.963 に答える
1

正直なところ、これを行う最も適切な方法は、ストアドプロシージャを使用することです。1つは、SQLインジェクションを回避するのに適しています。2つは、1つの接続と1つのデータベースへの呼び出しで必要な処理を実行し、より効率的です。SQLServerに任せてください。

于 2012-08-02T13:08:33.470 に答える
1

表AのOPCustLoginIDからのコメントごとに一意です。データ設計を第3正規形に変更することをお勧めします。自然キーを使用し、列を繰り返さないでください。

Table A
CustLoginId varchar(45) (primary key)
CustName varchar(45)
CustAddress varchar(45)
CustContacts varchar(45)
CustQuoteDate varchar(45)

Table B 
id int (primary key)
CustLoginId varchar(45) NOT NULL 
OrderReqDate varchar(45) NOT NULL 
OrderStatus varchar(45) NOT NULL 
OrderGroup varchar(45) NOT NULL

これで、AのIDは必要ないため、テーブルBに直接挿入できます。すでにCustLoginIdがあります。

しかし、LogonIDが一意であるというステートメントには疑問があります。これは、LogonIDごとにCustQuoteDateしかないことを意味します。顧客が複数の見積もりを持っている可能性があると思います。顧客が複数の見積もりを持つことができると仮定すると、これが設計になります。そして、なぜ日付はvarcharなのですか?データ時間はミリ秒まで下がっているので、TableBでPK違反が発生することはありません。LogonIDに対して同じ2つのquotedateを許可する場合は、表BからPKを削除するだけです。

Table A
CustLoginId varchar(45) (primary key)
CustName varchar(45)
CustAddress varchar(45)
CustContacts varchar(45)


Table B 
CustLoginId varchar(45) (primary key) foreign key relation to Table A
CustQuoteDate datetime (primary key)
OrderReqDate varchar(45)   
OrderStatus varchar(45)  
OrderGroup varchar(45) 
于 2012-08-02T14:32:45.723 に答える
0

あなたがそれを達成することができる複数の方法があります

1. 2番目のコマンドオブジェクト(このコマンドは同じ接続を使用します)を使用して、別の挿入を行うことができます。

2.複数の挿入を処理し、テーブルAに最近挿入されたデータにアクセスできるストアドプロシージャを呼び出すことができます。

3.LinqtoSQLやEFなどのORMをいつでも使用できます。

4.テーブルAの挿入でトリガーを使用します。

于 2012-08-02T11:37:43.053 に答える