現在、私は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側で、あなたの更新方法で
wcf側の例外は何ですか? try catchの間に更新コードを置き、その時点で正確な例外が何であるかを確認してください。 – CodingYoshi
変更元:sda.Fill(ds、 "FixedCost"); To:sda.Fill(ds);存在しないテーブルを更新できないように、テーブルを持たない新しいデータセットを作成しました。 – jdweng
ストアドプロシージャを実行するクエリが提供されたときに 'SqlCommandBuilder'が何をするのか知りたいと思うでしょう。データセットに保留中の変更があると、おそらくエラーになります。そして、データベースを更新するための「取得」プロシージャーはどのように期待されますか? – Crowcoder