为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正确显示值。我试过CellFormatingCellPainting,但它不起作用。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,最好使用。

非常感谢您的帮助!

为DataAdapter构建UpdateCommand,并对sourcecoluml进行一些解析

我不知道这是否有帮助,但我认为你走错了方向。

让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创建底层数据的"视图",这可能很难阅读(如在这种情况下的性别信息)。