2016-12-23 16 views
0

現在、私はWPFとWCFを使用しています。 WPFは私が使用しているクライアントですが、WCFはデータベースのほとんどの部分を処理し、サーバーです。 WCF側では私が持っている:私はWPFの終わりには検索機能を備えたデータグリッドビューからデータベースにデータを保存する

public DataSet getAllFixedCostsName(string name) 
    { 
     SqlCommand cmd; 

     if (name == null || name == string.Empty) 
     { 
      cmd = new SqlCommand("Select * From FixedCost", con); 
     } 
     else 
     { 
      cmd = new SqlCommand("Select * From FixedCost Where FixedCostName = " + name, con); 
     } 

     SqlDataAdapter sda = new SqlDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     sda.Fill(ds, "FixedCost"); 

     return ds; 
    } 

    public void UpdateFixedCosts(DataSet ds) 
    { 
     try 
     { 
      SqlCommand cmd = new SqlCommand("Select * From FixedCost", con); 
      SqlDataAdapter adap = new SqlDataAdapter(cmd); 
      SqlCommandBuilder cmdbl = new SqlCommandBuilder(adap); 

      adap.Update(ds); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("An error occurred: '{0}'", e); 
     } 
    } 

public void SearchFixedCost_OnClick(object sender, RoutedEventArgs e) 
    { 
     TextBox search = _contentGrid.Children.OfType<TextBox>().First(); 
     DataGrid dataGrid = _contentGrid.Children.OfType<DataGrid>().First(); 
     ds = new DataSet(); 

     if (_contentGrid.Children.OfType<RadioButton>().First().IsChecked == true) 
     { 
      ds = cln.getAllFixedCostsName(search.Text); 
     } 
     else if (search.Text.All(char.IsDigit)) 
     { 
      ds = cln.getAllFixedCostsExpenses(search.Text); 
     } 
     else 
     { 
      ds = null; 
     } 

     if (ds != null) 
     { 
      dataGrid.ItemsSource = ds.Tables["FixedCost"].DefaultView; 
      dataGrid.Columns[0].Visibility = Visibility.Hidden; 
     } 
    } 

    public void UpdateFixedCost_OnClick(object sender, RoutedEventArgs e) 
    { 
     cln.UpdateFixedCosts(ds); 
    } 

私は特定のものを検索していない場合、データが正常に更新されます。たとえば、プログラムをロードして検索をクリックすると、そのテーブルのすべての行が生成されます。行の1つを更新して保存した場合、クラッシュは発生せず、変更がデータベースにプッシュされます。

特定の行を検索する場合は、その行を変更して保存します。 "adap.Update(ds、" FixedCost ")"に達するとWCF側でクラッシュし、System.ServiceModel.FaultExceptionを取得します。クラッシュは、その行または特定のデータの行を変更する場合にのみ発生します。あなたは「固定費用」という名前のテーブルにデータを埋めるために、それを言っているあなたのgetAllFixedCostsName方法で

adap.TableMappings.Add("Table", "FixedCost"); 

:WCF側で、あなたの更新方法で

+0

wcf側の例外は何ですか? try catchの間に更新コードを置き、その時点で正確な例外が何であるかを確認してください。 – CodingYoshi

+0

変更元:sda.Fill(ds、 "FixedCost"); To:sda.Fill(ds);存在しないテーブルを更新できないように、テーブルを持たない新しいデータセットを作成しました。 – jdweng

+0

ストアドプロシージャを実行するクエリが提供されたときに 'SqlCommandBuilder'が何をするのか知りたいと思うでしょう。データセットに保留中の変更があると、おそらくエラーになります。そして、データベースを更新するための「取得」プロシージャーはどのように期待されますか? – Crowcoder

答えて

1

は、このコードを置きます。更新メソッドでは、新しいSqlDataAdapterを作成しますが、そのアダプターは「FixedCost」について何も知らないのです。したがって、データベースの "テーブル"という名前のテーブルを更新しようとしています。それを見つけることができないので、それは不平を言う。

+0

それはそれを修正しました。ありがとう:) –

関連する問題