2017-04-07 5 views
1

私はWindowsストアのアプリケーションでフライトデータアプリケーションを作成しています。アプリは、&から出発するフライトのみをパキスタンに到着したことを追跡します。このsqlite例外制約を解決する方法

私は

https://developer.flightstats.com/

とSQLiteデータベースに保存するからJSON経由で自分のデータを取得しています。

これは、データ

p.sを取得している私の関数である:接続文字列で使用されているすべての変数が宣言され、割り当てられたが、それらは無関係であるように私はそれらを示していないよされています。

public async void getdata() 
{ 
    var dbpath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "flight_record.sqlite"); 

    for (int hour = 0; hour < 24; hour++) 
    { 
     HttpClient web = new HttpClient(); 
     var response = await web.GetStringAsync("https://api.flightstats.com/flex/flightstatus/rest/v2/json/airport/status/KHI/arr/" + year + "/" + Month + "/" + today + "/" + hour + "?appId=" + appId + "&appKey=" + appKey + "&utc=false&numHours=1&maxFlights=10"); 

     jsondata1 data1 = JsonConvert.DeserializeObject<jsondata1>(response); 

     for (int i = 0; i < data1.flightStatuses.Length; i++) 
     { 
      int f_ID = Convert.ToInt32(data1.flightStatuses[i].flightId); 
      string l_time = data1.flightStatuses[i].arrivalDate.dateLocal.TimeOfDay.ToString(); 
      string year1 = data1.flightStatuses[i].arrivalDate.dateLocal.Year.ToString(); 
      string month1 = data1.flightStatuses[i].arrivalDate.dateLocal.Month.ToString(); 
      string day1 = data1.flightStatuses[i].arrivalDate.dateLocal.Day.ToString(); 
      string departureAirport1 = data1.flightStatuses[i].departureAirportFsCode.ToString(); 
      string arrivalAirport1 = data1.flightStatuses[i].arrivalAirportFsCode.ToString(); 
      string stats = data1.flightStatuses[i].status.ToString(); 
      string FsCode = data1.flightStatuses[i].carrierFsCode.ToString(); 
      string flightNumber1 = data1.flightStatuses[i].flightNumber.ToString(); 

      //here arival_data is my sqlite database table 

      using (var db = new SQLite.SQLiteConnection(dbpath)) 
      { 
       db.Execute("Insert into arrival_data (flightID, time, year, month, day, departureAirport, arrivalAirport, status, airline, carrierFsCode, flightNumber) values ('" + f_ID + "', '" + l_time + "', '" + year1 + "', '" + month1 + "', '" + day1 + 
        "', '" + departureAirport1 + "', '" + arrivalAirport1 + "', '" + stats + "', '" + airline1 + 
        "', '" + FsCode + "', '" + flightNumber1 + "')"); 
      } 
     } 
    } 
} 

マイリクエストクエリは時間あたり1つのクエリ、23回実行されます ので、私が作ったループをサポートしています。

フライト数が異なるので、私は2番目のループでdata1.flightStatuses.Lengthを使用しました。

その後、データをテーブルに挿入します。私は次の例外

enter image description here

を取得するアプリを実行すると

私はデバッグを行なったし、代わりに、DBへのデータの挿入、私はリストボックスでそれを表示することだし、これは結果であることがわかった

enter image description here

結果を見ると、時間は増分していません。したがって私は例外を得る!

どのようにデータを整理して、時間が順番に増えるか、別の方法がありますか?

+0

私は、あなたが行を挿入しようとしている順序が制約例外を引き起こしているのではないかと疑います。 arrival_dataテーブルスキーマのSQL定義を投稿できますか?また、データを直接SQL文字列に連結する代わりに、SqlParametersを使用することを強く強くお勧めします。これは、SQLインジェクション攻撃に対する巨大なセキュリティ上の脆弱性です。 –

答えて

0

いくつかの原因が考えられますが、データを挿入する順序は1つではありません。

サンプルデータ、特に第1の&第1行目を詳しく見てみましょう。それらは重複しています。これにより、固有の制約が違反されていると私は思います。

最初に調べるのは、テーブルの主キーです。それはflightIDですか?

同じフライトで複数の行を使って何をしたいか考えておく必要があります。既に存在するデータを効率的に更新する方法や、UPSERTとして知られている場合に挿入する方法を調べることができます(Q & A hereを参照)。

関連する問題