【问题标题】:Determine whether or not data from SQL data-source has the same value确定来自 SQL 数据源的数据是否具有相同的值
【发布时间】:2016-05-24 02:10:54
【问题描述】:

我目前正在构建一个从 SQL 服务器导入数据的 GUI。

我目前正在使用组合框来允许用户选择他想访问的类别/子类别。 > Image

我不知道如何确定位于 Category 列的行中的数据是否具有相同的值,如果有,是否列出了 Sub_Category。

DataRow Example

Sub_Categories 应该只与它们对应的类别同步,而不是所有的类别,所以我需要想出一种方法将 sub_categories 和类别配对在一起。

如果整个类别不存在 Sub_Category,则应将 Sub_Category_ComboBox 设置为不可编辑 (IsEditable = false),因为它们没有任何价值。

如果类别确实包含 Sub_Category,则 SubCategory_ComboBox 应仅显示与特定类别同步的 Sub_Categories。 (也不知道如何同步它们)。

DDL:

--------------------------## Heading ##------------------------------
--  DDL for Table OP_MAIN_COLLECTIONS
--------------------------------------------------------

  CREATE TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" 
   (    "PRIMARY_KEY" NUMBER(*,0), 
    "CATEGORY" VARCHAR2(4000 CHAR), 
    "SUB_CATEGORY" VARCHAR2(4000 CHAR), 
    "NAME" VARCHAR2(4000 CHAR), 
    "SCHEDULE" CLOB, 
    "INTERNAL_NAME" VARCHAR2(4000 CHAR), 
    "COMMENTS" CLOB, 
    "START_DATE" DATE, 
    "END_DATE" DATE, 
    "SCHEDULED_OR_UNSCHEDULED" NUMBER(*,0)
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SCHEMA" 
 LOB ("SCHEDULE") STORE AS BASICFILE "SYS_LOB0000315099C00005$$"(
  TABLESPACE "SCHEMA" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) 
 LOB ("COMMENTS") STORE AS BASICFILE (
  TABLESPACE "SCHEMA" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) ;

   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."PRIMARY_KEY" IS 'PK as INT';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."CATEGORY" IS 'A Category will only display if the user has the proper rights/privledges to read it, as will all data within'' a category.';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."SUB_CATEGORY" IS 'Column (Variable) that allows for sub_categories to exist. Can be Null.';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."NAME" IS 'Name of Operation: Limited to 50 Characters atm';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."SCHEDULE" IS 'Schedule EX: "5AM - 11PM(ET), EVERY 30 MINUTES*, MON THRU SUN" (Can end up being rather large so made it a clob).';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."INTERNAL_NAME" IS 'Job_Name set to VarChar(120)';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."COMMENTS" IS 'Any job comments that may exist will be located here. May be rather large, so it was made a CLOB just incase.';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."START_DATE" IS 'Start Date variable that allows for Procedure to be hidden until date set.';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."END_DATE" IS 'End Date variable that allows for Procedure to be Removed once the date listed is reached.';
   COMMENT ON COLUMN "SCHEMA"."OP_MAIN_COLLECTIONS"."SCHEDULED_OR_UNSCHEDULED" IS 'Neccessary Information to determine whether or not the event has been scheduled or not. (Limited to a value of 0 or 1). - If 0, unscheduled | if 1, scheduled.';
--------------------------------------------------------
--  DDL for Index OP_SCHEDULED_PK
--------------------------------------------------------

  CREATE UNIQUE INDEX "SCHEMA"."OP_SCHEDULED_PK" ON "SCHEMA"."OP_MAIN_COLLECTIONS" ("PRIMARY_KEY") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SCHEMA" ;
  ALTER INDEX "SCHEMA"."OP_SCHEDULED_PK"  UNUSABLE;
--------------------------------------------------------
--  Constraints for Table OP_MAIN_COLLECTIONS
--------------------------------------------------------

  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" MODIFY ("SCHEDULED_OR_UNSCHEDULED" NOT NULL ENABLE);
  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" ADD CONSTRAINT "SCHEDULED_OR_UNSCHEDULED" CHECK (SCHEDULED_OR_UNSCHEDULED >= 0 AND SCHEDULED_OR_UNSCHEDULED < 2) ENABLE;
  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" ADD CONSTRAINT "OP_SCHEDULED_PK" PRIMARY KEY ("PRIMARY_KEY")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SCHEMA" 
  ALTER INDEX "SCHEMA"."OP_SCHEDULED_PK"  UNUSABLE; ENABLE;
  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" MODIFY ("COMMENTS" NOT NULL ENABLE);
  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" MODIFY ("INTERNAL_NAME" NOT NULL ENABLE);
  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" MODIFY ("SCHEDULE" NOT NULL ENABLE);
  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" MODIFY ("NAME" NOT NULL ENABLE);
  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" MODIFY ("CATEGORY" NOT NULL ENABLE);
  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" MODIFY ("PRIMARY_KEY" NOT NULL ENABLE);
--------------------------------------------------------
--  Ref Constraints for Table OP_MAIN_COLLECTIONS
--------------------------------------------------------

  ALTER TABLE "SCHEMA"."OP_MAIN_COLLECTIONS" ADD CONSTRAINT "CATEGORY" FOREIGN KEY ("PRIMARY_KEY")
      REFERENCES "SCHEMA"."OP_MAIN_COLLECTIONS" ("PRIMARY_KEY") ENABLE;
--------------------------------------------------------
--  DDL for Trigger AUD_UPDATE
--------------------------------------------------------

  CREATE OR REPLACE TRIGGER "SCHEMA"."AUD_UPDATE" 
after update on OP_MAIN_COLLECTIONS
for each row
begin
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'PRIMARY_KEY', :new.PRIMARY_KEY, :old.PRIMARY_KEY);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'CATEGORY', :new.CATEGORY, :old.CATEGORY);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'SUB_CATEGORY', :new.SUB_CATEGORY, :old.SUB_CATEGORY);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'NAME', :new.NAME, :old.NAME);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'SCHEDULE', :new.SCHEDULE, :old.SCHEDULE);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'INTERNAL_NAME', :new.INTERNAL_NAME, :old.INTERNAL_NAME);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'COMMENTS', :new.COMMENTS, :old.COMMENTS);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'START_DATE', :new.START_DATE, :old.START_DATE);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'END_DATE', :new.END_DATE, :old.END_DATE);
    AUDIT_PACKAGE.check_val( 'OP_MAIN_COLLECTIONS', 'SCHEDULED_OR_UNSCHEDULED', :new.SCHEDULED_OR_UNSCHEDULED, :old.SCHEDULED_OR_UNSCHEDULED);
