使用应用于SourceColumn的一些解析构建DataAdapter的UpdateCommand?

时间:2013-05-21 04:11:21

标签: c# sql winforms dataadapter sqldataadapter

首先,我将展示为UpdateCommand构建自定义DataAdapter的标准方法(通常在Select包含多个表时使用,我们无法使用CommandBuilderDataAdapter)自动构建所有命令。

以下是我的DataAdapter的代码:

SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT ID, Name FROM MyTable", myConnection);

以下是为UpdateCommand构建标准myAdapter的代码。上面的例子只涉及1个单表,但这只是为了简单和说明的目的。

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,... < / p>

这是使用某个中间层的某种解析值,我想知道这是否可行。在外部解析SourceColumn的值是可以的,但是有些情况我必须在为我的适配器构建UpdateCommand时正确解析它。这是一个案例:

我有一个DataGridView,其中有一列性别,此列的类型为DataGridViewComboBoxColumn,包含两项:男性和女性。底层数据源应该有一个相应的Gender列,值应该是“Male”和“Female”,所有不匹配的值(不包含在ComboBoxColumn的Items列表中)都不会使ComboBoxCell显示值正确。我尝试了CellFormatingCellPainting,但它没有用。 CellPainting过于复杂,CellFormating根本无法运作。事实上,我没有使用标准.NET DataGridView,我使用的是自定义DataGridView(也继承自标准DataGridView)。我对DataGridView所做的一切都没有用。唯一的解决方案是准备所有基础值,仅包括“男性”和“女性”。但是我将Gender列设计为布尔/位列。这是SELECT命令:

SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT ID, Name, CASE WHEN Gender = 1 THEN 'Male' ELSE 'Female' END Gender FROM MyTable", myConnection);

Gender列现在是varchar或text的类型,而不是之前的boolean / bit。但原始表中的Gender列是位的类型。如何为上面的SELECT命令构建我的UpdateCommand?解决方案包括隐藏的Gender列,并使用此列为SourceColumn构建UpdateCommand,可见Gender仅用于显示。然而,这是一项更多的工作要做。如果我可以做某种自定义SourceColumn,最好使用。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

让DataGridView显示您希望如何查看和编辑数据。关于“性别”列,您应该能够按如下方式设置组合框列:

请考虑以下情形:您的数据表有一个“性别”列,其中包含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创建了您的基础数据的“视图”,这可能很难阅读(在这种情况下与性别信息一样)。