2

レコードが存在する場合は更新ステートメントを作成しようとしています。それ以外の場合は、新しいレコードを挿入します。挿入を正常にするDALがありますが、既存のケースの更新を追加する必要があります。私は挿入のためにこの作業コードを持っています:

    public static void saveArticle(DateTime mtime, int mid, string mname, double homeodds, double awayodds, double drawodds)
    {
       var culture = CultureInfo.GetCultureInfo("sv-SE");
       var dateTimeInfo = DateTimeFormatInfo.GetInstance(culture);
       var dateTime = DateTime.Today;

       int weekNumber = culture.Calendar.GetWeekOfYear(dateTime, dateTimeInfo.CalendarWeekRule, dateTimeInfo.FirstDayOfWeek);
       string mroundY = dateTime.Year.ToString();
       string mroundW = weekNumber.ToString();
       string mround = mroundY + mroundW;

       //Console.WriteLine(mround);

       SqlCommand saveArticle = new SqlCommand("Insert Into gameTB(mround, mtime, mid, mname, homeodds, awayodds, drawodds) VALUES (@mround,@mtime,@mid,@mname,@homeodds,@awayodds,@drawodds)");
       saveArticle.Parameters.Add("@mround", SqlDbType.Int).Value = mround;
       saveArticle.Parameters.Add("@mtime", SqlDbType.DateTime).Value = mtime;
       saveArticle.Parameters.Add("@mid", SqlDbType.Int).Value = mid;
       saveArticle.Parameters.Add("@mname", SqlDbType.VarChar, 255).Value = mname;
       saveArticle.Parameters.Add("@homeodds", SqlDbType.Float).Value = homeodds;
       saveArticle.Parameters.Add("@awayodds", SqlDbType.Float).Value = awayodds;
       saveArticle.Parameters.Add("@drawodds", SqlDbType.Float).Value = drawodds;

       DAL.ExecuteNonQuery(saveArticle);
    }

このフォーラム投稿を読んだ後、IFステートメントを追加しようとしましたが、使用しているロジックでは機能しません。

すでに持っているelseinsertコマンドを使用して更新を実行するにはどうすればよいですか?

4

5 に答える 5

2

このINSERTとUPDATEに基づいて、私はそれを機能させることができました。私は、私には明らかではなかった基本的な考えを残す同様の記事に従いました。私は以前にこれを試しましたが、私はいくつかの大きな間違いを犯したので、私は道に迷っていると思いました。これが私の作業コードです。

    SqlCommand saveArticle = new SqlCommand("if Exists(Select 1 from gameTB where mround = @mround AND mid = @mid)\r\n" +
    "UPDATE gameTB SET homeodds = @homeodds, awayodds = @awayodds, drawodds = @drawodds Where mround = @mround AND mid=@mid\r\n" +
    "else\r\n" +
    "Insert Into gameTB(mround, mtime, mid, mname, homeodds, awayodds, drawodds) VALUES (@mround,@mtime,@mid,@mname,@homeodds,@awayodds,@drawodds)");

    saveArticle.Parameters.Add("@mround", SqlDbType.Int).Value = mround;
    saveArticle.Parameters.Add("@mtime", SqlDbType.DateTime).Value = mtime;
    saveArticle.Parameters.Add("@mid", SqlDbType.Int).Value = mid;
    saveArticle.Parameters.Add("@mname", SqlDbType.VarChar, 255).Value = mname;
    saveArticle.Parameters.Add("@homeodds", SqlDbType.Float).Value = homeodds;
    saveArticle.Parameters.Add("@awayodds", SqlDbType.Float).Value = awayodds;
    saveArticle.Parameters.Add("@drawodds", SqlDbType.Float).Value = drawodds;

    DAL.ExecuteNonQuery(saveArticle);
于 2013-03-05T23:13:04.533 に答える
0

コードにが含まmidれているようです。これがidデータベース内のレコードであり、他のレコードid(自動生成されたもの)を使用していない場合、同じIDのレコードが存在する場合は、selectクエリを実行するのが最も簡単です。selectクエリが何かを返す場合は更新する必要があり、そうでない場合は挿入を実行する必要があります。

于 2013-03-05T21:55:01.123 に答える
0

SQL Serverを使用していると仮定すると、コマンドを次のように書き直すことができます。

var saveArticle = new SqlCommand(@"UPDATE gameTB SET homeodds = @homeodds, awayodds = @awayodds, drawodds = @drawodds Where mround = @mround AND mid=@mid
if (@@rowcount = 0)
    Insert Into gameTB(mround, mtime, mid, mname, homeodds, awayodds, drawodds) VALUES (@mround,@mtime,@mid,@mname,@homeodds,@awayodds,@drawodds)");

@@rowcount最後のステートメントの影響を受けるレコードの数が含まれています。したがって、update成功した場合は、含まれ1insert実行されません。

于 2013-03-05T21:57:24.480 に答える
0

これはMSSQL2012です。MERGEコマンドを調べましたが、使用方法がわかりません。

私はこのようにしようとしましたが、ビルドしようとすると多くのエラーが発生し、軌道から外れていると思いますよね?

    SqlCommand updateArticle = new SqlCommand("UPDATE gameTB SET homeodds = @homeodds, awayodds = @awayodds, drawodds = @drawodds Where mround = @mround AND mid=@mid");
    DAL.ExecuteNonQuery(updateArticle);
    if (@@rowcount = 0) Then
    SqlCommand saveArticle = new SqlCommand("Insert Into gameTB(mround, mtime, mid, mname, homeodds, awayodds, drawodds) VALUES (@mround,@mtime,@mid,@mname,@homeodds,@awayodds,@drawodds)");
    saveArticle.Parameters.Add("@mround", SqlDbType.Int).Value = mround;
    saveArticle.Parameters.Add("@mtime", SqlDbType.DateTime).Value = mtime;
    saveArticle.Parameters.Add("@mid", SqlDbType.Int).Value = mid;
    saveArticle.Parameters.Add("@mname", SqlDbType.VarChar, 255).Value = mname;
    saveArticle.Parameters.Add("@homeodds", SqlDbType.Float).Value = homeodds;
    saveArticle.Parameters.Add("@awayodds", SqlDbType.Float).Value = awayodds;
    saveArticle.Parameters.Add("@drawodds", SqlDbType.Float).Value = drawodds;
    DAL.ExecuteNonQuery(saveArticle);
    EndIf;
于 2013-03-05T22:12:13.390 に答える
0

MERGEを使用する場合は、コマンドを次のように設定します。

SqlCommand saveArticle = new SqlCommand(@"
    MERGE INTO gametb AS target 
    using ( VALUES (@mround, 
          @mtime, 
          @mid, 
          @mname, 
          @homeodds, 
          @awayodds, 
          @drawodds ) ) AS source (mround, mtime, mid, mname, homeodds, awayodds, 
          drawodds) 
    ON ( source.mround = target.mround 
         AND source.mid = target.mid ) 
    WHEN matched THEN 
      UPDATE SET mtime = source.mtime, 
                 mname = source.mname, 
                 homeodds = source.homeodds, 
                 awayodds = source.awayodds, 
                 drawodds = source.drawodds 
    WHEN NOT matched THEN 
      INSERT (mround, 
              mtime, 
              mid, 
              mname, 
              homeodds, 
              awayodds, 
              drawodds ) 
      VALUES (source.mround, 
              source.mtime, 
              source.mid, 
              source.mname, 
              source.homeodds, 
              source.awayodds, 
              source.drawodds );"); 
于 2013-03-05T22:28:59.287 に答える