好的,
经过多次阅读并找到解决方案后,我只需要问这个问题。 我已经搜索过了,但它并没有帮助我解决这个问题。 另外,请原谅我的语法错误,如果有的话......
有什么问题? 我加载了一个带有组合框的WPF表单。这个组合框从我的数据库中的所有表中获取所有名称。我选择一个表名,然后按一个按钮用所选表填充DataGrid(WPF)。一切都很完美。但是,当我更改单元格或添加/删除行或列时,我必须将其更新到数据库。 这就是我被困住的地方。我通过一种不那么优化的方式使它工作。这就是为什么我问是否有更好的解决方案。
//fill the datagrid with data from chosen table in combobox!
selectedTable = cboxTables.SelectedItem.ToString();
dataset = db.getDataFromTable(selectedTable);
datatable = dataset.Tables[selectedTable];
datagridAdmin.ItemsSource = datatable.DefaultView;
当DataGrid中的选择发生变化时,我将“提交”按钮设置为活动,并调用此代码:
db.updateTable(selectedTable, datatable);
请注意,'db'是我的数据库类的实例。方法如下:
public bool updateTable(String tableName, DataTable datatable)
{
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(thisConnection.ConnectionString, SqlBulkCopyOptions.CheckConstraints))
{
//Set destination table name
//to table previously created.
bulkcopy.DestinationTableName = tableName;
try
{
thisCommand = new SqlCommand("DELETE FROM " + tableName, thisConnection);
thisCommand.ExecuteNonQuery();
bulkcopy.WriteToServer(datatable);
}
catch (Exception ex)
{
logger.WriteLine(applicationName, ex.Message);
}
}
}
但问题是,第一列是一个自动增量ID,每次提交更改的DataGrid时都会不断提高。 有没有更好的方法来做到这一点?
谢谢!
PS:我在WPF中使用C#在Visual Studio 2010中进行编码。
答案 0 :(得分:1)
简而言之,您所提供的方法最好在调用批量复制之前使用Truncate表方法,这会将Identity列重置为0:
thisCommand = new SqlCommand("TRUNCATE TABLE " + tableName, thisConnection);
但是,任何一种方法都会导致数据库中的外键出现问题。我不确定您是如何在数据库类中检索数据的,但我会考虑使用SqlCommandBuilder来更新数据库,而不是删除并重新插入每次更新的所有数据。
修改
进一步解释我对SqlCommandBuilder的建议。
如下所示的ViewModel应该允许使用SqlCommandBuilder(注意:这大大减少了,实际上这需要更好的验证,异常和事件处理,但粗略的想法就在那里):
public class YourViewModel
{
private SqlDataAdapter adapter;
private DataTable table;
private SqlCommandBuilder commandBuilder;
public DataTable Table { get { return table; } set { table = value; } }
public void LoadTable(string connectionString, string tableName, int[] primaryKeyColumns)
{
adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", tableName), connectionString);
table = new DataTable();
adapter.Fill(table);
List<DataColumn> primaryKeys = new List<DataColumn>();
for (int i = 0; i < primaryKeyColumns.Length; i++)
{
primaryKeys.Add(table.Columns[primaryKeyColumns[i]]);
}
table.PrimaryKey = primaryKeys.ToArray();
commandBuilder = new SqlCommandBuilder(adapter);
commandBuilder.GetUpdateCommand();
}
public int Update()
{
if (table == null || table.Rows.Count == 0 || adapter == null)
{
return 0;
}
if (table.PrimaryKey.Length == 0)
{
throw new Exception("Primary Keys must be defined before an update of this nature can be performed");
}
else
{
return adapter.Update(table);
}
}
}
将Table属性绑定到网格视图,然后在需要时调用Update方法。您甚至可以将更新绑定到表的rowchanged事件等以自动更新db。 Code Project有一篇关于WPF,数据网格和数据库集成的相当好的文章。