end;
/
ALTER TRIGGER "SCHEMA"."AUD_UPDATE" ENABLE;

C#:

/*
* What we're trying to do:
* 
* First, determine whether or not the row(s) data for the Category column have data for the Sub_Category column or if the Category data contains the same values (names, EX: BillTrak Pro), then sort them accordingly.
** Sub_Categories should only Sync with their corresponding Categories, not all Categories.
* 
* 
* Conditionals for the Category data pertaining to Sub_Category(s):
** If no Sub_Category(s) exist for the WHOLE Category, then > Sub_Category_ComboBox should be set to read ONLY(IsEnabled = false) and the four ListView's should just display single Category Information.
* 
* 
** If Category(s) contain Sub_Category(s), then SubCategory_ComboBox should display only the Sub_Categories that are Sync'd to the specific Category(s).
* Row Data should be sorted, first by Category, then Sub_Category, then displayed only when their Sub_Category is displayed via the SubCategory_ComboBox.
* The four ListView's data should only display data, coresponding to the SubCategory_ComboBox data.
* 
*/


namespace WpfApplication1
{
public partial class MainWindow : Window
{
    public MainWindow()
    {

        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

WpfApplication1.DataSet1 dataSet1 = ((WpfApplication1.DataSet1)(this.FindResource("dataSet1")));
        // Load data into the table OP_MAIN_COLLECTIONS. You can modify this code as needed.
        WpfApplication1.DataSet1TableAdapters.OP_MAIN_COLLECTIONSTableAdapter dataSet1OP_MAIN_COLLECTIONSTableAdapter = new WpfApplication1.DataSet1TableAdapters.OP_MAIN_COLLECTIONSTableAdapter();
        dataSet1OP_MAIN_COLLECTIONSTableAdapter.Fill(dataSet1.OP_MAIN_COLLECTIONS);
        System.Windows.Data.CollectionViewSource oP_MAIN_COLLECTIONSViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("oP_MAIN_COLLECTIONSViewSource")));
        oP_MAIN_COLLECTIONSViewSource.View.MoveCurrentToFirst();
        WpfApplication1.DataSet2 dataSet2 = ((WpfApplication1.DataSet2)(this.FindResource("dataSet2")));
        // Load data into the table OP_TITLE_INFORMATION. You can modify this code as needed.
        WpfApplication1.DataSet2TableAdapters.OP_TITLE_INFORMATIONTableAdapter dataSet2OP_TITLE_INFORMATIONTableAdapter = new WpfApplication1.DataSet2TableAdapters.OP_TITLE_INFORMATIONTableAdapter();
        dataSet2OP_TITLE_INFORMATIONTableAdapter.Fill(dataSet2.OP_TITLE_INFORMATION);
        System.Windows.Data.CollectionViewSource oP_TITLE_INFORMATIONViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("oP_TITLE_INFORMATIONViewSource")));
        oP_TITLE_INFORMATIONViewSource.View.MoveCurrentToFirst();
        // Load data into the table OP_MAIN_COLLECTIONS. You can modify this code as needed.
        WpfApplication1.DataSet2TableAdapters.OP_MAIN_COLLECTIONSTableAdapter dataSet2OP_MAIN_COLLECTIONSTableAdapter = new WpfApplication1.DataSet2TableAdapters.OP_MAIN_COLLECTIONSTableAdapter();
        dataSet2OP_MAIN_COLLECTIONSTableAdapter.Fill(dataSet2.OP_MAIN_COLLECTIONS);
        System.Windows.Data.CollectionViewSource oP_MAIN_COLLECTIONSViewSource1 = ((System.Windows.Data.CollectionViewSource)(this.FindResource("oP_MAIN_COLLECTIONSViewSource1")));
        oP_MAIN_COLLECTIONSViewSource1.View.MoveCurrentToFirst();
    }

    /**
     * Operations Guide Name Display settings.
     */
    private void OPGuideName_textBox_TextChanged(object sender, TextChangedEventArgs e)
    {

    }

    /**
     * Category_ComboBox Display settings.
     */
    private void Category_ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        /**
         * TO-DO:
         * Determine whether or not the row(s) data for the Category column have data for the Sub_Category column
         * or if the Category data contains the same values (names, EX: BillTrak Pro), then sort them accordingly.
         */

        int id = 1; //Get form category combox
        WpfApplication1.DataSet2 DS = ((WpfApplication1.DataSet2)(this.FindResource("dataSet2")));

        var cats = DS.Tables[0].AsEnumerable().Select(r => new { Key = r.Field<int>("Primary_Key"), Category = r.Field<string>("Category") }).ToList();

        foreach( var cat in cats)
        {
            //Add category and primary key to combo box
            Category_ComboBox.Items.Add(new { cat.Key, cat.Category } );
        }

        DataRow row = DS.Tables[0].AsEnumerable().Where(r => r.Field<int>("Id") == id).FirstOrDefault();

        if (row != default(DataRow))
        {
            if (row["sub_category"] != DBNull.Value)
            {
                //There is a sub category
            }
            else
            {
                //sub category is null
            }
            }
            else
            {
                //selected category id does not exists
            }
    }


    /**
     * SubCategory_ComboBox Display settings.
     */
    private void SubCategory_ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        /**
         * Purpose:
         * Should convert SubCategory_ComboBox to readOnly(IsEnabled = false)
         * if the data contained in the SubCategory SQL Column is null && Category doesn't contain any Sub_Categories.
         * Else, display SubCategory_ComboBox as normal, sync'd with the corresponding category name.
         * 
         * Currently, This code disables the subcategory combobox completely.
         * Need to figure out how to get it to read ONLY the null data, not the entire column.
         */
        if (string.IsNullOrEmpty(SubCategory_ComboBox.Text))
        {
            SubCategory_ComboBox.IsEnabled = false;
        }
    }

    private void sCHEDULEListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

    }

}
}

