为DataAdapter构建UpdateCommand,并对sourcecoluml进行一些解析
本文关键字:sourcecoluml 构建 DataAdapter UpdateCommand 并对 | 更新日期: 2023-09-27 18:14:38
首先,我将展示为DataAdapter
构建自定义UpdateCommand
的标准方法(通常在Select涉及许多表并且我们不能使用CommandBuilder
自动为DataAdapter
构建所有命令时使用)。
下面是我的DataAdapter的代码:
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT ID, Name FROM MyTable", myConnection);
下面是为myAdapter
构建标准UpdateCommand
的代码。上面的例子只涉及到一个表,然而,这只是为了简单和示范的目的。
myAdapter.UpdateCommand = new SqlCommand("UPDATE MyTable SET ID=@id,Name=@name WHERE ID=@id2", myConnection);
myAdapter.UpdateCommand.Parameters.Add("id", SqlDbType.VarChar).SourceColumn = "ID";
myAdapter.UpdateCommand.Parameters.Add("name", SqlDbType.VarChar).SourceColumn = "Name";
myAdapter.UpdateCommand.Parameters.Add("id2", SqlDbType.VarChar, 20, "ID").SourceVersion = DataRowVersion.Original;
问题是我不想将Parameter
绑定到SourceColumn
。我想在将值传递给相应的参数之前稍微改变SourceColumn
的值。例如,我的ID列包含所有的值,如1,2,3,4,…我想在它之前附加一些字符串(例如:000,001,A, B, C,…),并将此自定义SourceColumn
传递给我的参数。使用上面的代码,传递的值正是SourceColumn
ID的值:1,2,3,4…我想要的是例如:C1,C2,C3,C4,…
这是使用一些中间层的某种解析值,我想知道这是否可能。解析SourceColumn
外面的值是可以的,但是在某些情况下,我必须在为我的适配器构建UpdateCommand
时正确解析它。下面是一个例子:
我有一个DataGridView
,它有一个性别列,这个列是DataGridViewComboBoxColumn
类型,有2个项目:男性和女性。底层数据源应该有一个相应的Gender列,值应该是"Male"answers"Female",所有不匹配的值(不包含在ComboBoxColumn
的Items列表中)都不会使ComboBoxCell正确显示值。我试过CellFormating
和CellPainting
,但它不起作用。CellPainting
太复杂,CellFormating
根本不起作用。事实上,我没有使用标准的。net DataGridView
,我使用的是自定义的DataGridView
(也继承自标准的DataGridView
)。我对这个DataGridView
所做的一切都不起作用。唯一的解决方案是准备所有的基本值,只包括"男性"answers"女性"。然而,我将Gender
列设计为布尔/位列。下面是SELECT命令:
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT ID, Name, CASE WHEN Gender = 1 THEN 'Male' ELSE 'Female' END Gender FROM MyTable", myConnection);
Gender
列现在是varchar或文本类型,而不是像我以前那样是布尔/位。但是原始表中的Gender
列是位类型。如何为上面的SELECT命令构建UpdateCommand
?一种解决方案是包含一个隐藏的Gender
列,并将此列用于sourcecoluml来构建UpdateCommand,可见的Gender
仅用于显示。然而,这需要做更多的工作。如果我可以做一些自定义的SourceColumn
,最好使用。
非常感谢您的帮助!
我不知道这是否有帮助,但我认为你走错了方向。
让DataGridView显示您希望如何查看和编辑数据。关于您的"性别"栏,您应该能够按照以下方式设置您的组合框栏:
考虑以下场景:您的数据表有一个列'Gender',其中包含0(未知),1(男性),2(女性),3(其他)。
下面是一个示例代码,它将定义查找,创建示例数据并使用数据填充网格。性别将以英文显示,但存储为数字。
class Employee
{
public string Name { get; set; }
public int Gender { get; set; }
}
class GenderLookup
{
public string Display { get; set; }
public int Value { get; set; }
}
private void SetupGrid()
{
GenderLookup[] _lookups = new[]
{
new GenderLookup { Value = 0, Display = "unknown" },
new GenderLookup { Value = 1, Display = "Male" },
new GenderLookup { Value = 2, Display = "Female" },
new GenderLookup { Value = 3, Display = "Other" }
};
Employee[] _employees = new[]
{
new Employee() { Gender = 1, Name = "James T. Kirk" },
new Employee() { Gender = 2, Name = "Lt. Uhura" },
new Employee() { Gender = 3, Name = "Data" }
};
GridView.AutoGenerateColumns = false;
GridView.DataSource = _employees;
GridView.Columns.Add(
new DataGridViewTextBoxColumn()
{
DataPropertyName = "Name"
}
);
GridView.Columns.Add(
new DataGridViewComboBoxColumn()
{
DataSource = _lookups,
DisplayMember = "Display",
ValueMember = "Value",
DataPropertyName = "Gender"
}
);
}
因此不需要手动"解析"(或者更好:翻译)性别显示名称。DataGridView创建底层数据的"视图",这可能很难阅读(如在这种情况下的性别信息)。