【问题讨论】:

  • 你写sql有问题吗?或者,您已经以 datareader/dataset 的形式获取了数据,并且无法过滤?
  • SQL 已经写好了,现在,我想弄清楚如何过滤掉数据。根据,确定是否存在相同的类别名称以及如何处理子类别。 - 我假设这部分应该在 Visual Studio (C#) 中完成,而不是 SQL 数据库。
  • 能否请您发布sql查询和c#代码,以便其他成员可以查看并帮助您?
  • 这是您需要的吗? ^.^

标签: c# sql sql-server


【解决方案1】:

当您的Category_ComboBox_SelectionChanged 被触发时,请尝试以下模板以确定子类别是否存在。如果从用户输入中提供,您也可以检查名称。

var cats = DS.Tables[0].AsEnumerable().Select(r => new { Key = r.Field<int>("Primary_Key"), Category = r.Field<string>("Category") }).ToList();

        foreach( var cat in cats)
        {
            //Add category and primary key to combo box
            //combox.addItem(cat.Key, cat.Category)
        }

        int id = 1; //Get form category combox
        DataSet DS = new DataSet(); // your dataset


        DataRow row = DS.Tables[0].AsEnumerable().Where(r => r.Field<int>("Id") == id).FirstOrDefault();

        if (row != default(DataRow))
        {
            if (row["sub_category"] != DBNull.Value)
            {
                //There is a sub category
            }
            else
            {
                //sub category is null
            }
        }
        else
        {
            //selected category id does not exists
        }

希望对你有帮助!!

编辑

//find all categories and populate category
        IEnumerable<string> categories = DS.Tables[0].AsEnumerable().Select(r => r.Field<string>("Category")).Distinct();


        //once the value in category combobox change 

        // inside Category_ComboBox_SelectionChanged
        string category = "Bill";

        //get rows with non null sub categories
        IEnumerable<DataRow> rows = DS.Tables[0].AsEnumerable().Where(r => r.Field<string>("Category").ToLower() == category.ToLower() && r["Sub_Category"] != DBNull.Value);

        if (rows.Count() == 0)
        {
            //disable sub category
        }
        else 
        {
            //get sub categories
            IEnumerable<string> sub_cats = rows.Select(r => r.Field<string>("Sub_category")).Distinct();

            //populate sub categories
        }

编辑

使用此循环填充类别

foreach (DataRow row in DS.Tables[0].Rows)
        {
            int primary_key = row.Field<int>("Primary_Key");
            string category = row.Field<string>("Category");

            //populate the combo box
        }

【讨论】:

  • 好的,我将其设置为不可编辑/可编辑,具体取决于子类别是否存在。但是,我无法弄清楚如何让 Category / Sub_Category 组合框根据正在显示的数据同步和限制视图。 >应显示在 Sub_Category 组合框中的唯一数据应该是“Smith”和“Cat”,不是通过其他类别/行显示的其他子类别。 - 如果这有意义的话。 o.O - 用我目前所拥有的内容更新了我的主要帖子。
  • 您更新的代码不起作用。我以为你是按 Id 而不是类别名称搜索,抱歉。我已经更新了答案,这将帮助您启用/禁用子类别框以及类别和子类别之间的同步。
  • 实现版本时,把“SubCategory_ComboBox.IsEnabled = false;”在 if(rows.count() ==0) 中,将在 GUI 启动时禁用所有内容,并且对于每个选项都保持这种状态,无论是否列出了 sub_Category |如果我把它放在 else 部分,它不会在启动时禁用它,但是选择的任何选项都会无限期地禁用 sub_category 框。我目前在主帖中的方式将正确禁用和取消禁用,但这是向后的逻辑。哈哈。有点难住了。
  • 上面的代码只是解释了如何在类别和子类别之间进行同步。我相信,您可以使用不同的代码块来显示初始 GUI。如果一个初始显示,没有选择类别,则子类别将被禁用。如果选择了一个类别,那么您将再次运行上述代码以显示子类别。在上述其他情况下,您必须启用 sub_category 框。
  • 用我目前拥有的内容编辑了最初的帖子。现在,它的工作似乎与我正在尝试做的禁用部分一样,但看起来代码本身的工作方式与它应该做的相反。
猜你喜欢
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
相关资源
最近更新 更多